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
中。
我有一个针对 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
中。