x86机器指令的编码方式


好像中文资料真少,难道国内真的每人研究这个?
算了,其实英文资料就放在intel那里,要多少有多少,虽然我不会英文。
因为语言的原因,恐怕造就了不少所谓的“高手”吧。呵呵。
希望有组织系统的翻译一些基础资料,这种东西太少了。

我参考得是intel指令手册,因为看得糊里糊涂,有些意思没有弄懂。

机器指令的一般构成格式:
1。前缀 ,共4种,可以0~4种结合起来,所以字段0~4字节。
2。指令,1~2字节,至于如何判断是1,还是2字节,不清楚。希望告知。
3。寻址方式, 0~1字节,有的指令没有操作数或者不用指明操作数,所以就不必要有寻址方式了。
4。比例因子, 0~1字节,16位指令是没有这个的,是32位变址的一个附带系数。
5。偏移量, 1,2,4字节。16位是1或2,32位是1或4。
6。立即数, 1,2,4字节。

其中,指令段的编码方式我还不是很了解。
而重点讨论寻址方式和比例因子段。


寻址方式段的构成:
0,1,2   r/m 
3,4,5  reg
6,7    mod

指令一个特点,就是不能有两个是内存操作数,而复杂的寻址方式,都是针对内存的,所以寻址方式段的构成,就是一头重,一头轻的特点。r/m 和 mod共同确定复杂的一方,而reg指定简单的一方。其中reg可能成为指令的一部分,主要情况是操作数是立即数的时候。

mod编码regr/m
00
000
001
010
011
100
101
110
111

al ax eax
cl cx ecx
dl dx edx
bl bx ebx
ah sp esp
ch bp ebp
dh si esi
bh di edi

EAX
ECX
EDX
EBX
比例扩展
直接寻址
ESI
EDI

01+8偏移量
10+16/+32偏移量
11寄存器寻址 类似reg

  这个表没有全面覆盖16位寻址方式。

比例因子段的构成方式:
0,1,2 base 
3,4,5 index
6,7 ss

 base是基址,与reg编码类似。但是当mod = 00时,101是空基址。
 
ss = 00index
000EAX   
001ECX
010EDX
011EBX
100
101EBP
110ESI
111EDI

ss = 01 时比例因子是2, 10 = 4, 11 = 8。

然后,我们来实践一下手动汇编的过程。

mov eax, [ebp + esi * 8 + 500h]

前缀是 67 66
指令码是 8b

reg  000
mod 10
r/m 100
10000100 =84

base 101
ss 11
index 110
11110101 =f5

偏移量段
00h 05h 00h 00h

立即数段 没有

结果就是 67668b84f500050000

注意这条指令在32位程序中,是没有前缀的。

好,到此就告一段落了,我希望大家能跟我讨论一下以下问题。

前缀66h表示操作数大小,而67h表示地址大小,他们的准确意思是什么?
还有关于操作码,还有很多需要了解的地方,请各位赐教!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值