组装:通话后继续
assembly: continuing after call
我正在查看以下代码:
cmp edx edx
jle loc_40234
call some_func
add eax, eax
我想了解的是我怎么能到达第四行,因为它不是 loc(无法跳转到)并且它紧跟在函数调用之后。我的意思是,这个调用就像一个跳跃,对吗?
编辑:好的,我明白了基本的想法。我应该指定:此代码是 some_func 的一部分(这是我收集的一个循环)。
cmp edx,edx
会和自己比较edx
,所以总是"equal",jle
总是取
call
不会从此代码路径到达(如果它会执行,一些其他代码将不得不直接跳转到 call
指令或 jle
标志已设置为评估为 "greater" 条件的指令)。
call
在技术上与 jmp
相似,只是有一些额外的变化。它会压入下一条指令的堆栈地址 (add
),所以如果 some_func
处的代码会以某种方式使用堆栈中的这个地址跳转到那里(最常见的函数以 ret
指令结束,正是这样做的,弹出堆栈值的顶部并跳转到它,这是 return 地址,如果堆栈内容没有损坏并且堆栈指针正确),将到达 add
。
当然不可能不检查some_func
代码就说,如果会return到那个add
.
我正在查看以下代码:
cmp edx edx
jle loc_40234
call some_func
add eax, eax
我想了解的是我怎么能到达第四行,因为它不是 loc(无法跳转到)并且它紧跟在函数调用之后。我的意思是,这个调用就像一个跳跃,对吗?
编辑:好的,我明白了基本的想法。我应该指定:此代码是 some_func 的一部分(这是我收集的一个循环)。
cmp edx,edx
会和自己比较edx
,所以总是"equal",jle
总是取
call
不会从此代码路径到达(如果它会执行,一些其他代码将不得不直接跳转到 call
指令或 jle
标志已设置为评估为 "greater" 条件的指令)。
call
在技术上与 jmp
相似,只是有一些额外的变化。它会压入下一条指令的堆栈地址 (add
),所以如果 some_func
处的代码会以某种方式使用堆栈中的这个地址跳转到那里(最常见的函数以 ret
指令结束,正是这样做的,弹出堆栈值的顶部并跳转到它,这是 return 地址,如果堆栈内容没有损坏并且堆栈指针正确),将到达 add
。
当然不可能不检查some_func
代码就说,如果会return到那个add
.