例如,%rdi是否保存传递给x86-64中的函数的第一个参数的值,或者它是否保存可以找到第一个参数值的地址?换句话说,%rdi是否保存第一个参数的值或对参数的引用?换句话说,如果我在mov或cmp这样的上下文中执行%rdi或(%rdi),我会得到第一个参数的值吗?
3qpi33ja1#
首先,有些语言默认通过引用传递参数,有些通过值传递参数,你没有提到它是用什么语言写的。C/C++通过值传递标量参数(int s最多64位,指针),因此它是%rdi。在更一般的情况下,它取决于参数的数据类型。从技术上讲,汇编程序不受调用约定的约束,只要它能工作。工具可能会被抛弃,但选择是坚持约定,调整它,还是提出自己的约定。此外,调用约定取决于操作系统。您没有提到您使用的是哪一个,但您提到RDI强烈建议使用Linux。以下是Linux x86-64调用约定的参考:https://www.ired.team/miscellaneous-reversing-forensics/windows-kernel-internals/linux-x64-calling-convention-stack-frame
int
1条答案
按热度按时间3qpi33ja1#
首先,有些语言默认通过引用传递参数,有些通过值传递参数,你没有提到它是用什么语言写的。
C/C++通过值传递标量参数(
int
s最多64位,指针),因此它是%rdi。在更一般的情况下,它取决于参数的数据类型。从技术上讲,汇编程序不受调用约定的约束,只要它能工作。工具可能会被抛弃,但选择是坚持约定,调整它,还是提出自己的约定。
此外,调用约定取决于操作系统。您没有提到您使用的是哪一个,但您提到RDI强烈建议使用Linux。以下是Linux x86-64调用约定的参考:
https://www.ired.team/miscellaneous-reversing-forensics/windows-kernel-internals/linux-x64-calling-convention-stack-frame