參考網上的教程也是弄明白了一點,這裏做個記錄吧。
- 採用Dosbox+編譯器模擬實模式下的操作系統
參考資料:https://blog.csdn.net/qq_43722079/article/details/107690205 - 參照事例代碼仿寫了自己的彙編程序
參考資料: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)寄存器
又學到了新東西😄