我正在查看如下汇编代码:
cmp dword [rbp-0x4 {var_c}], 0x0
jne 0x12c0
对我来说,写着:
比较something和null的值,如果没有错误 (即它们匹配),请跳至0x12c0。
对吗?我不了解[rbp-0x4 {var_c}]
是什么,或者为什么我们将其与null进行比较。
我确实尝试按照图来了解这些变量是什么,并且得到了以下信息:
0x4 = uint8_t file_class = 0x2
var_c = In Set of Values {0, 1}
rbp
似乎是从main推送的任何对理解这一点的帮助将不胜感激。我想澄清cmp
语句中正在比较的内容。
答案 0 :(得分:2)
不完全是,更多:
将某物的值与零进行比较,如果不相等,则跳转。
汇编语言没有“ null”的概念,cmp
通常与sub
相同(减去),但实际上并未更改其值。基本上是:
将标志设置为,就像我从某物减去零一样。
以更伪代码的方式,您的两条指令总计为:
if var_c <> 0 then goto label_12c0
答案 1 :(得分:2)
rbp
似乎是从main推送的
rbp
是一个CPU寄存器,与所有CPU寄存器一样,它存储一个值。
我不想在这里进行详细介绍,但是大多数编译器使用寄存器rbp
来存储信息,该信息用于将函数的局部变量(有时是函数参数)存储在RAM存储器中:
通常通过从rbp
寄存器中存储的值中减去一些常量来计算存储某个局部变量的地址(RAM存储器中的位置)。
我不明白
[rbp-0x4 {var_c}]
是什么...
dword [rbp-0x4]
的意思是:存储在地址rbp-4
上的32位值:该地址是通过从寄存器rbp
中存储的值中减去值4得出的。
编译器已将调试器的其他信息放入二进制文件中。该信息表明局部变量var_c
的地址由rbp-4
计算,局部变量some_other_variable
的地址由rbp-10
计算,依此类推... < / p>
反汇编程序已读取此信息,并在{var_c}
之后打印rbp-0x4
,以表明变量var_c
位于地址rbp-0x4
。因此,32位值“ dword [rbp-0x4]
”可能是变量“ var_c
”。
0x4 = uint8_t file_class = 0x2
我不知道这是什么信息。但是这里的值0x4
与反汇编行(0x4
)中的值rbp-0x4
没有关系。
...,如果没有错误(即它们匹配),请跳至0x12c0。
jne
的意思是:“如果 n 没有 e 等于,则 J 加”。
这意味着如果变量var_c
不等于0,则CPU将跳转。
请注意,在表示if()
分支的编译代码中,如果条件为 false ,则跳转指令通常会跳转:
如果条件为 false ,则CPU跳转到else
部分或跳转到if()
部分之后的第一条指令。如果条件为 true ,则CPU不会不跳转,而是执行if()
之后的jne
部分的第一条指令(或类似内容)指示。
由于如果var_c
不是 为零,则示例跳转,因此源代码可能类似于if(var_c == 0)
。