从x86 asm访问linux中的命令行参数的问题

时间:2013-02-23 00:13:31

标签: linux assembly x86 command-line-arguments

我有一个基本的asm程序,用于检查字符串是否为数字。我正在添加代码来从命令行争论中读取,把它保留为seg faulting。

如果我读到的是正确的,这应该得到传递给程序的参数量,应该存储在0(%ebp)中。我做错了什么?

可以在此处找到代码的完整性:http://pastebin.com/kGV2Mxx4 问题是_start的前3-5行。

在查看lscpu的输出时,我有一个i868 cpu。虽然它说它可以在32位和64位运行。我正在运行32位linux(Arch linux x86)

我解决了这个问题。我做了2个pop,一个绕过程序名,下一个得到第一个参数。更新后的代码可在此处找到:http://pastebin.com/xewyeHYf

有人可以告诉我为什么我不能只做以下事情:

pushl 8(%ebp)

movl 8(%ebp), %eax

3 个答案:

答案 0 :(得分:2)

这是我在这个主题上写的一个小教程: NASM - Linux Getting command line parameters

答案 1 :(得分:1)

你可以这样写:

_start:
b1: movl    0(%ebp), %eax
    cmpl    $1, %eax
    je      load_msg
b2:    pushl    8(%ebp)
b4:    call    check

要了解先前尝试无效的原因,请绘制堆栈图。

答案 2 :(得分:0)

编译一个小C程序,它执行类似你想要做的事情,并将其编译为汇编语言,以确切了解如何访问参数。 x86_32代码看起来并不像以上任何一样,BTW:

int main(int argc, char *argv[])
{
  return argv[1][0];
}

给出(是的,有些是多余的堆栈簿记,但无论如何):

    .file   "tst.c"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    movl    12(%ebp), %eax
    addl    $4, %eax
    movl    (%eax), %eax
    movzbl  (%eax), %eax
    movsbl  %al, %eax
    popl    %ebp
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (GNU) 4.7.2 20121109 (Red Hat 4.7.2-8)"
    .section    .note.GNU-stack,"",@progbits