杨季文 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,与计算器结果一致。
时间: 2024-10-09 22:37:30