Assembly 复制为负值的非常大的地址
我正在浏览一个与C程序对应的二进制文件。Assembly 复制为负值的非常大的地址,assembly,x86,gdb,mov,Assembly,X86,Gdb,Mov,我正在浏览一个与C程序对应的二进制文件。 我在%eax中存储了一个非常大的地址 当试图通过gdb查看该值时,它会打印一个负值(原因) 现在,当执行mov%eax,0x4c(%esp)时,0x4c(%esp)中的结果值有时为正值,有时为负值。这个效果cmp$0,0x4c(%esp)下面的语句 有人能解释一下这种行为吗 如果这有帮助: 核心:ELF 32位LSB核心文件英特尔80386,版本1(SYSV),SVR4风格寄存器没有符号;他们持有比特。这取决于你如何解释它们。堆栈也是如此:它保存位,如何
我在
%eax
中存储了一个非常大的地址当试图通过
gdb
查看该值时,它会打印一个负值(原因)
现在,当执行mov%eax,0x4c(%esp)
时,0x4c(%esp)
中的结果值有时为正值,有时为负值。这个效果cmp$0,0x4c(%esp)
下面的语句
有人能解释一下这种行为吗
如果这有帮助:核心:ELF 32位LSB核心文件英特尔80386,版本1(SYSV),SVR4风格
寄存器没有符号;他们持有比特。这取决于你如何解释它们。堆栈也是如此:它保存位,如何解释它们取决于您。如果将一个值从寄存器移动到堆栈,则会复制位。如果你像解释寄存器中的位一样解释堆栈中的位,你会得到相同的值
请注意,有些指令将这些位解释为值—乘法、比较等。但是
MOV
不是其中之一。您复制的位序列总是相同的,但解释可能不同,可能gdb默认为2的32位补码值
如何更改gdb输出格式:
如果在GDB中使用以下命令:
print $esp-0x4c
您实际显示的是地址-0x4c(%esp)
(即:寄存器esp
的值加上偏移量-0x4c
),而不是位于该地址的内容。要显示-0x4c(%esp)
的内容(即:查看此地址的实际内容),可以使用x
命令:
x $esp-0x4c
您在
gdb
中实际是如何显示这些值的?您复制的位序列总是相同的,但解释可能不同,可能gdb默认为2的补码32位值我正在使用print%eax
显示0x4c(%esp)的内容
?FWIW,它不会影响cmp
指令。它只设置不同的标志,由您来解释它们,例如,在条件跳转中使用ja
,jb
(用于无符号比较)或jg
,jl
(用于有符号比较),或使用seta
,setb
,等等,加上1用于解释数据和此类数据解释之间的差异,但是当0x4c(%esp)
用于cmp
时,我得到了不同的结果。为什么会这样?@JithinPavithran:我不知道这是什么意思。猜测:你是说紧接着,cmp%eax,0x4c(%esp;jne…
跳跃?我不知道为什么在编译的C代码中会出现这个序列。不,不是紧接着。在mov之后,有一个jmp
(无条件),然后是cmp
,然后是jmp
,这取决于结果。(代码中有一个海森堡,我正在试图深入理解它)@JithinPavithran:mov%eax,(…)在内存中存储的值是32位的值。你可以按任何方式解释它,它仍然是相同的值(在位级别)。无论你对“cmp
和代码流”有什么疑惑必须有其他原因,针对地址的cmp$0,
有点荒谬,因为通常针对零测试地址的唯一好理由是捕获nullptr
值,因此符号位的值也不重要(然后使用jz(je)/jnz(jne)
中的一个).很难说你在那里看到了什么,因为你没有把它贴出来。