Assembly 汇编代码-通过用户界面访问输入

Assembly 汇编代码-通过用户界面访问输入,assembly,user-input,Assembly,User Input,我一直在努力理解一个学校项目的代码。我需要找出代码的错误,并对其进行修改(我无法删除/添加新行) 首先让我说,这段代码是主函数的开始,它需要用户输入一个数字。整个程序将计算第n个素数。(在这种情况下,n将是用户输入)。该程序将通过gcc编译。/prime 5->然后它将得到第五个素数 程序的其余部分工作正常。。。但我无法让用户输入正常工作。我尝试将以下内容绘制到堆栈中,试图找出为什么调用“atoi”后%eax没有将正确的值存储到-16(%ebp)中 我可以通过手动将'n'的值输入到-16(%eb

我一直在努力理解一个学校项目的代码。我需要找出代码的错误,并对其进行修改(我无法删除/添加新行)

首先让我说,这段代码是主函数的开始,它需要用户输入一个数字。整个程序将计算第n个素数。(在这种情况下,n将是用户输入)。该程序将通过gcc编译。/prime 5->然后它将得到第五个素数

程序的其余部分工作正常。。。但我无法让用户输入正常工作。我尝试将以下内容绘制到堆栈中,试图找出为什么调用“atoi”后%eax没有将正确的值存储到-16(%ebp)中

我可以通过手动将'n'的值输入到-16(%ebp)中来测试程序的其余部分。但我无法让用户输入正常工作

我是使用gdb的新手,但从我对gdb的实验来看,问题在于“atoi”函数调用

我不确定这是否直接来自C。(可能是的,编译器中有很多无用的代码。)


非常感谢您的帮助。

main的原型是:
intmain(intargc,char**argv)
(可能也会获得
envp
,但目前还不相关)。因此,在返回地址上方,您有
argc
,它是代码中的
(%ecx)
,因为初始
leal 4(%esp),%ecx
。然后是
4(%ecx)
处的
argv
<使用
movl4(%ecx),%eax
可以正确访问code>argv,但是按照约定,
argv
本身以程序名
argv[0]
开始,实际参数从
argv[1]
开始。代码按原样传递
argv[0]
atoi
,而不是第一个参数。由于
argv
的每个元素都是一个4字节的指针,您需要添加4才能到达
argv[1]
,因此您需要将
addl$0,%eax
调整为
addl$4,%eax

提示:检查传递给
atoi
的参数。您好,非常感谢您的提示。我试图修改'addl$0,%eax'到'addl$4,%eax',它现在正在工作。为什么会这样?当它调用“main”时,它不是在推eip吗?难道eip不应该是正确的吗?当它调用main时,返回地址上方是什么?哦,我忘记了argv[0]是程序名><愚蠢的我。
.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)