我正在嘗試為我的 32 位作業系統制作自定義游標,并且想知道如何通過變數(0xb8000 XVAR)偏移記憶體地址(文本為 0xb800)。我嘗試了以下操作,但文本剛剛從我的螢屏上消失了:
mov al, ' '
mov ah, 0xff
mov edx, 0xb8000 160*3
add edx, CURSORX
mov word [edx], ax
對于任何需要知道的人,這就是不試圖抵消的樣子:
這就是我試圖抵消時的樣子:
最好的問候,Markian。
uj5u.com熱心網友回復:
mov al, ' ' mov ah, 0xff mov edx, 0xb8000 160*3 add edx, CURSORX mov word [edx], ax
該add edx, CURSORX
指令是添加CURSORX變數的偏移地址!要正確添加變數的值,您必須使用 NASM 中的方括號。
如果mov word [edx], ax
指令作業正常(你說沒有add
它),那是因為 DS 段暫存器為 0。因為你的代碼片段完全依賴于 DS 段暫存器(為 0),請確保 NASM 給出的偏移量CURSORX變數也與同一個零相關。
如果這是引導加載程式代碼并且您使用了[ORG 0x7C00]
指令,那么一切都會很好(分段)。
但是如果你已經使用過[ORG 0]
,那么就制作ES=0x07C0
并使用一個段覆寫add edx, [es:CURSORX]
。
在評論中你提到CURSORX是一個位元組。在雙字大小的加法中使用它之前,您需要擴展位元組。
movzx edx, byte [es:cursorx]
mov word [0xB8000 160 * 3 edx], 0xFF20
如果您的“游標偏移量”以字符表示,那么在使用之前不要忘記將其加倍,因為文本視頻記憶體的組織方式(字符位元組,屬性位元組)
movzx edx, byte [es:cursorx]
mov word [0xB8000 160 * 3 edx * 2], 0xFF20
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/495913.html