首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >80x86 16位asm: lea cx,[cx*8+cx]在NASM上导致错误(编译.com文件)

80x86 16位asm: lea cx,[cx*8+cx]在NASM上导致错误(编译.com文件)
EN

Stack Overflow用户
提问于 2010-04-27 03:12:10
回答 3查看 2.3K关注 0票数 6

NASM给出的错误(尽管我的操作系统正常工作)是“无效的有效地址”。

现在我已经看到了很多关于如何使用LEA的例子,我想我是正确的,但是我的NASM不喜欢它。我试过lea cx, [cx+9],它起作用了;lea cx, [bx+cx]没有。

现在,如果我将我的寄存器扩展到32位(即lea ecx, [ecx*8+ecx]),一切都会很好,但我只能使用16位和8位寄存器。

这里有没有这么有见识的人可以解释为什么我的汇编程序不允许我按照我认为应该使用的方式使用lea?

EN

回答 3

Stack Overflow用户

发布于 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 modesx86标记维基。

票数 9
EN

Stack Overflow用户

发布于 2010-04-27 10:26:28

lea cx,[cx*8+cx]不起作用,因为“标度-索引-基址”寻址只适用于32位寄存器。这不是汇编器的限制--而是处理器的限制。

票数 6
EN

Stack Overflow用户

发布于 2013-02-03 18:03:57

下面的表格显示了哪个寄存器可以用作地址寄存器,以及它们中的哪个可以与第二个地址寄存器(baseregister+indexregister和可能的缩放)组合,以使用它构建地址。(从未设置D标志的16位地址模式观察。)

代码语言:javascript
复制
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

德克

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2716142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档