assembly - x86 程序集在跳转前推送参数
问题描述
我正在从事一个高级设计项目,但又遇到了一个小障碍。有没有在汇编中出现这样的情况:你推送参数,然后跳转到不同的位置,然后调用函数?
您似乎无法从我可用的文件中获取信息,但它们并非包罗万象。任何帮助将不胜感激,谢谢!
解决方案
重要的是当执行到达您要调用的函数的顶部时堆栈上的内容。它到达那里的方式或顺序无关紧要,只是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 漏洞利用,它创建了已知的微架构状态,然后将其读入架构状态。)
推荐阅读
- python - Spacy - 在模式匹配中识别标记
- java - Tika 检测类型和 PDFParse
- swift - Carekit 数据是否已损坏?
- python - 无法使用 python 将 .xls 文件转换为 xlsx 或 csv
- c - Valgrind 不显示任何信息(因为 exec 调用?)
- javascript - Node.JS(网络)代理中的转发客户端IP
- c# - HttpClient“任务被取消”
- angular - 在拥有的主机上部署时,Angular 11 资产文件夹返回 403
- flutter - 如何在颤动中打印生成的 QR 图像
- flutter - 我在我的项目中使用了地理编码包,一些注意事项