彙編 使用10h中斷來顯示字串

2021-09-25 13:45:42 字數 1675 閱讀 3696

特麼這個問題困擾了我好久,畢竟是個os newbie,還沒有彙編的基礎。

在前天的載入loader的實驗中,老師要求顯示字串,但是給的**只是顯示乙個字元。

愚蠢的我實在沒辦法,最後為了按期完成實驗,只能乙個個字元地輸出,呀真是羞恥。

好了,趁著清明假期,花了幾個小時終於弄懂了。

下面進入正題!

前戲是先對boot.asm和loader.asm編譯:

nasm -o boot.bin boot.asm

nasm -o loader.bin loader.asm
然後把boot.bin寫入軟盤a.img:

dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
然後三連擊,把掛載軟盤:

最後乙個引數是你floppy資料夾的路徑,自己隨便去建立乙個就好,不一定用/mnt裡面的

sudo mount -o loop a.img /home/jennings/exp2/floppy/

sudo cp loader.bin /home/jennings/exp2/floppy/ -v

sudo umount /home/jennings/exp2/floppy/
以下是loader.asm的**:

org 0100h ; 告訴編譯器程式載入到 0100h處

mov ax, cs

mov ds, ax

mov es, ax

call dispstr ; 呼叫顯示字串例程

jmp $ ; 無限迴圈

dispstr:

mov ax, loadermessage

mov bp, ax ; es:bp =串位址

mov cx,

31 ; cx =串長度

mov ax, 01301h ; ah = 13, al =01h

mov bx, 000ch ; 頁號為

0(bh = 0) 黑底紅字(bl =0ch,高亮)

mov dh,

0;顯示的行號

mov dl,

39;顯示的列號

int10h ; 10h 號中斷

retloadermessage: db

"this is *********ning's loader.

"

最上面的3個mov語句是讓ds,es,cs指向同乙個位置,之後呼叫顯示字串的函式,然後程式無限迴圈。

這段程式是利用bios提供的int 10h中斷服務來對螢幕進行繪製

mov  bp, ax的作用就是把字串的位址放到es:bp處(彙編基礎不好,暫時不是很懂這裡)

cx是設定字串的長度,自己數自己的字串多長然後相應修改

ah是設定服務模式,13h的意思是顯示字串al設定游標位置,01h的意思是游標跟隨字串。具體請參見:這裡寫得特別詳細,感謝作者!

bx用來設定字串的屬性,顏色啊,閃爍啊,背景啊等等。。。

dh是顯示字串的行號(0~24),dl是顯示字串的列號(0~79)

好激動。。。接下來載入核心的實驗要顯示字串不用愚蠢地乙個個字元輸出了。。。/尷尬

彙編 顯示字串

dos功能呼叫 dos利用軟體中斷方式提供系統功能。中斷呼叫指令是 int n 其中n表示呼叫的中斷號 即中斷0 中斷255號。dos系統呼叫一般有如下4個步驟 1 在ah暫存器中設定系統功能呼叫號 2 在指定暫存器中設定入口引數 3 用中斷呼叫指令 int n 執行功能呼叫 4 根據出口引數分析功...

8086CPU彙編 顯示字串

在第8行第5列以紅色字型顯示 welcome to masm assume ds data,cs code data segment db welcome to masm 0 data ends code segment start mov ax,data mov ds,ax mov si,0 在8...

通過html來部分顯示字串,並用 顯示

從資料庫中讀取文章的題目,在頁面中排列顯示,可能會因為題目太長,而需要擷取一部分來顯示,之前都是通過php 來判斷這個字串的長度,並擷取自己需要長度的字串。前幾天從同學那裡聽說可以直接在html中控制這個的顯示,通過控制框的大小,來控制這個字串顯示多少。在頁面所有位置大小都不會改變的情況下,這個方法...