转自:点击打开链接
杨季文 80X86汇编语言程序 P352,子程序 DIVX ,使用移位和减法进行除法运算,
尝试举例验证之。
程序如下:
;子程序名:DIVX
;功 能:64 位数除以32 位数,商用64 位表示
;入口参数:EDX:EAX=被除数
; EBX=除数
;出口参数:EDX:EAX=商
; EBX=余数
DIVX PROC NEAR
PUSH ECX
PUSH ESI
MOV CX, 54
XOR ESI, ESI
DIV1: SHL EAX, 1 ;这3 句代码相当于把ESI,EDX,EAX
RCL EDX, 1 ;作为1 个整体向左移位
RCL ESI, 1
JC SHORT DIVX2
CMP ESI, EBX
JB SHORT DIVX3
DIVX2: SUB ESI, EBX
BTS AX, 0
DIVX3: LOOP DIVX1
MOV EBX, ESI
POP ESI
POP ECX
RET
DIVX ENDP
下面以实例跟踪验证之。
为简单,假设有寄存器,AX、BX、CX、DX、SI 都是8 bit 寄存器
CF SI DX AX CX
0 00000000 10100111 01011110 16(LOOP前)
BX
11011001
即 dx:ax=A75E,被除数 bx=D9,以计算器算之,商=C5,余数=61
根据算法,循环8 次后,
CF SI DX AX CX
0 10100111 01011110 00000000 08(LOOP前)
BX
11011001
再左移 1 bit
CF SI DX AX CX
1 01001110 10111100 00000000 08(LOOP前)
BX
11011001
执行 SUB SI, BX, BTS AX, 0
CF SI DX AX CX
0 01110101 10111100 00000001 08(LOOP前)
BX
11011001
再左移1 bit
CF SI DX AX CX
0 11101011 01111000 00000010 07(LOOP前)
BX
11011001
执行 SUB SI, BX, BTS AX, 0
CF SI DX AX CX
0 00010010 01111000 00000011 07(LOOP前)
BX
11011001
再左移4 bit
CF SI DX AX CX
1 00100111 10000000 00110000 03(LOOP前)
BX
11011001
执行 SUB SI, BX, BTS AX, 0
CF SI DX AX CX
0 01001110 10000000 00110001 03(LOOP前)
BX
11011001
再左移1 bit
CF SI DX AX CX
0 10011101 00000000 01100010 02(LOOP前)
BX
11011001
再左移1 bit
CF SI DX AX CX
1 00111010 00000000 11000100 01(LOOP前)
BX
11011001
执行 SUB SI, BX, BTS AX, 0
CF SI DX AX CX
1 01100001 00000000 11000101 01(LOOP前)
BX
11011001
到此结束,可以看出,SI 中余数是 61H,DX:AX=0C5H,与计算器结果一致。