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

lar*_*arz 6 x86 assembly nasm 16-bit

NASM给出的错误(尽管我的工作操作系统)是"无效的有效地址".

现在我已经看到很多关于如何使用LEA的例子,我认为我做对了但是我的NASM不喜欢它.我尝试过lea cx, [cx+9]它有效; lea cx, [bx+cx]没有.

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

在这里有这么知识渊博的人谁可以解释我为什么我的汇编程序不让我按照我认为应该使用的方式使用lea?

Mic*_*ael 9

这是因为[bx+cx]在16位x86上的任何寻址模式下无效,请访问此站点以获取更多信息.

lea cx, [bx+di]或者lea cx, [bx+si]应该工作.

如果您的代码将在386或更高版本的16位模式下运行,则可以使用lea cx, [ecx + 9](地址大小前缀但仍为16位操作数大小).

另请参阅有关x86寻址模式的此问答(主要讨论32/64位寻址模式标记wiki).


I. *_*edy 6

lea cx,[cx*8+cx]因为"scale-index-base"寻址仅适用于32位寄存器,所以不起作用.这不是汇编程序的限制 - 它是处理器的限制.