INCLUDE Irvine32.inc
INCLUDELIB Irvine32.lib
INCLUDELIB kernel32.lib
INCLUDELIB user32.lib
.data
A SBYTE 10d ; A is an 8-bit signed integer
B SBYTE 2d ; B is an 8-bit signed integer
cc SBYTE 20d ; C is an 8-bit signed integer
D SBYTE 5d ; D is an 8-bit signed integer
.code
main PROC
mov EAX, 0
mov EDX, 0
mov al, A ; Load A into AL register
imul B
movsx bx, cc
imul bx
movsx bx, D
imul bx
call DumpRegs ;
exit
main ENDP
END main
我有这段代码,我想修改它以打印 (A % B) % (C % D) 的输出,但是当我使用
idiv
时,代码没有给出任何输出。
mov al, A ; Load A into AL register imul B movsx bx, cc imul bx movsx bx, D imul bx
此代码计算
A * B * cc * D
,只需将 4 个数字相乘即可。
但是当我使用
时,代码没有给出任何输出。idiv
您不能只是替换该指令:
imul
输出到AH / DX / EDX / RDX,其中idiv
从AH / DX / EDX / RDX输入。您需要从头开始开发新的解决方案。
此任务的解决方案不仅必须使用除法指令,还必须遵守括号所示的代数顺序。
虽然这 4 个变量被定义为有符号整数,但我看到它们的值都是正数。因此,我将提出一个使用 div
指令的解决方案。我不想失去乐趣,所以我将把签名版本留给你......
.data
A BYTE 10
B BYTE 2
C BYTE 20
D BYTE 5
.code
main PROC
; (C % D)
movzx ebx, D
test bl, bl
jz ERROR ; #DE can't divide by zero
movzx eax, C
xor edx, edx
div ebx ; EDX:EAX / EBX --> EDX is remainder
test edx, edx
jz ERROR ; #DE can't divide by zero (*)
mov ecx, edx
; (A % B)
movzx ebx, B
test bl, bl
jz ERROR ; #DE can't divide by zero
movzx eax, A
xor edx, edx
div ebx ; EDX:EAX / EBX --> EDX is remainder
; (A % B) % (C % D)
mov eax, edx
xor edx, edx
div ecx ; EDX:EAX / ECX --> EDX is remainder
; Result is in EDX
使用当前数据集,程序会在星号处出错!