好像中文资料真少,难道国内真的每人研究这个?
算了,其实英文资料就放在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 | 编码 | reg | r/m | ||||||||||||||||||||||||||
00 |
|
|
| ||||||||||||||||||||||||||
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 = 00 | index |
000 | EAX |
001 | ECX |
010 | EDX |
011 | EBX |
100 | 空 |
101 | EBP |
110 | ESI |
111 | EDI |
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表示地址大小,他们的准确意思是什么?
还有关于操作码,还有很多需要了解的地方,请各位赐教!