【发布时间】:2013-12-31 02:25:55
【问题描述】:
我用 x86-64 汇编 (AT&T) 语法编写了一个小程序,它汇编得很好,但我没有得到我期望的结果。
我在寄存器%rdi 中有一个变量,我需要在子程序中对其进行修改,并且我需要保留原始值以供以后使用。我要做的是将push的原始值放入堆栈,然后在子例程完成时再次检索它,例如,如果变量位于%rdi。
pushq %rdi
call subroutine
movq (%rsp), %rdi
现在,我不确定这是否是正确的做法?我在某处读过子程序将返回值推送到堆栈上,但这是否意味着我在尝试检索变量时必须包含偏移量?
我也知道我必须保持堆栈指针对齐 16 个字节,我不太确定我是否这样做。如果我不这样做,汇编器会不会给我一个错误,或者这可能是我的程序失败的原因吗?
顺便说一下,这个程序是作业的一部分,所以我不能和你分享代码,但我希望我的描述足够好。
【问题讨论】:
-
无法想象你的作业有什么秘密以至于你不能分享代码。
-
这不是秘密,但如果将整个程序发布在网站上并要求其他人纠正所有错误,那么我就处于作弊的边缘。
标签: assembly stack x86-64 calling-convention