X64处理器架构简单介绍

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

X64处理器架构

X64架构是一个向后兼容的扩展的x86。提供了和x86相同的32位模式和一个新的64位模式。

术语“x64”包括AMD 64 和Intel64,他们的指令集基本是相同的。

寄存器(Registers)

X64将x86的8个通用寄存器扩展为64位,并且增加8个新的64位寄存器。64位寄存器命名以“r”开始,例如:eax扩展为64位就是rax,8个新的64位寄存器命名为r8到r15。

每个寄存器的低32位,16位,8位可以作为操作数直接寻址,这包括向esi 这样的寄存器,以前他的低8位不可以直接寻址。下表说明了64位寄存器的地位部分在汇编语言中的命名。

64-bit register Lower 32 bits Lower 16 bits Lower 8 bits

rax eax ax al

rbx ebx bx bl

rcx ecx cx cl

rdx edx dx dl

rsi esi si sil

rdi edi di dil

rbp ebp bp bpl

rsp esp sp spl

r8r8d r8w r8b

r9r9d r9w r9b

r10r10d r10w r10b

r11r11d r11w r11b

r12r12d r12w r12b

r13r13d r13w r13b

r14r14d r14w r14b

r15r15d r15w r15b

对一个32位寄存器操作会自动用零扩展填充整个64位寄存器。对8位和16位寄存器的操作不会零扩展填充高位(这是和x86兼容的)。

ax,bx,cx和dx的高8位ah,bh,ch,dh仍就是可以寻址的,但是不能用在所有类型的操作数。

指令指针寄存器eip和flags也被扩展到64位(分别为rip和rflags)。

X64处理器也提供几个浮点寄存器:

·8个80位的x87寄存器

·8个64位的MMX寄存器

·以前的8个128位SSE寄存器增加到16个

调用约定(Calling Conventions)

跟x86不同,在x64下c/c++编译器仅支持一种调用约定,这种调用约定利用了在x64下可用寄存器的增加。

·前四个整型值或指针参数传给寄存器rcx,rdx,r8,和r9。调用函数在堆栈上保留空间为这些参数。

·前四个浮点参数传给前四个SSE寄存器xmm0-xmm3.

·调用函数在堆栈上保留空间为传递给寄存器的参数。被调用函数利用这些空间将寄存器的内容存入堆栈。

·任何其他参数存入堆栈

·一个整型或指针返回值存在rax寄存器中,如果返回值是浮点则返回在xmm0中

·rax,rcx,rdx,r8-r11是要变化的

·rbx, rbp, rdi, rsi, r12-r15不变

这个调用约定跟c++是非常相似的:this指针作为第一个隐含的参数被传递,后面三个参数传递给寄存器,剩下的存入堆栈。

寻址方式(Addressing Modes)

在64位模式下的寻址方式类似于x86但是不是完全相同。

·指令涉及到64位寄存器会自动执行64位精度。(例如mov rax,[rbx]

是将rbx所指向的地址开始的8字节存入rax)

·一个特别的指令mov的立即数常量或常量地址已经增加为64位,对于

其他的指令立即数常量或常量指针仍就是32位。

·x64提供了一个新的rip相关的寻址模式。如果指令涉及到常量地址

以rip为偏移。例如mov rax,[addr]操作将地址addr+rip指向地址开

始的8字节数存入rax。

Jmp,call,push和pop指令涉及到的指令指针和堆栈指针都为64位在x64中。

x64 指令集

大多数x86指令在x64的64位模式下是有效的。在64位模式下一些很少用到的指令不再支持。例如:

·BCD码算术指令:AAA,AAD,AAM,AAS,DAA,DAS

·BOUND

·PUSHAD 和POPAD

·大多数的操作要处理段寄存器,例如PUSH DS 和 POP DS。(对FS和 GS段寄存器的操作仍然有效)

X64指令集包括最近增加的x86指令例如SSE2,程序中可以自由的使用这些指令。

数据传送(Data Transfer)

X64提供新的MOV指令的变量来处理64位立即数常量或内存地址。

MOV r,#n r = #n

MOV rax, m 传送64位地址处的内容到rax.

MOV m, rax传送rax的内容到64位地址处

X64也提供一个新的指令符号扩展32位到64位

MOVSXD r1, r/m 传送 DWORD 符号扩展到 QWORD.

一般MOV操作32位子寄存器自动零扩展到64位,因此没有MOVZXD指令。

Ordinary MOV operations into 32-bit subregisters automatically zero extend to 64 bits, so there is no MOVZXD instruction.

两个SSE指令可以用来传送128位值(例如GUIDs)从内存到xmm n 寄存器或相反。

Two SSE instructions can be used to move 128-bit values (such as GUIDs) from memory to an xmm n register or vice versa.

MOVDQA r1/m,

r2/m Move 128-bit aligned value to xmm n register, or vice versa.

传送128位对齐值到xmm n 寄存器,或相反

MOVDQU r1/m,

r2/m Move 128-bit value (not necessarily aligned) to register, or vice versa.

传送128位值(不是必须对齐)到寄存器或相反

数据转换(Data Conversion)

CDQE 转换 dword (eax) 为 qword (rax). CQO 转换 qword (rax) 为 oword (rdx:rax).

字符串操作(String Manipulation)

MOVSQ Move qword from rsi to rdi.

将rsi指向的字符串传送到rdi指向地址

相关文档
最新文档