能力值:
( 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.
能力值:
( 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
能力值:
( 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位有关呢
能力值:
( LV2,RANK:10 )
5 楼
喔, 這要看前面的 prefix 決定是 word or dword.
Operand-size override prefix 66h
16bits 缺省是word, override以後是 dword.
32bits 缺省是dword, override以後是 word.
能力值:
( LV2,RANK:10 )
6 楼
楼上的大哥,是操作数单字和双字要用66切换,这个默认是32位的,没用66,但是立即数是单字节就是最后的第2个操作数是立即数(因为前面1个操作数是内存操作数,而modr/m的中间三位已经用作了从操作码,最后三位用作寻址内存操作数并加一个字节的偏移,所以第2个操作数必定为立即数(modr/m所有的位已经用光了,所以没有可表示寄存器的了,而如果是偏移值内存操作数的话,不能原操作数和目的操作数都是内存操作数,所以也不可能,而最后三位是101不是100所以没有sib字节)
不明白的是第2个立即操作数什么时候是单字节,什么时候是双字,根据哪些位来判断
能力值:
( 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
能力值:
( LV2,RANK:10 )
8 楼
楼上的大哥,那你怎么用局部寄存器AH,AL,BH,BL等等呢,大哥,你没有理解我的意思
能力值:
( 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