从x86 asm访问linux命令行参数的问题
问题描述:
我有一个基本的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
答
你可以这样写:
_start:
b1: movl 0(%ebp), %eax
cmpl $1, %eax
je load_msg
b2: pushl 8(%ebp)
b4: call check
要理解您以前的尝试不起作用的原因,请绘制堆栈图。
答
编译一个类似你想做的事情的小型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-23 00:21:32
您确定您使用的是32位Linux吗? – 2013-02-23 00:57:12