Assembly 英特尔程序集找不到Argv地址

Assembly 英特尔程序集找不到Argv地址,assembly,Assembly,我不知道这是否是一个广泛的问题,但我很难找到参数向量字符串。这是我的GDB输出 (gdb) run test Starting program: /root/Desktop/booksrc/a.out test warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000 Breakpoint 1, main (argc=2, argv=0x7fffffffe468)

我不知道这是否是一个广泛的问题,但我很难找到参数向量字符串。这是我的GDB输出

(gdb) run test
Starting program: /root/Desktop/booksrc/a.out test
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000

Breakpoint 1, main (argc=2, argv=0x7fffffffe468) at convert2.c:14
14      count = atoi(argv[2]); // convert the 2nd arg into an integer
(gdb) x/3xw 0x7fffffffe468
0x7fffffffe468: 0xffffe6d2  0x00007fff  0xffffe6ee
(gdb) x/3xw 0xffffe6d2
0xffffe6d2: Cannot access memory at address 0xffffe6d2
(gdb) x/3xw 0x00007fff
0x7fff: Cannot access memory at address 0x7fff
因此,我的第一个参数/root/Desktop/booksrc/a.out是不可访问的,测试参数也是不可访问的。给出了什么?

您必须在命令中使用g而不是w。g代表giant或8bytes,由于您的计算机是64位计算机,因此您需要的是x/3xg,而不是x/3xw,您将得到如下结果:

(gdb) x/3xg 0x7fff5fbff900
0x7fff5fbff900: 0x00007fff5fbffa38  0x00007fff5fbffa6a
0x7fff5fbff910: 0x0000000000000000

然后x/s 0x00007fff5fbffa38,您将看到argv参数,它是程序的路径,第二个0x00007fff5fbffa6a将被测试。

您处于64位模式,指针是64位的。在任何情况下,您都可以直接调用p argv[2]并忽略该细节。我正在阅读的源代码使用32位。但是,为什么这些地址无法访问?这是一个格式问题吗?无法访问,因为您只使用了其中较低的一半。如果您想在32位模式下播放,请使用gcc-m32编译。是否有命令使检查输出提供我缺少的前4个字节?那么x/3xw会给我0x7fffffffe6d2而不是0xffff6d2?非常感谢您的帮助,我没有意识到64会有不同的寻址机制:PYou可以使用/a格式,或者自己将两部分放在一起,已经打印好了:0x7fffffffe468:0xFFFF6D2 0x00007fff所以0x00007fffffffe6d2。