
DIV命令:
32位的被除数在DX:AX中,DX为高位字 16位除数为源 *** 作数,结果的16位商在AX中,16位余数在DX中。
(AX)<-(DX, AX)/(SRC)的商
(DX)<-(DX, AX)/(SRC)的余数
这里产生一个问题:16位数最大表示数值为:65535,而如果一个超过16位的被除数,除以1,数学结果应该是商放在AX中,但很显然,余数超出了AX的表达范围,产生了溢出。
所以,解决这个问题,就需要我们设计数学算法。
1个数,可以以一个比例,分解为高位与低位,比如:
1623,我们以100为比例,可以分隔为高位(16),与低位(23),那么做除法方式呢?假设除以10
16/10 = 1 余6
(6*100 + 23)/10 = 62 余3
1* 100 + 62 = 162 (商)
所结果就是1623/10 = 162 余 3 ,这明显计算正确。总结一下:
假定被除数X的高位部分H,低位部分L,除数N,而比例我们则取16位寄存器的进位值 2^16=65536,我们用D表示。
所以,算法表示为:X/N = int(H/N) * D + [rem(H/N)*D + L]/N
int表示数的整数部分,rem表示数的余数部分。
根据这个算法,我们就可以编写一个不产生溢出的汇编除法程序了。
可以参照 我的附件caldiv.asm中的实际。
-----------------------------------------------------------------
写完上面部分,才发现我好像偏题了。你是想要一个汇编写的除法程序做例子吧,而不是想知道如何做汇编不产生溢出的除法。
简单点写:code segment
assume cs:code
start:
mov ax, 0ABCDH
mov bx, 15
xor dx, dx 做0ABCDH/15的除法 *** 作, 16位
div bx 商在ax中,余数在dx中
处理 ax的代码
处理 dx的代码,这里全留空了。
除法2, 8位
mov al, 88
mov ah,0
mov cl, 3
div cl (ax)/(cl) ,商在al中,余数在ah中,然后再对计算结果进行处理。
mov ah,4ch
int 21h
code ends
end start
汇编语言的DIV指令是除法指令A / B A是被除数,B是除数
除数B有 8位和16位两种,保存在一个reg寄存器里 或是内存单元中。
被除数A 默认存放在AX中(16位以内) 或 AX和DX中(32位,DX存放高16位,AX存放低16位)
结果: 如果除数B是8位,那么除法的结果AL保存商,AH保存余数,
如果除数B是16位,那么除法的结果 AX保存商,DX保存余数。
assume cs:code
code segment
mov ax,64h //也可以写成mov ax,100
mov bx,10
div bx
code ends
end
此例子的被除数放在AX中,这里被除数是100,除数是10.
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)