80x86 16 位 asm:lea cx,[cx*8+cx] 导致 NASM 出现错误(编译 .com 文件)
NASM 给出的错误(尽管我的操作系统正常)是“无效的有效地址”。
现在我已经看到了很多如何使用 LEA 的例子,我认为我做对了,但我的 NASM 不喜欢它。我尝试了 lea cx, [cx+9] 并成功了; lea cx,[bx+cx]
没有。
现在,如果我将寄存器扩展到 32 位(即 lea ecx, [ecx*8+ecx]
),一切都会好起来,但我只能使用 16 位和 8 位寄存器。
这里有知识渊博的人可以解释一下为什么我的汇编器不允许我按照我认为应该使用的方式使用 lea 吗?
The error NASM gives (despite my working OS) is "invalid effective address".
Now I've seen many examples of how to use LEA and I think I got it right but yet my NASM dislikes it. I tried lea cx, [cx+9]
and it worked; lea cx, [bx+cx]
didn't.
Now if I extended my registers to 32-bits (i.e. lea ecx, [ecx*8+ecx]
) everything would be well but i am restricted to use 16- and 8-bit registers only.
Is here anyone so knowledgeable who could explain me WHY my assembler doesn't let me use lea the way I supposed it should be used?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
下面用于构建后字节的表格显示了哪个寄存器可以用作地址寄存器,以及其中哪些可以与第二个地址寄存器(基址寄存器+索引寄存器以及可能的缩放)组合以用它构建地址。
(从 16 位地址模式观察,其中 D 标志未设置。)
Dirk
These following tables for to build a postbyte shows which register can be used as an addressregister and which of them can be combine with a second addressregister(baseregister+indexregister and maybe scaling) to build an address with it.
(Observed from the 16 bit address mode, where the D-flag is not set.)
Dirk
这是因为
[bx+cx]
在 16 位 x86 上的任何寻址模式下都无效,请参阅此 网站 了解更多信息。lea cx,[bx+di]
或lea cx,[bx+si]
应该可以。如果您的代码将在 386 或更高版本的 16 位模式下运行,则可以使用 lea cx, [ecx + 9](地址大小前缀,但仍然是 16 位操作数大小)。
另请参阅此有关 x86 寻址模式的问答(主要讨论 32/64 位寻址模式)和 x86 标签 wiki。
This is because
[bx+cx]
isn't valid in any addressing mode on 16-bit x86, see this site for more info.lea cx, [bx+di]
orlea cx, [bx+si]
should work.If your code will run on 386 or later in 16bit mode, you can use
lea cx, [ecx + 9]
(address-size prefix but still 16bit operand-size).See also this Q&A on x86 addressing modes (mostly discussing 32/64bit addressing modes, and the x86 tag wiki.
lea cx,[cx*8+cx]
不起作用,因为“scale-index-base”寻址仅适用于 32 位寄存器。这不是汇编器的限制——而是处理器的限制。lea cx,[cx*8+cx]
doesn't work because "scale-index-base" addressing is only available with 32-bit registers. It's not a limitation of the assembler--it's a limitation of the processor.