Bt、先锋 发表于 2012-1-18 21:27:45

溢出问题

assume cs:codesg
codesg segment
start:
    mov ax,7fffh
    mov cl,0eh
    div byte ptr cl
    mov ax,4c00h
    int 21h
codesg ends
end start
这段代码能运行 , 但得不出结果 , 是不是因为商为924h , al不能完全存储?若是,这种问题怎么解决?如果解决的方法仅是把被除数放在32位上,那么商是超过16位的数又该怎么解决?????????????



仰望天上的光 发表于 2012-1-18 21:27:46

运行出错就是因为al不能完全存储商。一个通用的解决办法,你可以看王爽教材里面的某个课程设计(忘了是哪个了)。

事事如意 发表于 2012-1-19 17:35:29

对于这个知识我也有些遗忘了,我回去好好再重习一下。暂时这里有我个建议,
你可以把div byte ptr cl改写为 div word ptr cx   相应前面的指令mov cl,0eh改写为mov cx,0eh再试试
结果用到两个寄存器,ax 与 dx 它们两个有一个是商的高16位,一个是存商的低16位。
确定答案,我会在我重新复习之后,再给答复。实际答案,小甲鱼老师在课程里已经告诉我们了。这关系到8位除法与16位除法的问题。

Bt、先锋 发表于 2012-1-20 14:51:51

事事如意 发表于 2012-1-19 17:35 static/image/common/back.gif
对于这个知识我也有些遗忘了,我回去好好再重习一下。暂时这里有我个建议,
你可以把div byte ptr cl改写 ...

朋友,改掉之后的商存在ax里,余数存放在dx里的吧?的确,这个问题可以这样解决,但碰上一个商超过16位的情况呢,那样ax就不能将其储蓄了,该怎么办啊???????????

Push 发表于 2012-1-21 04:04:06

怎么超哦...被除数FFFFH够大了吧?那除数1够小了吧?商FFFFH够大了吧?咋超?ax寄存器好像只有16位啊...
额,个人看法,也许我很菜~~~

事事如意 发表于 2012-1-21 11:21:50

除法分为八位除法与十六位除法
你以上的做法,会出现除法溢出,因此不能用八位除法,因此也就不能用cl来存储除数,要用cx,这样计算机才会采用十位的除法来进行对其运算。十六位除法得出的商放在ax 寄存器中,余数放在dx中。因此程序应该这样写:
assume cs:codesegment
codesegment segment
start:
       mov ax,7fffh
       mov cx,oeh
       div cx
      mov ax,4c00h
      int 21h
codesegment ends
end start
注意商是放在ax中的,但如是高是超过16位的数,就会产生进位,通过标志寄存器可以看到。好像是标志寄存器CF位吧,忘记那个位了。汇编后面有讲的,你再看看。
      

事事如意 发表于 2012-1-21 11:42:50

Push 发表于 2012-1-21 04:04 static/image/common/back.gif
怎么超哦...被除数FFFFH够大了吧?那除数1够小了吧?商FFFFH够大了吧?咋超?ax寄存器好像只有16位啊...
额 ...

我不是说过有进位标志寄存器吗,到那里面去了。通过进位寄存器你就知道了。

独立日 发表于 2012-1-21 11:49:39

小甲鱼实验十详细讲了。自己看看吧

Push 发表于 2012-1-21 13:08:37

事事如意 发表于 2012-1-21 11:42 static/image/common/back.gif
我不是说过有进位标志寄存器吗,到那里面去了。通过进位寄存器你就知道了。

进位的就扔到CF去啊..好像这个不用我们来操心吧.

Push 发表于 2012-1-22 19:48:41

我想到了...是你需要用到一个16位通用寄存器作为中介...那这样就不会出现越界的行为了...小甲鱼的汇编27课中有提到

bafengao 发表于 2012-1-22 20:55:02

学习 学习 学习

e马先森 发表于 2017-2-17 10:32:16

据说可以看教程{:10_254:}
页: [1]
查看完整版本: 溢出问题