了解汇编中的cmp

时间:2019-06-08 05:25:37

标签: assembly x86-64 disassembly

我正在查看如下汇编代码:

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语句中正在比较的内容。

2 个答案:

答案 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)