x86 NASM程序集中的因子函数出错了

问题描述 投票:0回答:1

我正在使用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
ubuntu assembly x86 nasm factorial
1个回答
1
投票

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为你做。

BTW:LF(换行)编码为10十进制和0x0A十六进制。

© www.soinside.com 2019 - 2024. All rights reserved.