2013-02-23 204 views
0

我有一个基本的asm程序,用于检查字符串是否是数字。我在代码中添加了从命令行参数中读取的内容,并将其保留为seg错误。从x86 asm访问linux命令行参数的问题

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

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

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

我修复了这个问题。我做了两个流行的,一个绕过程序名称,另一个获得第一个参数。更新后的代码可以在这里找到:http://pastebin.com/xewyeHYf

有人能告诉我为什么我不能只是做到以下几点:

pushl 8(%ebp) 

movl 8(%ebp), %eax 
+3

向我们显示您的代码。我们不是全能的。 – 2013-02-23 00:21:32

+1

您确定您使用的是32位Linux吗? – 2013-02-23 00:57:12

回答

1

你可以这样写:

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

要理解您以前的尝试不起作用的原因,请绘制堆栈图。

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