【问题标题】:NASM x86 16-bit addressing modes [duplicate]NASM x86 16 位寻址模式 [重复]
【发布时间】:2020-06-18 09:04:46
【问题描述】:

我无法指向地址并在我的情况下写入一个字节大小的变量。这给了我错误“错误:无效的有效地址”:

mov byte[AX], byte 0x0

经过一些尝试和错误后,我测试了相同但使用 EAX。这编译得很好:

mov byte[EAX], byte 0x0

我在这里错过了什么?

【问题讨论】:

标签: assembly x86 nasm x86-16 addressing-mode


【解决方案1】:

[AX] 是无效的内存操作数规范。

The valid 16-bit ones are:

[constant]  
[BX]  
[SI]  
[DI]  
[BX+constant]  
[BP+constant]  
[SI+constant]  
[DI+constant]  
[BX+SI]  
[BX+DI]  
[BP+SI]  
[BP+DI]  
[BX+SI+constant]  
[BX+DI+constant]  
[BP+SI+constant]  
[BP+DI+constant]  

[BP] 形式上是无效的,但是很多汇编程序会悄悄地把它转换成[BP+0]。

有关内存操作数编码以及 ModR/M 和 SIB 字节,请参阅 CPU 手册。

【讨论】:

  • 使用[bp+constant][bp+si+constant][bp+di+constant] 时,最好记住bp 的所有这些寻址模式的默认段是ss(堆栈段),而不是@ 987654329@(数据段),因为它适用于上面列出的所有其他寻址模式。
  • 请注意,16 位寻址模式不能使用 SIB 字节,只能使用 ModR/M,因此它们仅限于 (BP|BX) + (DI|SI) + disp0/8/16
猜你喜欢
  • 1970-01-01
  • 2010-09-18
  • 2019-09-03
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多