x86-64指令系统
x86-64指令系统概述
x86-64中各类数据的长度
x86-64的通用寄存器
新增8个64位通用寄存器(整数寄存器) • R8、R9、R10、R11、R12、R13、R14和R15。 • 可作为8位(R8B~R15B)、16位(R8W~R15W)或 32位寄存器(R8D~R15D)使用 – 所有GPRs都从32位扩充到64位 • 8个32位通用寄存器EAX、EBX、ECX、EDX、EBP、 ESP、ESI和 EDI对应扩展寄存器分别为RAX、RBX、 RCX、RDX、RBP、RSP、RSI和RDI • EBP、ESP、ESI和 EDI的低8位寄存器分别是BPL、SPL 、SIL和DIL • 可兼容使用原AH、BH、CH和DH寄存器 ( 使原来IA-32中的每个通用寄存器都可以是8位、16位、 32位和64位,如:SIL、SI、ESI、RSI) #################################### 指令可直接访问16个64位寄存器:RAX、RBX、RCX、RDX、 RBP、RSP、RSI、RDI,以及R8~R15 – 指令可直接访问16个32位寄存器:EAX、EBX、ECX、EDX、EBP 、ESP、ESI、EDI,以及R8D~R15D – 指令可直接访问16个16位寄存器:AX、BX、CX、DX、BP、SP、 SI、DI,以及R8W~R15W – 指令可直接访问16个8位寄存器:AL、BL、CL、DL、BPL、SPL 、SIL、DIL,以及R8B~R15B – 为向后兼容,指令也可直接访问AH、BH、CH、DH – 通过寄存器传送参数,因而很多过程不用访问栈,因此,与IA-32 不同,x86-64不需要帧指针寄存器,即RBP可用作普通寄存器使用 – 程序计数器为64位寄存器RIP
x86-64的地址和寻址空间
字长从32位变为64位,64位(8B)数据被称为一个四字(qw: quadword) – 逻辑地址最长可达为64位,即理论上可访问的存储空 间达264字节或16EB(ExaByte) – 编译器为指针变量分配64位(8B) – 基址寄存器和变址寄存器都应使用64位寄存器 – 但实际上,AMD和Intel的x86-64仅支持48位虚拟地 址,因此,程序的虚拟地址空间大小为248=256TB
x86-64中数据的对齐
各类型数据遵循一定的对齐规则,而且更严格
– 存储器访问接口被设计成按8字节或16字节为单位进行
存取,其对齐规则是,任何K字节宽的基本数据类型和
指针类型数据的起始地址一定是K的倍数。
• short型数据必须按2字节边界对齐
• int、float等类型数据必须按4字节边界对齐
• long、double、指针型变量必须按8字节边界对齐
• long double型数据必须按16字节边界对齐
x86-64的基本指令
数据传送指令(助记符“q”表示操作数长度为四字(即64位)) movabsq I, R:将64位立即数送64位通用寄存器 movq:传送一个64位的四字 movsbq、movswq、movslq:将源操作数进行符号扩展并传送 到一个64位寄存器或存储单元中 movzbq、movzwq:将源操作数进行零扩展后传送到一个64位寄 存器或存储单元中 movl:的功能相当于movzlq指令 pushq S:R[rsp]←R[rsp]-8; M[R[rsp]] ←S popq D: D← M[R[rsp]]; R[rsp]←R[rsp]-8 ########### 常规的算术逻辑运算指令 只要将原来IA-32中的指令扩展到64位即可。例如: – addq(四字相加) – subq(四字相减) – incq(四字加1) – decq(四字减1) – imulq(带符号整数四字相乘) – orq(64位相或) – salq(64位算术左移) – leaq(有效地址加载到64位寄存器)
算术逻辑指令
x86-64的过程调用
看一个简单的例子
x86-64过程调用的参数传递
– 通过通用寄存器传送参数,很多过程不用访问栈,故执行时间 比IA-32代码更短 – 最多可有6个整型或指针型参数通过寄存器传递 – 超过6个入口参数时,后面的通过栈来传递 – 在栈中传递的参数若是基本类型,则都被分配8个字节 – call(或callq)将64位返址保存在栈中之前,执行R[rsp]←R[rsp]-8 – ret从栈中取出64位返回地址后,执行R[rsp]←R[rsp]+8
x86-64过程调用举例
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)