在装配中对此进行评估 (A % B) % (C % D)

问题描述 投票:0回答:1
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
时,代码没有给出任何输出。

assembly x86 expression division
1个回答
0
投票
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

使用当前数据集,程序会在星号处出错!

© www.soinside.com 2019 - 2024. All rights reserved.