特麼這個問題困擾了我好久,畢竟是個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處最上面的3個mov語句是讓ds,es,cs指向同乙個位置,之後呼叫顯示字串的函式,然後程式無限迴圈。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.
"
這段程式是利用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中控制這個的顯示,通過控制框的大小,來控制這個字串顯示多少。在頁面所有位置大小都不會改變的情況下,這個方法...