[英]Understanding cmp in assembly
我正在查看如下汇编代码:
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
语句中进行比较的说明。
不完全是,更多:
将某物的值与零进行比较,如果不相等,则跳转。
汇编语言有没有“空”的概念和cmp
通常是相同的一个sub
(减法),但没有实际改变值。 基本上是:
将标志设置为好像我从某物减去零。
以更伪代码的方式,您的两条指令总计为:
if var_c <> 0 then goto label_12c0
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
等等...
反汇编程序已读取此信息,并在rbp-0x4
之后打印{var_c}
,以表明变量var_c
位于地址rbp-0x4
。 因此,32位值“ dword [rbp-0x4]
”可能是变量“ var_c
”。
0x4 = uint8_t file_class = 0x2
我不知道这是什么信息。 但价值0x4
这里无关与价值0x4
在拆卸线( rbp-0x4
)。
...,如果没有错误(即它们匹配),则跳至0x12c0。
jne
意思是: “ĴUMP如果n OTËQUAL”。
这意味着如果变量var_c
不等于0,则CPU将跳转。
请注意,在表示if()
分支的已编译代码中,如果条件为false ,则跳转指令通常将跳转:
如果条件为false ,则CPU跳转到else
部分或if()
部分之后的第一条指令。 如果条件为真 ,则CPU 不跳但执行的第一指令if()
以下的部分jne
(或类似的)指令。
因为如果var_c
不为零,则示例会跳转,因此源代码很可能类似于if(var_c == 0)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.