nasm無論如何只做兩次彙編,因此在第二遍的時候,就可以知道**引用的所有符號位址,但一段**的尺寸依賴於另一符號值,而這個符號又在這段**的後面被宣告,這個是不行的。
前面加點就是本地label,例如.loop,這就很實用了,你可以在函式裡定義幾個變數,然後直接jmp過去,這樣就能保證原子化了。
其實後面連線也沒關係,根本不用管。
現在的確是需要進行系統化命名了。現在實現再新增乙個asm檔案取代c語言檔案。
新建立乙個main.nas檔案,檔案裡只是:
main:
hlt ; 讓cpu停止,等待指令
jmp main ; 無限迴圈
最簡單的系統。編入makefile。
成功,然後與彙編函式檔案聯動。
不行,太亂了,引用的檔案太多,根本不知道什麼是什麼。還是自己實現所有檔案吧。
這裡講一下nasm,nasm你一般這麼用:
nasm -f bin test.asm -o test.bin -l test.list
gas是作為gcc的中間彙編**,糾錯能力很弱而且語法相當可怕。
1. nasm大小寫敏感。
2. nasm讀記憶體示例:
var dw 2
mov ax, var ; 將位址存入ax
mov ax, [var] ; 將值存入ax
k equ 1
mov ax, 1 ; 將1存入ax,也就是說,要麼是位址,要麼是equ的常量。
不支援 mov ax, table[bx],可以寫成mov ax, [table+bx],也不支援mov ax, es:[di],可以寫成mov ax, [es:di]
3. nasm不記住任何變數型別,因此必須顯式存數,例如 mov word [var], 2
4. nasm不需要far,near什麼的。
5. nasm用\作為續航符。
好吧,段還是挺重要的。
nasm不允許在bss段定義可變長度的內容,但是我也只是對齊而已,因此這個對齊任務可以交予create_img來完成。
create_img需要兩個檔案,乙個是ipl.bin,作為啟動區純二進位制檔案,另乙個是myos.bin,是很多nasm檔案聯合彙編的純二進位制檔案,crate_img的功能就是聯合這兩個檔案最終弄成1.44mb的軟盤格式。
現在乙個版本裡有兩個資料夾,乙個tools,裝載所有工具,另乙個是src,裝載所有**,make檔案在最外面。中間出現的list全部都放在最外面,生成的二進位制檔案全部放到bin資料夾下。
因為路徑問題,只好把所有的放到一塊了。
好難受啊,根本對不上,什麼破玩意兒。不僅nasm不友好,而且gcc也不友好。。。
之所以多三個位元組是因為,必須用二進位制的方式開啟,不然的話,0d 0a 0d (換行,回車 換行)就會自動刪除0d,這是很坑的。
解決辦法就是"wb"和"rb"。
但nask和nasm編譯出來的機器**不太一樣。
現在看看啟動qemu呢?
qemu還關聯著幾個重要檔案,因此,emmm,就不能那麼做了,只能環境變數來引用,不是自己的全部環境變數引用,是自己的放到tools中。
其實nasm編譯的還是能做的。
MyOS 之 定時器
定時器每隔一段時間 0.01秒 就傳送乙個中斷訊號給cpu。這其實是乙個中斷。要使用定時器,需要設定pit programmable interval timer 可程式設計的間隔型定時器,設定pit可以設定定時器每隔多少秒就產生一次中盾。它連著irq0,只要設定了pit就可以設定irq0的中斷間隔...
彙編之堆疊
當我們看了暫存器的詳解後,及了解算術中的變數,下面我們來看一下,在8086cpu中一些計算法則規則的講解。先來看一下記憶體中字的儲存 傳送。字儲存 cpu中,用16位暫存器來儲存乙個字。高8位存放高位位元組,低8位存放低位位元組。由於記憶體單元是以位元組單位,則乙個字需要兩個連續的記憶體單元來存放。...
彙編與反彙編之小技巧
大家都知道,對於位於當前除錯目標中的指令,可以使用windbg的u命令進行反彙編。u命令的引數是要反彙編 的位址值或者符號,如果不指定,那麼windbg會使用當前程式指標暫存器所指向的 例如 0 001 u ntdll dbgbreakpoint 7c901230 cc int 3 7c901231...