gpt4 book ai didi

linux - 阶乘 assembly x86

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:33 25 4
gpt4 key购买 nike

我有这个汇编代码(用 gcc -m32 编译的 Linux 32 位),我真的不明白为什么我的程序不能运行。

.data

.bla:
.ascii "%d\n\0"

.globl main

.text

main: pushl $4
call factorial
movl $1, %eax
ret
factorial:
push %ebp
movl %esp, %ebp
movl 8(%ebp), %ecx
cmpl $1, %ecx
jg .rek
movl $1, %eax
movl %ebp, %esp
pop %ebp
ret

.rek:
decl %ecx
pushl %ecx
call factorial
addl $4, %esp
movl 8(%ebp), %ecx
imull %ecx, %eax
pushl %eax
pushl $.bla
call printf
addl $8, %esp
movl %ebp, %esp
pop %ebp
ret

不幸的是,每次出现段错误 + 大于 4 的参数都不起作用。

这应该是我用“3”运行程序时的堆栈:

3
ret add
ebp
2
ret add
ebp
1
ret add
ebp

当我到达递归底部时,我将保存在 eax 中的返回值乘以 8(%ebp),这应该是下一个值。

非常感谢您提供的任何帮助。

最佳答案

我看到了三个问题。

1) 你的call maine(我假设这是一个错字,你的意思是main)应该是call factorial

2) 在您的main 程序中,您没有恢复堆栈指针。

3) 您的 printf 调用会修改 %eax 并在返回之前覆盖您的 factorial 的结果。

修复的程序:

.data

.bla:
.ascii "%d\n\0"

.globl main

.text

main: pushl $5
call factorial
addl $4, %esp # ADDED THIS
movl $1, %eax
ret
factorial:
push %ebp
movl %esp, %ebp
movl 8(%ebp), %ecx
cmpl $1, %ecx
jg .rek
movl $1, %eax
movl %ebp, %esp
pop %ebp
ret
.rek:
decl %ecx
pushl %ecx
call factorial # FIXED THIS
addl $4, %esp
movl 8(%ebp), %ecx
imull %ecx, %eax
pushl %eax # ADDED THIS - SAVE RETURN VALUE
pushl %eax
pushl $.bla
call printf
addl $8, %esp # MODIFIED THIS
pop %eax # ADDED THIS (restore eax result)
movl %ebp, %esp
pop %ebp
ret

关于linux - 阶乘 assembly x86,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32248890/

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