【问题标题】:Problems with accessing command line arguments in linux from x86 asm从 x86 asm 访问 linux 中的命令行参数的问题
【发布时间】:2013-02-08 17:35:17
【问题描述】:

我有一个基本的 asm 程序来检查字符串是否为数字。我正在添加代码以从命令行争论中读取,让它不断出现段错误。

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

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

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

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

谁能告诉我为什么我不能只做以下事情:

pushl 8(%ebp)

movl 8(%ebp), %eax

【问题讨论】:

  • 向我们展示您的代码。我们并非无所不知。
  • 您确定您使用的是 32 位 Linux?

标签: linux assembly x86 command-line-arguments


【解决方案1】:

你可以这样写:

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

要了解您之前的尝试为何不起作用,请绘制堆栈图。

【讨论】:

    【解决方案2】:

    编译一个小型 C 程序,它可以执行您想要执行的操作,并将其编译为汇编语言以准确了解如何访问参数。 x86_32 代码看起来一点也不像上面的代码,顺便说一句:

    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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-12
        • 2010-09-30
        • 2015-10-17
        • 1970-01-01
        相关资源
        最近更新 更多