非常大的地址复制为负值
Very large address copied as negative value
我正在浏览一个对应于 C 程序的二进制文件。
我在 %eax
.
中存储了一个非常大的地址
当试图通过 gdb
查看值时,它会打印一个负值(原因 here)。
现在执行mov %eax, 0x4c(%esp)
时,0x4c(%esp)
中的结果值有时为正有时为负。这个效果cmp [=14=], 0x4c(%esp)
后面的语句!
有人可以解释一下这种行为吗?
如果这有帮助:
core: ELF 32-bit LSB core file Intel 80386, version 1 (SYSV), SVR4-style
寄存器没有符号;他们持有位。这取决于你如何解释它们。堆栈也是如此:它保存位,如何解释它们取决于您。如果将值从寄存器移动到堆栈,则会复制这些位。如果你像解释寄存器中的位一样解释堆栈中的位,你会得到相同的值。
请注意,有 条指令将这些位解释为值 - 乘法、比较等。但是 MOV
不是其中之一。
您复制的位序列始终相同,但解释可能不同,可能 gdb 默认为二进制补码 32 位值
如何更改 gdb 输出格式:
https://sourceware.org/gdb/onlinedocs/gdb/Output-Formats.html
如果在GDB中使用如下命令:
print $esp-0x4c
您实际上显示的是 地址 -0x4c(%esp)
(即:寄存器的值 esp
加上偏移量 -0x4c
)和 不是位于此地址的内容。为了显示 -0x4c(%esp)
的 内容 (即:查看此地址 上 的实际内容),您可以使用 x
命令:
x $esp-0x4c
我正在浏览一个对应于 C 程序的二进制文件。
我在 %eax
.
中存储了一个非常大的地址
当试图通过 gdb
查看值时,它会打印一个负值(原因 here)。
现在执行mov %eax, 0x4c(%esp)
时,0x4c(%esp)
中的结果值有时为正有时为负。这个效果cmp [=14=], 0x4c(%esp)
后面的语句!
有人可以解释一下这种行为吗?
如果这有帮助:
core: ELF 32-bit LSB core file Intel 80386, version 1 (SYSV), SVR4-style
寄存器没有符号;他们持有位。这取决于你如何解释它们。堆栈也是如此:它保存位,如何解释它们取决于您。如果将值从寄存器移动到堆栈,则会复制这些位。如果你像解释寄存器中的位一样解释堆栈中的位,你会得到相同的值。
请注意,有 条指令将这些位解释为值 - 乘法、比较等。但是 MOV
不是其中之一。
您复制的位序列始终相同,但解释可能不同,可能 gdb 默认为二进制补码 32 位值
如何更改 gdb 输出格式:
https://sourceware.org/gdb/onlinedocs/gdb/Output-Formats.html
如果在GDB中使用如下命令:
print $esp-0x4c
您实际上显示的是 地址 -0x4c(%esp)
(即:寄存器的值 esp
加上偏移量 -0x4c
)和 不是位于此地址的内容。为了显示 -0x4c(%esp)
的 内容 (即:查看此地址 上 的实际内容),您可以使用 x
命令:
x $esp-0x4c