MyOS 之 彙編化

2021-10-08 21:08:56 字數 1653 閱讀 2318

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...