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编程语言,最后一个参数被先推,第一个参数被最后推。