macos - 使用基于堆栈的调用约定的汇编函数调用
问题描述
我很困惑。我正在查看此页面以了解如何使用堆栈将参数传递给函数。但是,我的代码没有按预期工作。鉴于我将计算结果放入 rax,我希望退出代码为 9,但事实并非如此;相反,我的退出代码是 150。了解 x86 中堆栈的这种调用约定的人是否知道我做错了什么,以及如何实现我想要解决的问题?我在这样的 Mac 上用 GAS 组装:gcc -masm=intel stack_frames.asm
.global _main
.text
_main:
push 4 # arg 2
push 5 # arg 1
call plus
mov rdi, rax # exit code = result in rax, which I'm expecting to be 9
mov rax, 0x2000001
syscall
plus:
push rbp
mov rbp, rsp
mov rsi, [rbp + 12] # param 1
mov rdi, [rbp + 8] # param 2
add rdi, rsi # sum in rdi
mov rax, rdi # move sum to rax
mov rsp, rbp
pop rbp
ret
解决方案
您使用的是 64 位的 x86-64,而不是 32 位 x86。您知道这一点是因为您能够使用 64 位寄存器,例如rax
. 因此,push
并call
推送 8 个字节,而不是 4 个,因此您的参数将位于[rbp + 24]
and [rbp + 16]
,而不是[rbp + 12]
and [rbp + 8]
。
推荐阅读
- docker - docker中的集群管理和编排有什么区别?
- azure - 用于查找给定订阅和区域的可用 VM 大小/sku 的 Azure ARM API
- android - BeaconManager updateScanPeriods 不会改变扫描率
- python - 如何使用 python 在运行时验证两个 JSON API 响应键值对匹配?
- ruby-on-rails - wicked_pdf,无法呈现 pdf
- node.js - 节点,创建一个流对象,内部已经有一些流管道
- python - 如何使用python从sportstream365中抓取比赛信息
- .htaccess - 使用 htaccess 缩短长 url 字符串
- ios - 从本机 iOS 广播不起作用。(科尔多瓦广播公司)
- java - java正则表达式测验