汇编语言DIV指令相关

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言DIV指令相关相关的知识,希望对你有一定的参考价值。

assume cs:code

data segment
dw 80,0,20,0,0,0,0,0
data ends

code segment
start:mov ax,data
mov ds,ax

mov bx,0
mov dx,[bx]
mov ax,[bx+2]
div word ptr [bx+4]
mov [bx+6],ax

mov ax,4c00h
int 21h
code ends

end start
以上程序
win7 64位系统上用dosbox运行debug测试的时候,运行到div指令时直接没反应了是怎么回事呢

CPU 执行除法指令(如:DIV  CX、DIV  BL)时,是有可能溢出的。

如果被除数较大,或除数较小,都可能使“商”超出预定位数,此时,就会溢出。

特别是当除数为零时,必然会出现:Divide  overflow。

直接使用 DIV 指令,有一定的风险,一不小心就溢出了。

特别是数字不明确的时候。

因此,在执行 DIV 指令之前,应该加以判断,以免发生溢出。

一般来说,当被除数的高位,小于除数时,就不会发生“溢出”。

如果高位为零,即 DX = 0 或 AH = 0,这就肯定不会溢出。

-----------------------

较好的方法是:编写一个“不会溢出”的除法程序。

方法思路如下:

左图是 CPU 执行 16 位数除以 8 位数时的操作。

在右图中,

被除数:1A 2B 3C 4DH,有 32 位数。

除数是:BL,仅有 8 位数。

商,是:32 位数。

按照图中的步骤,需要执行四次 DIV  BL。

只要 BL 不为零,就绝对不会发生溢出。

按此思路,被除数的字节数,可以继续增加,仅受制于内存的大小。

这就是说:被除数,可以认为是无限的。

绝不限于王爽所介绍的 DIVDW 所用的四个字节。

参考技术A 除法溢出了吧?

你看一下运算的时候 ax dx cx 分别是多少追问

div 指令和cx有关联的么
我刚学,只知道和ax,dx有关
请问cx中的数据被div指令看待为什么呢

追答

不好意思 说错了 div 只和 ax dx 和除数的 size 有关系。你的问题有可能是除法溢出导致的

除数B有 8位和16位两种,保存在一个reg寄存器里 或是内存单元中。

被除数A 默认存放在AX中(16位以内) 或 AX和DX中(32位,DX存放高16位,AX存放低16位)

结果: 如果除数B是8位,那么除法的结果AL保存商,AH保存余数,
如果除数B是16位,那么除法的结果 AX保存商,DX保存余数。

举例说明:
100001 / 100
100001的16进制是186A1H,这个被除数大于16位,所以要用32位来存储,DX存放高16位 0001,AX存放低16位 86A1H, 除数100可以存放在8位和16位都可以,但是如果除数100存放在8位中,因为上面说了,除数8位的话,运算的结果就会把商放入到AL中,AH保存余数。100001/100的商是1000余数是1 ,1000根本无法保存到AL中(AL最多保存255),所以必须将100保存到16位中
代码如下:
assume cs:code
code segment
mov dx,1
mov ax,86a1h
mov bx,100
div bx
code ends
end
运行结果AX:03E8 (商) DX:0001 余数

如果将上面的 mov bx,100 div bx 改位 mov bl,100 div bl 运行后会报错"DIVED OVERFLOW" 也就除法结果溢出错误。

本回答被提问者采纳

以上是关于汇编语言DIV指令相关的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向x86 汇编 ( add / sub / mul / div 数值运算指令 | xor / not / sal / sar / shl / shr 位运算指令 )

Android 逆向x86 汇编 ( add / sub / mul / div 数值运算指令 | xor / not / sal / sar / shl / shr 位运算指令 )

汇编指令学习(ADD,SUB,MUL,DIV,XADD,INC,DEC,NEG)

实用汇编指令

汇编语言 除法指令

汇编实验9