[英]Factorial function in x86 NASM assembly goes wrong
我正在使用 x86 NASM 学习汇编语言。 我想编写一个简单的递归阶乘函数,我使用 EAX 寄存器向它传递一个参数。 之后,我想在屏幕上打印我的结果,但没有任何反应。 坐下来盯着我的电脑后,我不知道我的代码有什么问题。 你们能帮助新手解决这个问题吗?
我知道阶乘函数的序言和结尾不是必需的,因为我没有使用堆栈,但对我来说代码更具可读性;)
这是我的代码:
global main
extern printf
section .data
message db "%03X", 0x10, 0x0
section .text
main:
mov eax, 5
call factorial
push eax
push message
call printf
add esp, 0x8
mov eax, 1
mov ebx, 0
int 0x80
factorial:
push ebp
push edx
mov ebp, esp
mov edx, eax
cmp edx, 0
jne not_equal_zero
mov eax, 1
jmp exit
not_equal_zero:
mov eax, edx
sub eax, 1
call factorial
imul eax, edx
exit:
mov esp, ebp
pop edx
pop ebp
ret
C 库 - 我猜你使用的是 GCC 中的库 - 不会立即输出printf
的结果。 相反,它存储在称为缓冲区的单独存储器中并偶然输出。 在这种情况下,程序将以int 0x80/eax=1
结束,而不是刷新缓冲区。 您可以插入手动冲洗:
...
extern fflush
...
push 0
call fflush
add esp, 4
...
最好的解决方案是使用 C exit
函数。 代替
mov ebx,0
mov eax,1
int 0x80
经过
push 0
call exit
或简单地替换它
ret
在这种情况下,您不需要手动刷新缓冲区。 这将exit
或者ret
为你做。
顺便说一句:LF(换行)被编码为十进制10 和十六进制 0x0A。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.