1

当将地址指针从 cpu 寄存器移动到外部存储器时,地址值会随着明显错误的签名扩展而改变

汇编代码:

    .section .data
argc:   .quad  0
        .section .bss
argv:   .space  8   # pointer variable definition
    .section .text
_start:
    .global _start
    movq (%rsp),%rax    #arguments number
    movq %rax,argc
    movq 8(%rsp),%rdi       #string address of first argument of command line
    movq %rdi,argv          #pointer variable initialization

GDB 调试器单步执行:

(gdb) p /a $rdi
$1 = 0x7fffffffe335
(gdb) p /a argv
$2 = 0xffffffffffffe335

地址 0x7ffffffffe335 的 MSB 为零 ¿ 为什么 argv 值不相等而 MSB 为 1?¿ 如何在外部存储器中实现变量指针?

提前致谢

加州马约兹

4

1 回答 1

2

内存内容很好,您使用 gdb 错误。由于您没有为argv变量提供调试信息,gdb 假定它是一个整数,并且在将其打印为地址时,它将被符号扩展。如果您使用例如检查内存,x/a &argv或者x/8xb &argv您将看到所有字节都在那里。

于 2013-04-23T11:19:14.780 回答