鱼C论坛

 找回密码
 立即注册
查看: 1912|回复: 2

[已解决]实验7遇到的divide overflow 除法溢出问题

[复制链接]
发表于 2022-3-1 23:16:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
assume cs:codesg
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988','1989','1992','1991','1992','1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,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,11542,14430,15257,17800
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
ls segment
db 0,0
ls ends
codesg segment
start:
mov ax,data ;将年份存储地址段变为DS段
mov ds,ax
mov ax,table ;将最后存储的地址段设为ES段
mov es,ax
mov ax,ls  ;用来存储年份循环的次数和存储的次数
mov ss,ax
mov sp,2
mov cx,21 ;总共需要21次数据存储
mov bx,0
mov di,0
s:
push cx  ;将每一次存储YEAR summ ne ??后的剩余的循环次数入栈
push di   ;将存储了多少位入栈
mov cx,4  ;读取年份需要的次数
mov di,0
s0:
mov si,0
mov al,[bx+si]  ;年份的四个数存储在四个字节,每一位占一个字节
mov byte ptr es:[bx+di],al ;将读取的每 一位年份数字依次存储在TABLE字段
inc si
add di,16  ;存储的字段共16个字节
loop s0
mov cx,2 ;收入为2个字单元,一次读取一个字,所以循环两次
mov si,0
mov di,0
s1:
mov ax,[bx+si+84]  ;年份占的空间为21*4个字节,所以加上84
mov word ptr es:[bx+di+5],ax  ;存储的地址在第五个字节
add si,2 ;占用一个字单元
add di,16 ;存储的字段共16个字节
loop s1
pop di ;将完整存储一次的次数后的位数出栈
pop cx ;将循环次数出栈
mov ax,[bx+168] ;年份占84字节,工资占84字节
mov word ptr es:[bx+di+11],ax ;将雇员数存储到ee
mov ax,es:[bx+di+5] ;将工资的低位存到AX
mov dx,es:[bx+di+7] ;将工资的高位存到DX
div word ptr [bx+di+11] ;计算平均工资
mov word ptr es:[bx+di+13],ax ;将商存到??
add di,16
inc bx
loop s
mov ax,4c00h
int 21h
codesg ends
end start
*******************************************************************
运行到这里就跳出除法溢出错误是咋回事
assume cs:codesg
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985','1986','1987','1988','1989','1992','1991','1992','1993','1994','1995'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514,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,11542,14430,15257,17800
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
ls segment
db 0,0
ls ends
codesg segment
start:
mov ax,data ;将年份存储地址段变为DS段
mov ds,ax
mov ax,table ;将最后存储的地址段设为ES段
mov es,ax
mov ax,ls  ;用来存储年份循环的次数和存储的次数
mov ss,ax
mov sp,2
mov cx,21 ;总共需要21次数据存储
最佳答案
2022-3-4 16:11:54
ls segment
db 0,0
ls ends
是你的堆栈吧
你看看你堆栈多大,能压进去几个寄存器数值
push cx你已经占满了堆栈了
push di就溢出了
s0:
mov si,0
mov al,[bx+si]  ;年份的四个数存储在四个字节,每一位占一个字节
mov byte ptr es:[bx+di],al ;将读取的每 一位年份数字依次存储在TABLE字段
inc si
你循坏s0时 你si永远为0,取得都是偏移0位置的数值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-4 16:11:54 | 显示全部楼层    本楼为最佳答案   
ls segment
db 0,0
ls ends
是你的堆栈吧
你看看你堆栈多大,能压进去几个寄存器数值
push cx你已经占满了堆栈了
push di就溢出了
s0:
mov si,0
mov al,[bx+si]  ;年份的四个数存储在四个字节,每一位占一个字节
mov byte ptr es:[bx+di],al ;将读取的每 一位年份数字依次存储在TABLE字段
inc si
你循坏s0时 你si永远为0,取得都是偏移0位置的数值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-3-5 21:07:50 | 显示全部楼层
publicwhore 发表于 2022-3-4 16:11
ls segment
db 0,0
ls ends

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-3 16:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表