博客 / 詳情

返回

初學操作系統——寫顯存輸出字符

參考網上的教程也是弄明白了一點,這裏做個記錄吧。

  1. 採用Dosbox+編譯器模擬實模式下的操作系統
    參考資料:https://blog.csdn.net/qq_43722079/article/details/107690205
  2. 參照事例代碼仿寫了自己的彙編程序
    參考資料:https://www.cnblogs.com/bigdudu/articles/4072864.html
    我的代碼如下:
assume cs:code, ds:data
;----------------------------

data segment    ; 定義數據段
    db 'y', 06H;
    db 'a', 26H;
    db 'o', 74H;
data ends
;-----------------------------
code segment    ; 定義代碼段
start:
    mov ax, data
    mov ds, ax    ;將數據段寄存器指向data起點,以便取數
    
    mov bx, 0b800h
    mov es, bx    ;將顯存地址加載到es,後面直接在es上寫入,顯示在屏幕上
    
    mov si, 0        ;si置零,後面用作數據段的偏置值
    mov di, (12*80+40-3)*2    ;di作為顯存地址的偏置值,使字符顯示在屏幕中央
    mov cx, 3        ;cx設置循環次數,3次剛好顯示完字符串

s:
    mov ax, [si]    ;從數據段中取出16位,存入ax中
    mov es:[di], ax    ;將數據寫入顯存偏移地址
    
    add si, 2        ;si向後2B,轉到下一個字符地址
    add di, 2        ;di向後2B,轉到下一個顯存地址位置
    
    loop s
    
    mov ax, 4c00h    ;設置DOS程序結束功能號(4CH)和返回碼(00H)

    int 21h        ; 調用21號中斷
code ends;
    end start
;-----------------------------

運行結果:

這裏修改了字符的顯示位置,把默認的頂格顯示改為居中顯示
用di保存顯存地址的偏置值
不過有個問題就是,一開始我是用dx保存的,但是顯示“Must be index or base register”,
後面我查了資料,原來使用寄存器相對尋址方式,只能使用BX,BP,SI,DI
方括號裏必須是變址(index,指SI, DI)或基址(base,指BX, BP)寄存器
又學到了新東西😄

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.