|
发表于 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
复制代码 |
|