0

我有一个基本的 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
4

3 回答 3

2

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

于 2013-02-24T04:50:55.520 回答
1

你可以这样写:

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

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

于 2013-02-23T23:10:14.527 回答
0

编译一个小型 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
于 2013-02-24T04:17:57.420 回答