2010-04-26 8 views
6

Der Fehler NASM gibt (trotz meiner funktionierenden OS) ist "ungültige effektive Adresse".80x86 16-bit asm: lea cx, [cx * 8 + cx] verursacht Fehler auf NASM (Kompilieren der .com-Datei)

Jetzt habe ich viele Beispiele gesehen, wie man LEA benutzt und ich denke, ich habe es richtig gemacht, aber meine NASM mag es nicht. Ich habe versucht lea cx, [cx+9] und es hat funktioniert; lea cx, [bx+cx] nicht.

Nun, wenn ich meine Register auf 32-Bit (d. H. lea ecx, [ecx*8+ecx]) erweitert, wäre alles gut, aber ich bin nur auf 16-und 8-Bit-Register beschränkt.

Ist hier jemand, der so kenntnisreich ist, der mir erklären konnte, warum mein Assembler lea nicht erlaubt, den Weg zu benutzen, den ich vermutete, dass es benutzt werden sollte?

+3

Ich glaube, Sie irren sich, wenn Sie das lea cx sagen, [cx + 9] gearbeitet. –

Antwort

9

Dies ist, weil [bx+cx] in keinem Adressierungsmodus auf 16-Bit x86 gültig ist, siehe hierzu site für weitere Informationen.

lea cx, [bx+di] oder lea cx, [bx+si] sollte funktionieren.

Wenn Ihr Code 386 oder später im 16-Bit-Modus ausgeführt wird, können Sie lea cx, [ecx + 9] (Adressgrößen-Präfix, aber immer noch 16-Bit-Operandengröße) verwenden.

Siehe auch this Q&A on x86 addressing modes (mostly discussing 32/64bit addressing modes und das Tag-Wiki.

5

lea cx,[cx*8+cx] funktioniert nicht, da die "scale-index-base" -Adressierung nur mit 32-Bit-Registern verfügbar ist. Es ist keine Einschränkung des Assemblers - es ist eine Einschränkung des Prozessors.

3

Die folgenden Tabellen, um ein Postbyte zu erstellen, zeigen, welches Register als Adressregister verwendet werden kann und welches mit einem zweiten Adressregister (Basisregister + Indexregister und eventuell Skalierung) kombiniert werden kann, um damit eine Adresse aufzubauen. (Beobachtet von der 16-Bit-Adressmodus, in dem die D-Flag nicht gesetzt ist.)

Instruction Prefix    0 or 1 Byte 
Address-Size Prefix    0 or 1 Byte 
Operand-Size Prefix    0 or 1 Byte 
Segment Prefix     0 or 1 Byte 
Opcode       1 or 2 Byte 
Mod R/M (Postbyte)    0 or 1 Byte 
SIB, Scale Index Base (386+)  0 or 1 Byte 
Displacement      0, 1, 2 or 4 Byte (4 only 386+) 
Immediate       0, 1, 2 or 4 Byte (4 only 386+) 

Format of Postbyte(Mod R/M from Intel-Manual) 
------------------------------------------ 
MM RRR MMM 

MM - Memeory addressing mode 
RRR - Register operand address 
MMM - Memoy 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 

Dirk

Verwandte Themen