.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %ebp, %esp
pushl %ecx
subl $36, %esp
movl 4(%ecx), %eax
addl $0, %eax
movl (%eax), %eax
movl %eax, (%esp)
call atoi
movl %eax, -16(%ebp)
movl $0, -12(%ebp)
movl $1, -8(%ebp)
我一直在努力了解学校项目的代码。我需要弄清楚代码有什么问题,并修改它(我不能删除/添加新行)。
首先我要说的是,这段代码是主要功能的开始,需要用户输入数字。整个程序将计算第n个素数。 (在这种情况下,n将是用户输入)。该程序将通过gcc编译./prime 5 - >然后它将获得第5个素数。
程序的其余部分工作正常......除了我无法让用户输入工作。我试图将以下内容写入堆栈,试图找出为什么%eax,在调用' atoi'不会将正确的值存储到-16(%ebp)。
我可以通过手动输入' n'的值来测试程序的其余部分。到-16(%ebp)。但我无法让用户输入工作。
我是一个使用gdb的新手,但是从我对gdb的实验中,问题出现在' atoi'功能调用。
我不确定这是否直接来自C。 (可能是,有很多无用的代码 - 编译器的工作。)
非常感谢你的帮助。
答案 0 :(得分:0)
main的原型是:int main(int argc, char** argv)
(也许还有envp
,但这与现在不相关)。因此,在返回地址上方,由于初始argc
,您在代码中(%ecx)
leal 4(%esp), %ecx
。接下来是argv
4(%ecx)
。使用argv
可以正确访问movl 4(%ecx), %eax
,但是argv
本身按照惯例以程序名称argv[0]
开头,实际参数从argv[1]
开始。代码as-is将argv[0]
传递给atoi
而不是第一个参数。由于argv
的每个元素都是一个4字节指针,因此您需要添加4才能转到argv[1]
,因此您需要将addl $0, %eax
调整为addl $4, %eax
进行。