X64调用规范

摘要:
CALL指令将8字节的返回地址推送到堆栈上。因此,除了从堆栈指针中减去32以存储寄存器参数之外,调用者还应减去8.7。在执行被调用的子例程之后,调用者应该负责从运行时堆栈中删除所有参数和影子子空间。
1.由于地址长度为64位,因此CALL指令把RSP(堆栈指针)寄存器的值减去8.
2.第一批传递子程序的四个参数依次存放于寄存器RCX、RDX、R8、R9。因此,如果只传递一个参数就会放到RCX寄存器中。如果还有第二参数就会将其放入RDX寄存器中,其他参数从右至左入栈。
3.长度不足64位的参数不进行零扩展,因此,其高位的值是不确定的。
4.如果返回值的长度小于或者等于64位,那么它必须放在RAX寄存器中。
5.主调者负责在堆栈中分配至少32字节的影子空间,以便被调用的子程序可以选择将寄存器的值保存在这个区域。
6.调用子程序时,堆栈指针(RSP)必须对齐16字节边界。CALL指令将8字节的返回地址压入堆栈,因此,主调程序除了把堆栈指针减去32以便存放寄存器参数外,还要减去8(本人注:所以写64位汇编的时候老是开栈28h,48h的).
7.被调用子程序执行结束后,主调程序需负责从运行时堆栈中移除所有的参数及影子空间(编译器为RC、RDX、R8、R9预留的空间)。
8.大于64位的返回值存放于运行时堆栈,由RCX指出其位置。
9.寄存器RAX、RCX、RDX、R8、R9、R10和R11常常被子程序修改,因此,如果主调程序想要保存他们的值,就应在调用子程序之前将它们入栈,之后再将其从堆栈中弹出。
10.寄存器RBX、RBP、RDI、RSI、R12、R13、R14和R15的值必须由子程序保存。

免责声明:文章转载自《X64调用规范》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇xios封装unittest与pytest的区别下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ucosiii任务管理相关知识

只要学习和理解:任务状态 任务堆栈 任务控制块 任务就绪表 任务调度和切换 关于任务状态: 任务堆栈是任务的重要部分,堆栈是在RAM中按照“先进先出(FIFO)”的原则组织的一块连续的内存空间。为了满足任务切换和相应中断时保存CPU寄存器中的内容及任务调用其他函数时的需要,每个任务都应该有自己的堆栈。 1、任务堆栈的创建: UCOSIII中任务堆栈的创建...

C++ 常见崩溃问题分析

一、前言 从事自动化测试平台开发的编程实践中,遭遇了几个程序崩溃问题,解决它们颇费了不少心思,解决过程中的曲折和彻夜的辗转反侧却历历在目,一直寻思写点东西,为这段难忘的经历留点纪念,总结惨痛的教训带来的经验,以期通过自己的经历为他人和自己带来福祉:写出更高质量的程序; 由于 C 和 C++ 这两种语言血缘非常近,文本亦对 C 编程语言有借鉴作用; 二、C+...

ASM

在学习汇编之前,我们要介绍一下常用的函数调用约定,以便我们对于一些指令的理解。 函数调用约定 常见的函数调用约定:stdcall , cdecl, fastcall, thiscall, naked call 1, __cdecl(C调用约定.)C/C++ 缺省调用方式 1)压栈顺序: 函数参数从右到左 2)参数栈维护: 由调用函数把参数弹出栈,传送参数的...

逆向so文件调试工具ida基础知识点

1.界面介绍 https://www.freebuf.com/column/157939.html 2.IDA常用快捷键 切换文本视图与图表视图 空格键 返回上一个操作地址 ESC 搜索地址和符号 G 对符号进行重命名 N 常规注释 '冒号键 可重复注释 分号键 添加标签 Alt+M 查看标签 Ctrl+M 查看段的信息 Ctrl+S 查看交叉应用...

解析IOS控制台利用GDB命令查看报错堆栈

解析IOS控制台利用GDB命令查看报错堆栈是本文要介绍的内容,在ios开发中,如果提前释放一个指针的内存,在以后还继续使用这个指针,那么程序会立刻crash掉,而且很难有报错信息,我以前都是靠猜测去判断错误的原因,我们应该利用工具去找到错误的地方,然后快速准确的定位到错误地方,及其错误原因,最后进行改进。 其实ios控制台,提供这种机制,如果你选择debu...

UCOSIII任务创建

UCOSIII任务创建: 首先要确保UCOSIII移植成功; 一般以下几个步骤就行了: 第一步:写好任务所需的 优先级、堆栈、控制块等; 然后顺便声明下任务函数; 第二步:开始创建函数 源码: 1 #include "led.h" 2 #include "delay.h" 3 #include "sys.h" 4 #include "usart.h"...