logo
Home 女足世界杯决赛 x86 机器指令编码规则

x86 机器指令编码规则

  • 2025-07-31 13:14:22

x86 机器指令编码依次由一下部分组成:

指令前缀(prefix,非必需)

操作码(opcode,必需)

寻址方式 R/M(ModR/M,非必需)

比例因子-变址-基址(SIB,非必需)

地址偏移量(displacement,非必需)

立即数(immediate,非必需)

指令前缀

操作码

寻址方式 R/M

比例因子-变址-基址

地址偏移量

立即数

一、指令前缀

指令前缀(prefix)可有可无,可以有多个,每一个前缀都用一字节表示。指令前缀的名称和编码如下表所示。

种类

名称

二进制编码

说明

Lock

Lock

F0H

让指令在执行时先禁用数据线的复用特性,用在多核的处理器上,一般很少需要手动指定

rep

repne/repnz

F2H

用cx(16 位下)或ecx(32位下)或rcx(64位下)作为指令是否重复执行的依据

rep/repe/repz

F3H

同上

Segment Override

cs

2EH

段重载(默认数据使用 DS 段)

ss

36H

同上(强制指令使用该段寄存器)

ds

3EH

同上

es

26H

同上

fs

64H

同上

gs

65H

同上

rex

64 位

40H~4FH

x86-64 位的指令前缀

Operand size Override

Operand size Override

66H

用该前缀来区分访问 32 位或 16 位操作数;也用来区分 128 位和 64 位操作数

Address Override

Address Override

67H

64 位下指定用 64 位还是 32 位寄存器作为索引

rep 是串操作指令前缀,它又可细分为 rep、repz、repnz 等,重复执行操作指令,直到满足或者不满足某些条件。这三个前缀不会同时使用,最多只使用其中一个。

Segment Override 是跨段前缀。在分段内存管理模式下,使用跨段前缀来强制改变当前指令要访问的段,而不使用该机器指令默认访问的段。在扁平内存管理模式下,依然能在语句中使用跨段前缀,但是指令的功能等同无前缀。例如:

mov ebx,offset x ; x 是 data 段中定义的一个变量

mov eax,cs:[ebx] ; 机器码是 2E 8B 03

mov eax,[ebx] ; 机器码是 8B 03

后两条语句执行的结果是相同的。

Operand size Override 为操作数类型重载。在 .model flat 下,默认的操作数 32 位的(如使用 32 位的寄存器来访问操作数),此时不需要前缀。但是该环境下能够使用 16 位的操作数,在机器指令编码中增加前缀 66H,以区分指令是 16 位的操作数还是 32 位的操作数。例如:

mov ax,[ebx] ; 机器码是 66 8B 03

mov eax,[ebx] ; 机器码是 8B 03

由于 eax 和 ax 的编码是相同的(寄存器编码规则,在下面),从 "8B 03" 中区分不出使用的是 eax 还是 ax,故在使用 16 位操作数时,增加了类型重载前缀 66H。

al 的编码也与 eax、ax 的编码相同。"mov al,[ebx]" 的机器码是 8A 03,没有前缀。操作码(8AH)的最后一个二进制位为 0,表示是对字节进行操作;操作码(8BH)的最后一个二进制位为 1,表示是对字进行操作(32 位指令中默认的是 32 位的操作数)。

二、操作码

操作码(opcode)是操作符的编码,指明了要进行什么操作,长度为 1 个字节、2 个字节或者 3 个字节。大多数通用指令的操作码是单字节的,最多 2 个字节,但有的 FPU 指令、SSE 指令的长度为 3 个字节。在大多数指令的操作符编码中,最后一个二进制位(从右向左的第一个)用于指明操作数的类型,0 表示字节操作,1 表示字操作(32 位指令系统中为双字操作),在有指令前缀 66H 时为对字操作,在大多数双操作数指令中,操作码的倒数第二个二进制位(从右向左的第二个)为 1,表明目的操作数是寄存器寻址,为 0 表明源操作数是寄存器寻址。在有些指令中(如立即数传送给一个寄存器),操作码包含有寄存器的编码。另外,一般在 opcode 的编码中会体现出源操作码是否为立即数。例如:

mov byte ptr [ebx],al 的机器码是 88 03,其中 88H 的最后 2 位为 00,表明了字节运算和源操作数为寄存器。

mov al,[ebx] 的机器码是 8A 03,其中 8A 的最后 2 位为 10,指明了字节运算和目的操作数为寄存器。

mov al,11h 的机器码是 B0 11,在操作码中有使用的寄存器编码,同时也指明了源操作数是立即数。

三、寻址方式 R/M(ModR/M)

如果要有“寻址方式 R/M”编码,则它占 1 个字节,并指明了操作数的寻址方式。该字节分为三个自成部分,Mod(2 个二进制位)、Reg/opcode(3 个二进制位)、R/M(3 个二进制位)。它们的摆放顺序如下。

Mod(6~7 位)

Reg/opcode(3~5 位)

R/M(0~2 位)

Mod 和 R/M 用来共同确定一个操作数的寻址方式,对于基址加变址寻址方式,还要使用比例因子-变址-基址(SIB)。Reg/opcode 中的 opcode 是基本的指令操作码 opcode的扩展。Reg则是用来指明寄存器寻址方式中的寄存器编号。

在上操作数指令中,有源操作数的寻址方式、目的操作数的寻址方式,规定两个操作数不能同时为存储器寻址方式,立即数不能作为目的操作数的寻址方式。若不考虑源操作数是立即寻址这种情况(有无立即寻址的操作码中体现出来),则在双操作数指令中,一个是寄存器寻址(Reg),另一个是寄存器或存储器寻址(R/M)。它们在指令中的顺序可为

Previous Post
日本相机品牌有哪些 日本十大品牌相机
Copyright © 2088 cctv5在线直播世界杯_世界杯世界 - qw-cp.com All Rights Reserved.
友情链接