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

时间:2014-10-24 21:15:43

标签: assembly user-input

.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。 (可能是,有很多无用的代码 - 编译器的工作。)

非常感谢你的帮助。

1 个答案:

答案 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进行。