NASM 汇编数理逻辑

NASM Assembly mathematical logic

我有一个针对 Linux 终端的汇编程序,它应该通过一系列数学运算来工作,将最终值与 20 进行比较,然后使用 if 逻辑,报告 <、> 或 = 关系.代码是:

segment .data

out_less     db "Z is less than 20.", 10, 0
out_greater  db "Z is greater than 20.", 10, 0
out_equal    db "Z is equal to 20.", 10, 0

segment .bss

segment .text

global main
extern printf

main:

    mov    eax, 10
    mov    ebx, 12
    mov    ecx, eax
    add    ecx, ebx    ;set c (ecx reserved)

    mov    eax, 3
    mov    ebx, ecx
    sub    ebx, eax    ;set f (ebx reserved)

    mov    eax, 12
    mul    ecx
    add    ecx, 10     ;(a+b*c) (ecx reserved)

    mov    eax, 6
    mul    ebx
    mov    eax, 3
    sub    eax, ebx
    mov    ebx, eax    ;(d-e*f) (ebx reserved) reassign to ebx to free eax

    mov    eax, ecx
    div    ebx
    add    ecx, 1      ;(a+b*c)/(d-e*f) + 1

    cmp    ecx, 20
    jl     less
    jg     greater
    je     equal

    mov    eax, 0
    ret

less:

    push    out_less
    call    printf
    jmp     end

greater:

    push    out_greater
    call    printf
    jmp     end

equal:

    push    out_equal
    call    printf
    jmp     end

end:

    mov     eax, 0
    ret

使用 nasm 和 gcc 在终端中编译的命令:

nasm -f elf iftest.asm
gcc -o iftest iftest.o
./iftest

等效的 C 代码为:

main() {
    int a, b, c, d, e, f, z;
    a = 10;
    b = 12;
    c = a + b;
    d = 3;
    e = 6;
    f = c - d;
    z = ((a + b*c) / (d - e*f)) + 1;

    if (z < 20) {
        printf("Z (%d) is less than 20.\n", z);
    }
    else if (z > 20) {
        printf("Z is greater than 20.\n");
    }
    else {
        printf("Z is equal to 20.\n");
    }
}    

当前输出不正确。 C 代码将报告 z = -1,因此小于 20,但汇编代码输出 Z is greater than 20. 我已经尝试打印出最终值,但我 运行 进入这个打印价值以某种方式改变了它。我检查并重新检查了数学逻辑,但我不明白为什么它不应该给出正确的值,除非我错误地使用了数学运算符。感谢任何帮助。

我认为问题出在这里:

div    ebx
add    ecx, 1      ;(a+b*c)/(d-e*f) + 1

div指令的结果不在ecx中。