汇编语言第8章实验7的四个illegal use of register

            在完成王爽老师汇编语言的实验7的时候,我自己的思路是先导入年份,循环;在导入收入,循环;再导入雇员数,循环;
                在这之中,利用程序中入栈的si和di来定位收入和人数的位置,再用si和di计算平均收入,导入并循环。
                思路应该是没有问题的,但是编译的时候系统提示有很多错误。在一遍遍的修改之后还是有四个错误提示:
                99,100,102,104都有一个illegal use of register
                第一次编写这种复杂的程序真的要被逼疯了,求大佬指点一下寄存器到底哪里用错了。
                代码如下:

accume cs:codesg;ds:table,ss:stacksg,es:data
data segment

db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982', '1983'

db '1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992'

db '1993', '1994', '1995'

    dd    16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514   
    dd    345980, 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000   

dw    3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226   
dw    11542, 14430, 15257, 17800   

data ends

table segment

db 21 dup ('year summ ne ?? ')

table ends

stacksg segment
dw 8 dup (0)
stacksg ends

codesg segment
start: mov ax,table ;年份
mov ds,ax

mov ax,data
mov es,ax

mov bx,0
mov cx,21
mov di,0

s0: mov bp,cx
mov cx,4
mov si,0

s: mov dl,es:[di]
mov byte ptr [bx+si],dl
inc si
inc di
loop s

add bx,16
mov cx,bp
loop s0

mov bx,5                                      ;收入
mov cx,21

mov ax,stacksg                             ;建个栈
mov ss,ax
mov sp,16
push di

s1: mov bp,cx
mov cx,4
mov si,0

s2: mov dl,es:[di]
mov byte ptr [bx+si],dl
inc si
inc di
loop s2

add bx,16
mov cx,bp
loop s1

mov bx,0Ah                                    ;雇员数
mov cx,21

push di

s3: mov bp,cx
mov cx,2
mov si,0

s4: mov dl,es:[di]
mov byte ptr [bx+si],dl
inc si
inc di
loop s4

add bx,16
mov cx,bp
loop s3

mov bx,0dh                                     ;人均收入
mov cx,21

pop di
pop si

s5: mov word ptr ax,es:[si]
mov word ptr dx,es:[si+2]

mov word ptr bp,es:[di]

div word ptr bp

mov [bx],ax

add si,4
add di,2
add bx,16

loop s5

mov ax,4c00h
int 21h

codesg ends
end start

https://blog.csdn.net/grantxx/article/details/7672780