首页
社区
课程
招聘
[求助]高手请看这样的Opcode
发表于: 2012-3-6 16:05 4277

[求助]高手请看这样的Opcode

2012-3-6 16:05
4277
Opcode Instruction Op/En 64-bitModeCompat/ Leg Mode escription
83 /0 ib ADD r/m32, imm8 MI Valid Valid Add sign-extended imm8 to r/m32.

83 /4 ib AND r/m32, imm8 MR Valid Valid r/m32 AND imm8 (sign-extended).

请问这两个opcode的 /0 和 /4, ib MI和MR这些参数都是啥意思啊,上面摘自Intel开发指南三卷本第2卷指令参考

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 2242
活跃值: (488)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
2
3.1.1 Instruction Format 都有说明

/digit — A digit between 0 and 7 indicates that the ModR/M byte of the
instruction uses only the r/m (register or memory) operand. The reg field
contains the digit that provides an extension to the instruction's opcode.
2012-3-6 16:36
0
雪    币: 360
活跃值: (257)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
/0, /4 是用來在在 ModR/M 表格裡面查表用的, 可以從 0 - 7
ib 代表立即值的意思 (Immediate Byte), 可以是 ib (byte), iw (word), id (dword), io (qword)

就用你的 opcode, 16bits decode 來解釋好了

opcode1: 83 00 AA
opcode2: 83 20 00

這裡沒有prefix (*1), 所以 83 就是 opcode, 先不管他, 我們要晚一點才能決定

opecode1 的 ModR/M 解碼出來是
Mod: 00
Reg/Opcode: 000
R/M: 000

根據 Intel Instruction set reference 的表格 2-1. 16-Bit Addressing Forms with the ModR/M Byte, 我們可以得知

Mod R/M
00   000  = [BX+SI]

這裡是 imm8, 所以 Reg/Opcode = 0 代表 /0, 因此這個 instruction 是 83 /0, 翻譯出來就是:
add word [bx+si], 0ffaah  (根據手冊, 這個 ib 是 sign extended的)

opecode2 的 ModR/M 解碼出來是
Mod: 00
Reg/Opcode: 100
R/M: 000

這裡是 imm8, 所以 Reg/Opcode = 4 代表 /4, 因此這個 instruction 是 83 /4, 翻譯出來就是:
and word [bx+si], 0000h  (根據手冊, 這個 ib 是 sign extended的)

*1:
Prefix 有五大種類: LOCK, Segment override, Operand-size override, Address-size orerride
2012-3-6 17:12
0
雪    币: 147
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
cuidaniu<haodaniu@126.com>  17:09:26
Opcode Instruction Op/En 64-bitModeCompat/ Leg Mode escription
83 /0 ib ADD r/m32, imm8 MI Valid Valid Add sign-extended imm8 to r/m32.

83 /4 ib AND r/m32, imm8 MR Valid Valid r/m32 AND imm8 (sign-extended).

请问这两个opcode的 /0 和 /4, ib MI和MR这些参数都是啥意思啊,上面摘自Intel开发指南三卷本第2卷指令参考
貌似这个/0和/4是从操作码,ib是立即数是单字节,不知道立即数是单字节是从哪个位得知的,不知道前面的猜测是否正确
cuidaniu<haodaniu@126.com>  17:14:24
8365 F8 00      AND DWORD PTR SS:[EBP-8],0    83(opcode) 65(modr/m 01 100 101(01表示寄存器做地址并加一字节偏移,中间 那个100明显不能作为第1个操作数寄存器因为是esp,此处明显是从操作码是主操作码83的附属操作码100即4所以83 /04即为AND,101表示是[esp] [F8]是偏移,所以SS:[EBP+F8]也就是SS:[EBP-8]即为第1个操作数,83主操作码的最后1位w=1,所以内存操作数是32位是DWORD PTR SS:[EBP-8];那么接下来的第2个操作数是什么呢,为什么是单字节立即数呢)
如果是81 /04也是AND指令可是为什么他就是后面的立即数操作数是双字立即数呢,是否跟主操作码的第2位有关呢
2012-3-6 17:17
0
雪    币: 360
活跃值: (257)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
喔, 這要看前面的 prefix 決定是 word or dword.
Operand-size override prefix 66h

16bits 缺省是word, override以後是 dword.
32bits 缺省是dword, override以後是 word.
2012-3-6 17:31
0
雪    币: 147
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼上的大哥,是操作数单字和双字要用66切换,这个默认是32位的,没用66,但是立即数是单字节就是最后的第2个操作数是立即数(因为前面1个操作数是内存操作数,而modr/m的中间三位已经用作了从操作码,最后三位用作寻址内存操作数并加一个字节的偏移,所以第2个操作数必定为立即数(modr/m所有的位已经用光了,所以没有可表示寄存器的了,而如果是偏移值内存操作数的话,不能原操作数和目的操作数都是内存操作数,所以也不可能,而最后三位是101不是100所以没有sib字节)
不明白的是第2个立即操作数什么时候是单字节,什么时候是双字,根据哪些位来判断
2012-3-6 17:54
0
雪    币: 360
活跃值: (257)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
Operand-size 是靠prefix決定的, 因此:

     81 00 00000000 =   add     dword ptr [eax],0
66 81 00 0000         =   add     word ptr [eax],0

     81 20 00000000 =   and     dword ptr [eax],0
66 81 20 0000         =   and     word ptr [eax],0
2012-3-6 18:14
0
雪    币: 147
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼上的大哥,那你怎么用局部寄存器AH,AL,BH,BL等等呢,大哥,你没有理解我的意思
2012-3-6 18:27
0
雪    币: 360
活跃值: (257)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
說真的我是不太懂你的意思.. 大概我中文不太好

81 /4 本身的格式是

AND reg16/mem16, imm16
AND reg32/mem32, imm32

所以假設目前32bits mode, opcode = 81 E0 01000000

E0 = 11, 100, 000

Reg/Op = 4 (100), 所以是 /4

Mod 11, R/M 000 是選到 EAX, AX, AL, MM0, XMM0 這一組.
但是 81 只吃 Reg16/32, 所以這一組只有可能是 EAX 或是 AX.

而目前是32bits, 所以缺省是選擇 EAX

所以是 and eax, 00000001h

如果是 66 81 E0 0100 就是 and ax, 0001h, 因為被 override 了

如果你要操作 AH,AL,BH,BL..

如果是 AND al, imm8, 那有一個特殊的 opcode, 24 ib

如果是 AND ah/bh/bl, imm8, 那是 80 Ex 01
AH  = Mod 11, R/M 100 選到 ESP/SP/AH/MM4/XMM4, 但是 80 只吃 reg8, 所以選到 AH
BH = Mod 11, R/M 111 選到 EDI/DI/BH/MM7/XMM7,  但是 80 只吃 reg8, 所以選到 BH
BL = Mod 11, R/M 011 選到 EBX/BX/BL/MM3/XMM3,  但是 80 只吃 reg8, 所以選到 BL
2012-3-6 18:52
0
游客
登录 | 注册 方可回帖
返回
//