gpt4 book ai didi

linux - 尝试使用 scanf 存储两个数字,但程序崩溃

转载 作者:太空狗 更新时间:2023-10-29 11:16:00 26 4
gpt4 key购买 nike

给定以下代码:

.section .rodata

input_format1: .string "%d%d"
output_format1: .string "Yes. %d is a power of %d\n"
output_format2: .string "No. %d is not a power of %d\n"

.section .text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp

addl $-8 ,%esp # moving down the stack
pushl %esp
pushl 4(%esp)
pushl $input_format1
call scanf # call scanf to get a number from the user
addl $12,%esp
movl (%esp),%ebx # store the actual number
movl 4(%esp),%ecx


.loop:


#return from printf:
movl %ebp,%esp
popl %ebp
ret

在程序到达 scanf 并且我按下第一个数字后,它崩溃了。我做错了什么?

谢谢罗恩

最佳答案

问题出在:

pushl   4(%esp)

压入栈中的值,而不是此类变量的地址。将其与之前的正确指令 pushl %esp 进行比较。这个确实推送了一个地址。

您需要的是 pushl %esp+4,但这不能只用一条指令完成,AFAIK。而是做类似的事情:

lea 4(%esp), %eax
push %eax

更新:

你的另一个问题是因为每次你执行 push 时 %esp 都会递减,所以计算局部变量的正确地址很麻烦。这是拥有堆栈框架的原因之一,而您拥有一个!所以使用 %ebp 来引用你的局部变量,但是有一个负偏移量:

    pushl   %ebp
movl %esp, %ebp
addl $-8 ,%esp # moving down the stack
lea -4(%ebp), %eax
pushl %eax
lea -8(%ebp), %eax
pushl %eax
pushl $input_format1
call scanf # call scanf to get a number from the user
addl $12,%esp
movl -8(%ebp),%ebx # store the actual number
movl -4(%ebp),%ecx

关于linux - 尝试使用 scanf 存储两个数字,但程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8582748/

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