x86-64指令系统

Posted chenxuming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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过程调用举例

 技术分享图片

技术分享图片

技术分享图片

技术分享图片

 

以上是关于x86-64指令系统的主要内容,如果未能解决你的问题,请参考以下文章

AMD64和X86_64

《深入理解计算机系统(第三版)》第四章

x86 32位操作码,x86-x64不同或完全删除

python学习之计算机基础详解

2018-2019-1 20165303 《信息安全系统设计基础》第四周学习总结

如果 x86-64 中没有兼容模式开关,我是不是保证不会遇到非 64 位指令?