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