| 
 | 
 
 
发表于 2019-2-15 23:35:09
|
显示全部楼层
 
 
 
 本帖最后由 jackz007 于 2019-2-16 11:44 编辑  
 
      做除法的时候,由于 dx 不为 0 导致溢出,只要略加修改便可解决问题: 
 
     - assume cs:codesg, ds:datasg, ss:stacksg
 
 - datasg segment
 
 -     db '1975' , '1976' , '1977' , '1978'
 
 -     dd     16 ,     22 ,    382 ,   1356
 
 -     dw      3 ,      7 ,      9 ,     13
 
 - datasg ends
 
 - stacksg segment
 
 -     dw 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
 
 - stacksg ends
 
 - table segment
 
 -     db 4 dup('year summ ne ?? ')
 
 - table ends
 
 - codesg segment
 
 - start: mov ax , datasg
 
 -        mov ds , ax
 
 -        mov ax , stacksg
 
 -        mov ss , ax
 
 -        mov sp , 16
 
 -        mov ax , table
 
 -        mov es , ax
 
 -        ; 读入年份,bx 表示哪一列的偏址,si表示数据段的偏址,di表示目标表格里行造成的偏址
 
 -        mov bx , 0
 
 -        mov si , 0
 
 -        mov cx , 4
 
 -     s0:mov ax , si
 
 -        mov di , 4
 
 -        mul di
 
 -        mov di , ax
 
 -        mov al , ds:[bx+si+0]
 
 -        mov es:[bx+di+0] , al
 
 -        mov al , ds:[bx+si+1]
 
 -        mov es:[bx+di+1] , al
 
 -        mov al , ds:[bx+si+2]
 
 -        mov es:[bx+di+2] , al
 
 -        mov al , ds:[bx+si+3]
 
 -        mov es:[bx+di+3] , al
 
 -        mov al , 20h
 
 -        mov es:[bx+di+4] , al
 
 -        add si , 4
 
 -        loop s0
 
 -        ; 读入收入
 
 -        add bx , 5
 
 -        mov si , 0
 
 -        mov cx , 4
 
 -     s1:mov ax , si
 
 -        cwd                      ; 新增此句,防止做除法时 dx 不为零
 
 -        mov di , 4
 
 -        div di
 
 -        mov di , 10H
 
 -        mul di
 
 -        mov di , ax
 
 -        mov ax , ds:[si+16]
 
 -        mov es:[bx+di+0] , ax
 
 -        mov dx , ds:[si+18]
 
 -        mov es:[bx+di+2] , dx
 
 -        add si , 4
 
 -        loop s1
 
 -        ; 读入雇员数
 
 -        add bx , 5
 
 -        mov si , 0
 
 -        mov cx , 4
 
 -     s2:mov ax , si
 
 -        cwd                      ; 新增此句,防止做除法时 dx 不为零
 
 -        mov di , 2
 
 -        div di
 
 -        mov di , 10H
 
 -        mul di
 
 -        mov di , ax
 
 -        mov ax , ds:[si+32]
 
 -        mov es:[bx+di+0] , ax
 
 -        add si , 2
 
 -        loop s2
 
 -        ; 计算人均收入 = 收入 / 雇员数
 
 -        add bx , 3
 
 -        mov si , 0
 
 -        mov bp , 0        
 
 -        mov cx , 4
 
 -     s3:mov ax , si
 
 -        cwd                      ; 新增此句,防止做除法时 dx 不为零
 
 -        mov di , 4
 
 -        div di                   ; 除法溢出发生点,原因,做除法时 dx 不为零
 
 -        mov di , 10H
 
 -        mul di
 
 -        mov di , ax
 
 -        mov ax , ds:[si+16]
 
 -        mov dx , ds:[si+18]
 
 -        div word ptr ds:[bp+32]  ; 16 位除法,ax 保存商,dx 保存余数,如果不能整除,即埋下后续 div 运算溢出隐患       
 
 -        mov es:[bx+di+0] , ax
 
 -        add si , 4
 
 -        add bp , 2
 
 -        loop s3
 
 -        mov ax , 4c00h
 
 -        int 21h
 
 - codesg ends
 
 - end start
 
  复制代码 |   
 
 
 
 |