我有一个基本的汇编程序,检查一个string是否是一个数字。 我在代码中添加了从命令行参数中读取的内容,并将其保留为段错误。
如果我读的是正确的,这应该得到传递给程序的参数的数量,它应该存储在0(%ebp)中。 我究竟做错了什么?
代码的安全性可以在这里find: http ://pastebin.com/kGV2Mxx4问题是_start的前3-5行。
看着lscpu的输出,我有一个i868 CPU。 虽然它说它可以在32位和64位操作。 我正在运行32位的Linux(Arch linux x86)
我解决了这个问题。 我做了2个stream行的,一个绕过程序名称,下一个获得第一个参数。 更新的代码可以在这里find: 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
要理解为什么您以前的尝试不起作用,请绘制堆栈图。
这里是我写的关于这个主题的一个小教程: NASM – Linux获取命令行参数
编译一个小的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