如何解决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
是代码段寄存器。 You can't mov
into it。即使你可以,你也不喜欢结果;由于 cs:ip
用于确定从何处获取指令,您会发现您的 CPU 正在执行视频内存的内容。因此,您应该改用 ds
或 es
。
接下来,你不能用立即数加载段寄存器;您只能从另一个寄存器或内存中加载它。
最后,您不能使用像 ah
这样的 8 位寄存器作为地址的偏移量部分:偏移量是 16 位。实际上,唯一可以在 16 位 8086 的有效地址中使用的寄存器是 bx,si,di,bp
。见differences between general purpose registers in 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,0x0000
mov [es:bx],ax
mov [es:0x0000],ch
作为一般原则,在用汇编编写时,您不能仅仅猜测哪些指令采用哪些操作数组合;你必须查一下。您只能使用架构实际实现的那些形式,有时他们的选择不符合您的逻辑假设。随着时间的推移,您可能会开始识别出一些模式,但作为初学者,请计划参考您编写的每一行的指令参考。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。