Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 复制为负值的非常大的地址_Assembly_X86_Gdb_Mov - Fatal编程技术网

Assembly 复制为负值的非常大的地址

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风格寄存器没有符号;他们持有比特。这取决于你如何解释它们。堆栈也是如此:它保存位,如何

我正在浏览一个与C程序对应的二进制文件。
我在
%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)
中的一个).很难说你在那里看到了什么,因为你没有把它贴出来。