繁体   English   中英

了解汇编中的cmp

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM