想必现在好多人对于理解intel手册汇编指令都比较感兴趣,如今小黑也是在网络上整理了一些关于intel的汇编手册相关的信,....更多关于理解intel手册汇编指令的生活知识,我们随着小编整理的知乎问答:详细内容一起继续深入学习吧。

理解intel手册汇编指令
想必现在好多人对于理解intel手册汇编指令都比较感兴趣,如今小黑也是在网络上整理了一些关于intel的汇编手册相关的信息分享给大家,希望大家会喜欢。
指令前缀:分为四组,每个前缀最多一个字节,一个指令最多四个前缀。
REX前缀:
REX前缀是64位模式下使用的指令前缀字节,如下:
并非所有的指令都需要64位模式REX前缀。前缀只有在指令引用扩展寄存器之一或64位操作数时才需要。如果REX前缀使用毫无意义,会被忽略。每个指令只允许一个REX前缀。如果使用,REX前缀字节必须靠近操作码字节或转义操作码字节(0FH)。当REX当前缀与包含强制前缀的指令一起使用时,必须出现强制前缀REX之前,这样REX前缀可直接位于操作码或转义字节的前面。例如,带有REX前缀的CVTDQ2PD应该将REX放在F3和0F E6之间。忽略了其它位置。15字节的指令尺寸限制仍然适用于REX前缀指令。
操作码(OPCode):
主操作码的长度可以是1、2或3个字节。一个额外的三位操作码字段有时会被编码ModR/M字节中。主操作代码中可以定义较小的字段。这些字段定义了操作方向、位移大小、存储代码、条件代码或符号扩展。操作代码中使用的代码字段 根据操作类使用的编码字段因操作类别而异。
ModR/M 和 SIB 字节:
许多在内存中引用操作数的指令在主操作代码后面都有一个搜索符字节(称为ModR/M字节)。ModR/M字节包含三个字段的信息:
某些编码的ModR/M字节需要第二个字节(SIB字节)。32位寻址的基数加索引和比例加索引形式需要SIB字节。SIB字节包括以下字段:
偏移和即时数字节:
一些寻址形式包括跟踪ModR/M字节后面的位移(如果有,也可以SIB字节)。如果需要位移,可以是1、2或4个字节。
如果指令指定了立即操作数,则操作数始终跟随任何偏移字节。立即操作数可以是1、2或4个字节。
其他
平坦内存
分段内存
实模式内存
Intel保护模式
Y
Y
Y
实地址模式
N
N
Y
系统管理模式
N
N
Y
兼容模式
Y
Y
Y
64位模式
Y
N
N
源操作数:
目的操作数:
立即数:
寄存器:
32位寄存器
64位寄存器
内存地址(内存有效地址):
Intel语法形式为 segreg:[base index*scale disp],而AT&T语法形式为 %segreg:disp(�se,%index,scale)
64个寄存器取代了64个
I/O端口:
每个外设都由读写寄存器控制。外部寄存器也被称为I/O端口通常包括三类:控制寄存器、状态寄存器和数据寄存器。
寄存器参与内存统一编码,访问寄存器就像访问一般内存,所以,这个CPU没有专门用于设备的设备I/O的指令。这叫I/O内存方式。另一类CPU,将外设寄存器视为一个独立的地址空间,因此访问内存的指令不能用于访问这些寄存器,而是为外设寄存器的读写设置特殊指令,如IN和OUT指令。这叫 I/O端口。
Intel支持以上两种方式。
在线汇编
符号缩写说明:
Opcode列:
cb, cw,
cd, cp,
co, ct
操作码后面的1字节(cb)、2字节(cw)、4字节(cd)、6字节(cp)、8字节(co)或10字节(ct)值。该值用于指定代码偏移量,或指定代码段寄存器的新值。
ib,
iw,
id, io
一个1字节(ib)、2字节(iw)、4字节(id)或8字节(io)用于操作代码、ModR/M字节或标度索引字节后的指令。操作代码决定了操作数是否为符号值。小端字节序是所有单词、双字和四字的第一个。
rb,
rw,
rd,
ro
代表操作码字节的低3位用于编码,无需编码modR/M寄存器字节操作数。
该指令列出了相应的1616进制值为000b。在非64位模式下,将寄存器代码从0到7添加到操作码字节的16进制值。在64位模式下表示REX.b的4位字段和opcode[2:0]字段编码指令的寄存器操作数。" ro "只适用于64位模式。
/r
表示指令的ModR/M字节包含寄存器操作数和一个r/m操作数。
/digit
0到7之间的数字表示指令ModR/M字节只使用r/m(寄存器或内存)操作数。reg为指令的操作码提供扩展的字段。
i
操作数之一是FPU寄存器堆的ST(i)浮点指令中使用的数字。i(范围从0到7)加入加号左侧给出的16进制字节,形成操作码字节。
REX.W
使用影响操作数或指令语义的表示REX前缀。请注意,将传统指令提升到64位REX操作码栏中没有明确列出前缀。
NP
Instruction列:
rel8
rel8 — 从128字节到127字节。
rel16,
rel32
相对地址与指令装配在同一代码段。rel16 符号适用于操作数属性为16位的指令;rel32符号适用于操作数属性为32位的指令。
ptr16:16,
ptr16:32
一个远程指针通常指向不同于指令的代码段。符号16:16表示指针值有两部分。冒号左侧的值为16位选择器或代码段寄存器的值。右侧的值对应于目标段的偏移。当指令的操作数属性为16位时使用ptr16:16符号;当操作数属性为32时使用ptr16:32符号。
r8
单字节通用寄存器之一。AL、CL、DL、BL、AH、CH、DH、BH、BPL、SPL、DIL和SIL;或者使用REX.R字节寄存器可模式的字节寄存器(R8L - R15L)。
r16
一个字通用寄存器。AX、CX、DX、BX、SP、BP、SI、DI;或使用REX.R可用于64位模式的单词寄存器(R8-R15)。
r32
一个双字通用寄存器。EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI;或在64位模式下使用REX.R可用的双字寄存器(R8D - R15D)。
r64
四字通用寄存器之一。RAX, RBX, RCX, RDX, RDI, RSI, RBP, RSP, R8-R使用这些REX.R可用于64位模式。
imm8
立即字节值。imm符号介于-128和 127之间有符号。imm结合单词或双字操作数的指令,立即将符号扩展为单词或双字。单词的最后一个字节填写在立即值的顶部。
imm16
用于操作数属性为16位的指令的立即字值。这是介于-32、768和 32、767之间的数字。
imm32
用于操作数属性为32位的指令的立即双字值。允许使用 2、147、483、647、2、147、483、648之间的数字。
imm64
用于操作数属性为64位的指令的即时四字值。允许使用该值 9、223、372、036、854、775、807、9、223、372、036、854、775、808之间的数字。
m
16位、32位或64位内存操作数。
m8
内存中的字节操作数通常表示为变量或数组名称,但由DS:(E)SI或ES:(E)DI寄存器指向。在64位模式下RSI或RDI寄存器指向。
m16
内存中的单词操作数通常表示为变量或数组名称,但由DS:(E)SI或ES:(E)DI寄存器指向。此命名法仅用于字符串指令。
m32
内存中的双字操作数通常表示为变量或数组名称,但由DS:(E)SI或ES:(E)DI寄存器指出。此命名法仅用于字符串指令。
m64
内存中的内存四字操作数。
m128
双四字操作数在内存中。
m16:16,
m16:32,
m16:64
一个内存操作数,包由两个数字组成的远程指针。冒号左侧的数字对应于指针的段选择器。右边的数字对应于它的偏移。
m16&32,
m16&16,
m32&32,
m16&64
由数据项组成的内存操作数的大小是&左右符号表示。允许所有内存搜索模式。m16&16和m32&32操作数被BOUND使用指令,提供包含数组索引的上下限操作数。m16&32操作数被LIDT和LGDT用来提供一个字,用来加载极限字段和一个双字,用来加载相应的字GDTR和IDTR寄存器的基字段。LIDT和LGDT在64位模式下使用m16&64操作数,为加载极限字段提供一个单词,并加载相应的四个单词GDTR和IDTR寄存器的基字段。
moffs8,
moffs16,
moffs32,
moffs64
一种简单的内存变量(内存偏移),用于字节、单词或双字,MOV指令的一些变体。实际地址是由相对于段基的简单偏移给出的。该指令未使用ModR/M字节moffs数字表示其大小,由指令的地址属性决定。
Sreg
分段寄存器。段寄存器的位置分布ES=0,CS=1,SS=2,DS=3,FS=4,GS=5。
m32fp,
m64fp,
m80fp
内存中的单精度、双精度和双扩展精度(分别)浮点操作数。这些符号指定浮点值作为x87 FPU浮点指令的操作数。
m16int,
m32int,
m64int
内存中的一个字,双字和四字整数(分别)操作数。这些符号指定整数作为x87 FPU整数指令的操作数。
ST or ST(0)
FPU寄存器堆栈的顶部元素。
ST(i)
从FPU第一个元素从寄存器堆栈顶部开始(i ← 0到7)。
r/m8,
r/m16,
r/m32,
r/m64
寄存器或此内存。

以上就是小编为你精心整理的【生活学习】理解intel手册汇编指令(知乎问答:intel的汇编手册)的全部内容,希望对你于了解《intel的汇编手册》相关内容有所帮助。
标签:
理解intel手册汇编指令