首页 > 解决方案 > x86 程序集在跳转前推送参数

问题描述

我正在从事一个高级设计项目,但又遇到了一个小障碍。有没有在汇编中出现这样的情况:你推送参数,然后跳转到不同的位置,然后调用函数?

您似乎无法从我可用的文件中获取信息,但它们并非包罗万象。任何帮助将不胜感激,谢谢!

标签: assemblyx86

解决方案


重要的是当执行到达您要调用的函数的顶部时堆栈上的内容。它到达那里的方式或顺序无关紧要,只是ESP指向返回地址,ESP+4指向第一个堆栈 arg 等等。

一个函数也不知道或关心你是用call,还是用jmp尾调用,甚至是jae 有条件的尾调用。

您甚至根本不必使用push您可以sub esp, 24在函数的顶部使用mov来存储您的参数。(就像以前一样gcc -m32 -maccumulate-outgoing-args,它曾经在没有堆栈引擎的旧 CPU 上很好用push,效率不高。) 为什么 gcc 使用 movl 而不是 push 来传递函数 args?

(当然,更有效的调用约定在寄存器中传递参数,只有在有超过 2 或 3 个整数/指针参数时才使用堆栈。但同样的区别,调用约定指定了进入函数时所需的状态,而不是你如何做到这一点发生。


既然你甚至不得不问这个问题,请记住 CPU 基本上是一个状态机。每条指令对体系结构状态(寄存器和内存内容,包括特殊的寄存器,如 EFLAGS 和指令指针)都有其记录的影响。除此之外,没有上下文。你如何达到一个状态并不重要,重要的是你身处其中。


上下文对于部分寄存器停顿、存储转发停顿、分支预测以及多条指令的重叠执行等性能很重要。但不是为了正确。

(我忽略了 Spectre / Meltdown 漏洞利用,它创建了已知的微架构状态,然后将其读入架构状态。)


推荐阅读