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单步执行非常有帮助。