在裝配中經常有類似的說明:大會指令數學語法
mov eax, [ebp+4]
mov eax, [ebx + ecx*4]
我的問題是:我能在這個brakets嗎? 我可以添加和相乘所有寄存器和立即數還是有限制? 我也可以使用除法和減法嗎? 我用谷歌搜索它,但我找不到任何好的參考。
在裝配中經常有類似的說明:大會指令數學語法
mov eax, [ebp+4]
mov eax, [ebx + ecx*4]
我的問題是:我能在這個brakets嗎? 我可以添加和相乘所有寄存器和立即數還是有限制? 我也可以使用除法和減法嗎? 我用谷歌搜索它,但我找不到任何好的參考。
在32位和64位模式下的地址操作數的一般格式是:
[reg1 + reg2*mult + ofs]
mult
必須是1,2,4,8之一。 是立即數,即一個常數值。它可以是積極的或消極的。
並非所有三個部分都必須指定,因此例如[eax]
或[ecx*2 + 5]
是有效的。
通常,eip
/rip
寄存器不能用作寄存器值之一。但在64位模式下,有一個特殊的「RIP相對尋址」模式,可以指定爲[rip + ofs]
。
我想補充一點,即時值必須是數字文字,因此您必須在鍵入指令時將其指定爲數字。 – MicroVirus 2014-09-21 17:23:06
@MicroVirus這就是「直接」在這種情況下的含義。我澄清了它。 – interjay 2014-09-21 17:28:34
@interjay是8,16或32位? – kaetzacoatl 2014-09-21 17:34:31
Instruction Prefix 0 oder 1 Byte
Address-Size Prefix 0 oder 1 Byte
Operand-Size Prefix 0 oder 1 Byte
Segment Prefix 0 oder 1 Byte
Opcode 1 oder 2 Byte
Mod R/M 0 oder 1 Byte
SIB, Scale Index Base (386+) 0 oder 1 Byte
Displacement 0, 1, 2 oder 4 Byte (4 nur 386+)
Immediate 0, 1, 2 oder 4 Byte (4 nur 386+)
Format of Postbyte(Mod R/M aus Intel-Doku)
------------------------------------------
MM RRR MMM
MM - Memory addressing mode
RRR - Register operand address
MMM - Memory operand address
RRR Register Names
Filds 8bit 16bit 32bit
000 AL AX EAX
001 CL CX ECX
010 DL DX EDX
011 Bl BX EBX
100 AH SP ESP
101 CH BP EBP
110 DH SI ESI
111 BH DI EDI
---
16bit memory (No 32 bit memory address prefix)
MMM Default MM Field
Field Sreg 00 01 10 11=MMM is reg
000 DS [BX+SI] [BX+SI+o8] [BX+SI+o16]
001 DS [BX+DI] [BX+DI+o8] [BX+DI+o16]
010 SS [BP+SI] [BP+SI+o8] [BP+SI+o16]
011 SS [BP+DI] [BP+DI+o8] [BP+DI+o16]
100 DS [SI] [SI+o8] [SI+o16]
101 DS [DI] [DI+o8] [SI+o16]
110 SS [o16] [BP+o8] [BP+o16]
111 DS [BX] [BX+o8] [BX+o16]
Note: MMM=110,MM=0 Default Sreg is DS !!!!
32bit memory (Has 67h 32 bit memory address prefix)
MMM Default MM Field
Field Sreg 00 01 10 11=MMM is reg
000 DS [EAX] [EAX+o8] [EAX+o32]
001 DS [ECX] [ECX+o8] [ECX+o32]
010 DS [EDX] [EDX+o8] [EDX+o32]
011 DS [EBX] [EBX+o8] [EBX+o32]
100 SIB [SIB] [SIB+o8] [SIB+o32]
101 SS [o32] [EBP+o8] [EBP+o32]
110 DS [ESI] [ESI+o8] [ESI+o32]
111 DS [EDI] [EDI+o8] [EDI+o32]
Note: MMM=110,MM=0 Default Sreg is DS !!!!
---
SIB is (Scale/Base/Index)
SS BBB III
Note: SIB address calculated as:
<sib address>=<Base>+<Index>*(2^(Scale))
Fild Default Base
BBB Sreg Register Note
000 DS EAX
001 DS ECX
010 DS EDX
011 DS EBX
100 SS ESP
101 DS o32 if MM=00 (Postbyte)
SS EBP if MM<>00 (Postbyte)
110 SS ESI
111 DS EDI
Fild Index
III register Note
000 EAX
001 ECX
010 EDX
011 EBX
100 never Index SS can be 00
101 EBP
110 ESI
111 EDI
Fild Scale coefficient
SS =2^(SS)
00 1
01 2
10 4
11 8
另請參閱https://en.wikipedia.org/wiki/X86#Addressing_modes除了答案以外,還可以查看哪些寄存器適用。您需要查看32位模式(至少從第一位開始) – MicroVirus 2014-09-21 17:20:50