王爽 《汇编语言》实验7
assume cs:codesg
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,5659000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635
dw 8226,11542,14430,15257,17800
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
codesg segment
start:
mov ax,data
mov es,ax
mov ax,table
mov ds,ax
mov si,0
mov cx,21
mov bp,168
s:mov bx,0 ;以一个循环改写一行
mov ax,es:[bx+si] ;bx记录需要填写的内存地址
mov ds:[bx],ax
add bx,2
mov ax,es:[bx+si]
mov ds:[bx],ax
mov al,' '
add bx,2
mov ds:[bx],al
mov ax,es:[si+84]
inc bx
mov ds:[bx],ax
add bx,2
mov ax,es:[si+86]
add bx,2
mov ds:[bx],ax
inc bx
mov al,' '
mov ds:[bx],al
inc bx
mov ax,es:[bp+si]
mov ds:[bx],ax
add bx,2
mov ds:[bx],al
mov dx,ds:[5]
mov ax,ds:[7]
div word ptr ds:[10]
inc bx
mov ds:[bx],ax
mov al,' '
add bx,2
mov ds:[bx],al
mov ax,ds
inc ax
mov ds,ax
add si,4
sub bp,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
debug后就年份能全部按要求改变 其他的似乎都没啥变化
------解决方案--------------------
assume cs:codesg
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,5659000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635
dw 8226,11542,14430,15257,17800
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
codesg segment
start:
mov ax,data
mov es,ax
mov ax,table
mov ds,ax
mov si,0
mov cx,21
mov bp,168
s:mov bx,0 ;以一个循环改写一行
mov ax,es:[bx+si] ;bx记录需要填写的内存地址
mov ds:[bx],ax
add bx,2
mov ax,es:[bx+si]
mov ds:[bx],ax
add bx,3;dup(‘year summ ne ?? ’)year后边本就是空格不用重新写入了,直接加3就好后面也是这样
mov ax,es:[si+84]
mov ds:[bx],ax
add bx,2
mov ax,es:[si+86]
mov ds:[bx],ax
add bx,3
mov ax,es:[bp+si]
mov ds:[bx],ax
mov dx,ds:[7];低地址存放的是收入的低16位你放反了
mov ax,ds:[5]
mov di,ds:[10]
call deal_divover;由于有的商高于ax所能存储的最大值65536结果产生溢出引发出发溢出中断所以这儿需要一个不会溢出的除法子程序来处理
add bx,3
mov ds:[bx],ax;由于结果较大此时ds:[bx]中保存的是商的低16位
mov ax,ds
inc ax
mov ds,ax
add si,4
sub bp,2
loop s
mov ax,4c00h
int 21h
deal_divover:
;传入参数(dx)=被除数的高16位 (ax)=被除数的低16位 (di)=16位的除数
push bx ;返回(dx)=商的高16位(ax)=商的低16位(di)=余数
push ax
mov ax,dx
xor dx,dx
div di
mov bx,ax
pop ax
div di
mov di,dx
mov dx,bx
pop bx
ret
codesg ends
end start
你的代码主要出问题就在对于已经有了空格的地方还要重新写入一遍导致bx的位置出错,还有就是除法溢出的问题单步调试的
话除法溢出不解决是调试不下去的 呃 你最后重定位table段和data段的最后一组数据的方法嗯 很有味道 哈哈