Assembly 无法在x86程序集中获取argv[0]
答案表明Assembly 无法在x86程序集中获取argv[0],assembly,x86,Assembly,X86,答案表明ESP+4指向argv[0]。但我无法让它工作: .section .text .globl _start _start: movl 8(%esp), %ebx movl $1, %eax int $0x80 现在,当我尝试执行此操作时: $ as --32 argv.s -o argv.o $ ld -m elf_i386 argv.o -o argv $ ./argv 2 $ echo $? 16
ESP+4
指向argv[0]
。但我无法让它工作:
.section .text
.globl _start
_start:
movl 8(%esp), %ebx
movl $1, %eax
int $0x80
现在,当我尝试执行此操作时:
$ as --32 argv.s -o argv.o
$ ld -m elf_i386 argv.o -o argv
$ ./argv 2
$ echo $?
16
它显示
16
,尽管我在这里预期的是16。我做错了什么?多亏了彼得的评论,我终于找到了答案。由于argv
是一个,在第一次解引用中,您将得到一个地址,它是指向字符的指针。再次取消引用将获得所需的结果:
.section .text
.globl _start
_start:
movl 8(%esp), %ebx
movl (%ebx), %ebx
movl $1, %eax
int $0x80
在执行时:
$ ./argv 1
49
49是预期的结果,这是
1
由于彼得的评论,我终于能够找到答案。由于argv
是一个,在第一次解引用中,您将得到一个地址,它是指向字符的指针。再次取消引用将获得所需的结果:
.section .text
.globl _start
_start:
movl 8(%esp), %ebx
movl (%ebx), %ebx
movl $1, %eax
int $0x80
在执行时:
$ ./argv 1
49
49是预期结果,即
1
0x10
的值对于指针的低位字节来说似乎是合理的值。如果没有args,则得到0
,因此argv[1]
为空,对吗?无论如何,如果您想要一个字节保存指向字符串的ASCII字符代码,请下次取消引用。(请记住,Linux退出状态仅为1字节宽。)使用GDB单步执行代码,以便一次转储堆栈内存超过1字节,并轻松查看指针值+它指向的内容。@PeterCordes谢谢,通过GDB单步执行非常有用。0x10
看起来是指针低字节的合理值。如果没有args,则得到0
,因此argv[1]
为空,对吗?无论如何,如果您想要一个字节保存指向字符串的ASCII字符代码,请下次取消引用。(请记住,Linux退出状态只有1字节宽。)使用GDB单步执行代码,这样您可以一次转储超过1字节的堆栈内存,并且可以轻松查看指针值及其指向的内容。@PeterCordes谢谢,通过GDB单步执行非常有帮助。