在完成王爽老师汇编语言的实验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