了解汇编中的 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 进行比较。
我确实尝试按照图表来了解这些变量是什么,我得到了以下信息:
0x4 = uint8_t file_class = 0x2
var_c = In Set of Values {0, 1}
rbp
好像是从 main 推进来的
如能帮助理解这一点,我们将不胜感激。我正在寻找有关 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)
.
我正在查看如下所示的汇编代码:
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 进行比较。
我确实尝试按照图表来了解这些变量是什么,我得到了以下信息:
0x4 = uint8_t file_class = 0x2
var_c = In Set of Values {0, 1}
rbp
好像是从 main 推进来的
如能帮助理解这一点,我们将不胜感激。我正在寻找有关 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)
.