了解汇编中的 cmp

Understanding cmp in assembly

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

cmp dword [rbp-0x4 {var_c}], 0x0
jne 0x12c0

对我来说,内容是:

Compare the value of something and null, and if there is no error (i.e. they match), jump to 0x12c0.

对吗?我不明白 [rbp-0x4 {var_c}] 是什么,也不明白为什么我们会将其与 null 进行比较。

我确实尝试按照图表来了解这些变量是什么,我得到了以下信息:

如能帮助理解这一点,我们将不胜感激。我正在寻找有关 cmp 声明中比较的内容的说明。

不完全是,更多:

Compare the value of something with zero and, if they are not equal, jump.

汇编语言没有 "null" 的概念,cmp 通常与 sub(减)相同,但实际上没有改变值。基本上是:

Set the flags as if I had subtracted zero from something.

更 pseudo-code 时尚,您的两条指令总计:

if var_c <> 0 then goto label_12c0

rbp seems to be what is pushed in from main

rbp 是一个 CPU 寄存器,它(像所有 CPU 寄存器一样)存储一个值。

我不想在这里说得太深,但是大多数编译器使用寄存器 rbp 来存储函数的局部变量(有时是函数参数)存储在RAM 内存:

存储某个局部变量的地址(在 RAM 内存中的位置)通常是通过从 rbp 寄存器中存储的值中减去某个常数值来计算的。

I don't understand what [rbp-0x4 {var_c}] is ...

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).

... and if there is no error (i.e. they match), jump to 0x12c0.

jne 意思是:“Jump if not equal ".

这意味着如果变量 var_c 等于 0,CPU 将跳转。

请注意,在表示 if() 分支的编译代码中,如果条件为 false:

,则跳转指令通常会跳转

如果条件为false,则CPU跳转到else部分或if()部分之后的第一条指令。如果条件为 true,CPU 执行 而不是 跳转,但执行 if() 部分的第一条指令jne(或类似)指令。

因为如果 var_c 而不是 零,则您的示例会跳转,因此源代码很可能类似于 if(var_c == 0).