我正在嘗試制作一個作業系統并在 32 位保護模式 nasm 中撰寫列印功能。這是我的代碼:
mov edx, 1
mov ebx, 0xb8000 160*edx
inc edx
但是,當我運行它時,我收到以下錯誤:
kernel.asm:23: error: invalid operand type
為什么會發生此錯誤,我該如何解決?
uj5u.com熱心網友回復:
問題是您的指令無效,因為記憶體運算元需要用方括號括起來。應用此更改,您將擁有mov ebx, [0xb8000 160*edx]. 使用NASM 也允許的十六進制數的Intel/MASM/DOS 表示法mov ebx, [0b8000h 160*edx],你會得到. 這條指令仍然是錯誤的,因為 x86 ISA 上指令編碼的 SIB 位元組只允許 的比例因子2,4并且8如英特爾手冊的表 2-3 中所述。160 不是有效的比例因子。最后,你要計算地址,所以最好使用LEA而不是 mov: lea ebx, [0b8000h 2/4/8*edx]。
您必須使用其他指令(如 、 或 )來計算值MUL,以IMUL獲得您想要的結果值。SHLINC
例如,您可以執行以下計算來定位游標(ECX=X 和 EDX=Y),假設文本模式為 80x25(使用IMUL而不是MUL注釋中建議的):
mov ecx, X ; where X might be [esp 8] or [xpos] or whatever
mov edx, Y ; you may not need a register, imul-immediate can load
; with inputs in registers
imul ebx, edx, 160 ; calculate line offset
lea ebx, [0B8000h ebx ecx*2] ; add column offset and base address
; Now EBX is Y*160 X*2
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/498471.html
上一篇:匯編中的“movl”指令
