NASM汇编数学逻辑

我有一个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 ;(de*f) (ebx reserved) reassign to ebx to free eax mov eax, ecx div ebx add ecx, 1 ;(a+b*c)/(de*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 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)/(de*f) + 1 

div指令的结果不在ecx