Assembly 混淆汇编调用、RET语句
我想知道什么时候调用指令执行。它首先推送堆栈或函数参数的返回地址 谢谢调用根本不推送参数。它只推送返回地址。显然,你有责任自己推送论点,这发生在调用之前。例如:Assembly 混淆汇编调用、RET语句,assembly,stack,nasm,masm,Assembly,Stack,Nasm,Masm,我想知道什么时候调用指令执行。它首先推送堆栈或函数参数的返回地址 谢谢调用根本不推送参数。它只推送返回地址。显然,你有责任自己推送论点,这发生在调用之前。例如: push 2 push 1 push "%d" call printf next_instruction: add esp, 12 当进入printf函数时,假设以32位进行near调用,堆栈将如下所示: esp+0: address of next_instruction esp+4: a
push 2
push 1
push "%d"
call printf
next_instruction:
add esp, 12
当进入printf函数时,假设以32位进行near调用,堆栈将如下所示:
esp+0: address of next_instruction
esp+4: address of "%d"
esp+8: 1
esp+12: 2
编辑:关于论点的顺序,扩展@Martin所说的内容:
对堆栈上的内容的解释是调用方和被调用方之间名为“调用约定”的契约,它取决于很多事情,包括语言、体系结构、编译器等等。对于x86上的C,参数从最后一个推送到第一个。因此,上面的汇编代码片段对应于翻译后的C语句:
printf("%d", 1, 2);
如果查看上面的堆栈,您会发现,由于我们按相反的顺序推送参数,因此它们相对于esp从第一个到最后一个进行排序。这样,printf可以读取第一个参数%d,而不知道后面会有多少参数,然后从格式字符串确定其余参数。此外,由于在C调用约定中,调用方负责在下一个_指令中从堆栈中删除参数,因此传递超出必要的参数是无害的,尽管根据标准,这是未定义的行为。如果函数返回的对象太大,无法放入寄存器,然后预分配返回对象的空间:
sub esp,sizeof object
push ecx
push eax
call example
add esp,8 ;restore stack
; ;esp is now pointer to object
add esp,sizeof object ;restore stack once object no longer needed
所以这意味着,先生,如果我把这些废话叫做“再见”,“挑战”。第一个参数被推到堆栈上“挑战”和“再见”。然后返回地址。对吧?对。调用函数推送两个参数dare和bye,然后执行调用。推送参数的顺序取决于调用约定。对于C编程语言,最后一个参数被先推,第一个参数被最后推。