gpt4 book ai didi

ubuntu - x86 NASM 程序集中的阶乘函数出错

转载 作者:行者123 更新时间:2023-12-04 18:44:31 25 4
gpt4 key购买 nike

我正在使用 x86 NASM 学习汇编语言。我想编写一个简单的递归阶乘函数,我使用 EAX 寄存器向其传递一个参数。之后,我想在屏幕上打印我的结果,但没有任何 react 。坐下来盯着我的电脑后,我不知道我的代码有什么问题。你们能帮助新手解决这个问题吗?

我知道阶乘函数的序言和尾声不是必需的,因为我没有使用堆栈,但对我来说代码更具可读性;)

这是我的代码:

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

在这种情况下,您不需要手动刷新缓冲区。这将 exitret为你做。

顺便说一句:LF(换行)编码为 10 十进制 和 0x0A 十六进制。

关于ubuntu - x86 NASM 程序集中的阶乘函数出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55798800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com