汇编语言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 位运算指令 )