当前位置: 代码迷 >> 汇编语言 >> 请大神审阅下这个实验代码解决办法
  详细解决方案

请大神审阅下这个实验代码解决办法

热度:156   发布时间:2016-05-02 04:36:27.0
请大神审阅下这个实验代码
王爽  《汇编语言》实验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段的最后一组数据的方法嗯 很有味道 哈哈
  相关解决方案