NASM:实模式下无效的有效地址

我试图在实模式下绘制到屏幕,所以我试图使用分段访问 0xB8000

我的汇编代码是这样的

[BITS 16]
org 0x7c00

begin:
  mov ah, 0x01 ; disable cursor
  mov ch, 0x3f
  int 0x10

  mov ch, 0x0000
  mov cs, 0xb800
  mov ah, 0x0000
  mov [cs:ah], ch ; invalid effective address

end:
  jmp end

times 510 - ($-$$) db 0
dw 0xaa55

我将如何正确使用分段来解决 0xB8000?

回答

记住那cs代码段寄存器。 你不能mov进去。即使你可以,你也不喜欢结果;由于cs:ip用于确定从何处获取指令,您会发现您的 CPU 正在执行视频内存的内容。所以,你应该使用dses代替。

接下来,你不能用立即数加载段寄存器;您只能从另一个寄存器或内存中加载它。

最后,您不能使用 8 位寄存器ah作为地址的偏移部分:偏移是 16 位。事实上,唯一可以在 16 位 8086 的有效地址中使用的寄存器是bx, si, di, bp. 请参阅8086 中通用寄存器之间的差异。(bp寻址使用ss段而不是ds除非被覆盖,所以在这里可能不应该是您的首选。)

因此,您可以使用一些选项:

mov ax, 0xb800
mov ds, ax
mov bx, 0x0000 ; but xor bx, bx is more efficient
mov [bx], ch
mov ax, 0xb800
mov es, ax
mov bx, 0x0000
mov [es:bx], ch
mov ax, 0xb800
mov es, ax
mov [es:0x0000], ch

作为一般原则,在用汇编编写时,您不能仅仅猜测哪些指令采用哪些操作数组合;你必须查一下。您只能使用架构实际实现的那些形式,有时他们的选择不符合您的逻辑假设。随着时间的推移,您可能会开始识别出一些模式,但作为初学者,请计划参考您编写的每一行的指令参考。


以上是NASM:实模式下无效的有效地址的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>