标签:long 类型 指针 寻址 需要 dash 左移 基本 nbsp
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字节边界对齐
数据传送指令(助记符“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过程调用的参数传递
– 通过通用寄存器传送参数,很多过程不用访问栈,故执行时间 比IA-32代码更短 – 最多可有6个整型或指针型参数通过寄存器传递 – 超过6个入口参数时,后面的通过栈来传递 – 在栈中传递的参数若是基本类型,则都被分配8个字节 – call(或callq)将64位返址保存在栈中之前,执行R[rsp]←R[rsp]-8 – ret从栈中取出64位返回地址后,执行R[rsp]←R[rsp]+8
x86-64过程调用举例
标签:long 类型 指针 寻址 需要 dash 左移 基本 nbsp
原文地址:https://www.cnblogs.com/chenxuming/p/9689747.html