NASM给出的错误(尽管我的操作系统正常工作)是“无效的有效地址”。
现在我已经看到了很多关于如何使用LEA的例子,我想我是正确的,但是我的NASM不喜欢它。我试过lea cx, [cx+9],它起作用了;lea cx, [bx+cx]没有。
现在,如果我将我的寄存器扩展到32位(即lea ecx, [ecx*8+ecx]),一切都会很好,但我只能使用16位和8位寄存器。
这里有没有这么有见识的人可以解释为什么我的汇编程序不允许我按照我认为应该使用的方式使用lea?
发布于 2010-04-27 03:18:43
这是因为[bx+cx]在16位x86上的任何寻址模式下都无效,有关更多信息,请参阅此site。
lea cx, [bx+di]或lea cx, [bx+si]应该可以工作。
如果您的代码将以16位模式在386或更高版本上运行,则可以使用lea cx, [ecx + 9] (地址大小前缀,但仍然是16位操作数大小)。
另请参阅this Q&A on x86 addressing modes (mostly discussing 32/64bit addressing modes和x86标记维基。
发布于 2010-04-27 10:26:28
lea cx,[cx*8+cx]不起作用,因为“标度-索引-基址”寻址只适用于32位寄存器。这不是汇编器的限制--而是处理器的限制。
发布于 2013-02-03 18:03:57
下面的表格显示了哪个寄存器可以用作地址寄存器,以及它们中的哪个可以与第二个地址寄存器(baseregister+indexregister和可能的缩放)组合,以使用它构建地址。(从未设置D标志的16位地址模式观察。)
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德克
https://stackoverflow.com/questions/2716142
复制相似问题