2014-09-21 52 views
0

在装配中经常有类似的说明:大会指令数学语法

mov eax, [ebp+4] 
mov eax, [ebx + ecx*4] 

我的问题是:我能在这个brakets吗? 我可以添加和相乘所有寄存器和立即数还是有限制? 我也可以使用除法和减法吗? 我用谷歌搜索它,但我找不到任何好的参考。

+2

另请参阅https://en.wikipedia.org/wiki/X86#Addressing_modes除了答案以外,还可以查看哪些寄存器适用。您需要查看32位模式(至少从第一位开始) – MicroVirus 2014-09-21 17:20:50

回答

4

在32位和64位模式下的地址操作数的一般格式是:

[reg1 + reg2*mult + ofs] 

mult必须是1,2,4,8之一。 是立即数,即一个常数值。它可以是积极的或消极的。

并非所有三个部分都必须指定,因此例如[eax][ecx*2 + 5]是有效的。

通常,eip/rip寄存器不能用作寄存器值之一。但在64位模式下,有一个特殊的“RIP相对寻址”模式,可以指定为[rip + ofs]

+0

我想补充一点,即时值必须是数字文字,因此您必须在键入指令时将其指定为数字。 – MicroVirus 2014-09-21 17:23:06

+0

@MicroVirus这就是“直接”在这种情况下的含义。我澄清了它。 – interjay 2014-09-21 17:28:34

+0

@interjay是8,16或32位? – kaetzacoatl 2014-09-21 17:34:31

1
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