操作系統(tǒng)開發(fā)教程#02-1
在上一節(jié)里,我們寫了一個非常簡單的“操作系統(tǒng)”,看起來還不錯,對嗎?不過你好像看起來根本不知道發(fā)生了什么。(如果你已經有了很好的匯編基礎,可以跳過以下內容,進入下一節(jié))
對于第一行,“; MKOS-0-0 上節(jié)代碼”,這是一個注釋,不起任何作用(“注釋不是用來解釋程序或用來記錄作者的話之類的嗎?”,拜托,我基本都不看也不寫注釋的欸。)在匯編里,從“;”開始到這一行的結束都會算作注釋(類似于c中的“//”)
第二行,“ORG 0x7c00”是一句偽指令【1】,作用是告訴編譯器這個程序將來會被裝載到0x7c00的位置
第三行,“JMP start”,即“jump”到start所在的位置(類似于c中的“goto”)
第四行,“Message0”為標簽名,可以在同一行寫語句(可不加":",如“ADR0 db 0x7c00”),也可以在下面寫語句(加":",如“Start:”);“DB ……”為直接在程序里寫入字節(jié)。
第六行,返回(Return)指令,返回到上一個調用(Call)指令。(類似于c中的“return ;”)
第八行,轉移(Move)指令,將SI寄存器【2】所對于內存的值賦給AL 寄存器。(類似于c中的“AL=((char*)0)[SI];”)
第九行,加法(Add)指令,將SI寄存器的值加1。(類似于c中的“SI+=1;”)
第十行,比較(Compare)指令,將AL寄存器的值與0比較,比較結果存入flag(標志)寄存器。
第十一行,等于則跳轉(Jump if equal)指令,跳轉到rtn標簽所在位置。
第十四行,調用中斷(interrupt)【3】0x10
第二十三行,調用指令,調用putloop。(類似于c中的“putloop();”)
第二十四行,跳轉到當前($)
第二十六行,偽指令,重復(Times)510-$+$$【4】次DB 0偽指令
第二十七行,偽指令,寫入0x55,0xaa【5】
【1】:偽指令不是真正的指令,也就是不是最終的指令,而是用于指示匯編程序如何匯編源程序。至于為什么是7c00,這個比 32KB 小1024字節(jié)的地方??梢詤⒁娪嬎銠C是如何啟動的【7】以及Why BIOS loads MBR into 0x7C00 in x86 ?【6】或者我上一篇文章。
【2】:寄存器是CPU內部用來存放數(shù)據(jù)的一些小型存儲區(qū)域,用來暫時存放參與運算的數(shù)據(jù)和運算結果。在x86的16位CPU上的寄存器,通??梢苑譃椤巴ㄓ眉拇嫫鳌薄爸羔樅妥冎芳拇嫫鳌薄岸渭拇嫫鳌焙汀皹酥炯拇嫫鳌?。對于通用寄存器,有

十六位????高八位????低八位????名稱????????????用途

AX????????? AH????????? AL????????? 累加器????????些指令約定以AX(或AL)為源或目的寄存器。

BX????????? BH????????? BL????????? 基址寄存器 BX可用作間接尋址的地址寄存器和基地址寄存器,BH、BL可用作8位通用數(shù)據(jù)寄存器。

CX??? ???? CH??? ?????? CL????????? 計數(shù)寄存器 CX在循環(huán)和串操作中充當計數(shù)器,指令執(zhí)行后CX內容自動修改,因此稱為計數(shù)寄存器。

DX??? ?????DH??? ?????? DL??? ????? 數(shù)據(jù)寄存器 除用作通用寄存器外,在I/O指令中可用作端口地址寄存器,乘除指令中用作輔助累加器。

對于指針和變址寄存器,有

十六位?? 名稱????????????????????????用途

BP???????? 基址指針寄存器????? BP中存放現(xiàn)行堆棧段中一個數(shù)據(jù)區(qū)的“基址”的偏移量。

SP??? ???? 堆棧指針寄存器????? SP寄存器在堆棧操作中使用,PUSH和POP指令是從SP寄存器得到現(xiàn)行堆棧段的段內地址偏移量,所以稱SP寄存器為堆棧指針,SP始終指向棧頂。

SI??? ??? ? 源變址寄存器??? ????為訪問現(xiàn)行數(shù)據(jù)段提供段內地址偏移量。其中源操作數(shù)的偏移量存放在SI中,目的操作數(shù)的偏移量存放在DI中。
DI??? ???? 目的變址寄存器

IP??? ???? 指令指針寄存器???? 用來存放將要執(zhí)行的下一條指令在現(xiàn)行代碼段中的偏移地址。程序運行中,它由BIU自動修改,使IP始終指向下一條將要執(zhí)行的指令的地址,因此它是用來控制指令序列的執(zhí)行流程的,是一個重要的寄存器。8086程序不能直接訪問IP,但可以通過某些指令修改IP的內容。

對于段寄存器,有

十六位? 名稱??? ??????? ????用途

CS??? ????代碼段寄存器? 由它們給出相應邏輯段的首地址,稱為“段基址”。段基址與段內偏移地址組合形成20位物理地址,段內偏移地址可以存放在寄存器中,也可以存放在存儲器中。
DS??? ????數(shù)據(jù)段寄存器
SS??? ????堆棧段寄存器
ES??? ????附加段寄存器

標志寄存器FR,有

一位??? ????用途

CF??? ????? 用于寄存程序運行的狀態(tài)信息,這些標志往往用作后續(xù)指令判斷的依據(jù)。
PF
AF
ZF
SF
OF

IF??? ????? 用于控制CPU的操作,是人為設置的。
DF
TF

【3】指處理機處理程序運行中出現(xiàn)的緊急事件的整個過程.程序運行過程中,系統(tǒng)外部、系統(tǒng)內部或者現(xiàn)行程序本身若出現(xiàn)緊急事件,處理機立即中止現(xiàn)行程序的運行,自動轉入相應的處理程序(中斷服務程序),待處理完后,再返回原來的程序運行,這整個過程稱為程序中斷;當處理機接受中斷時,只需暫停一個或幾個周期而不執(zhí)行處理程序的中斷,稱為簡單中斷.中斷又可分為屏蔽中斷和非屏蔽中斷兩類.可由程序控制其屏蔽的中斷稱為屏蔽中斷或可屏蔽中斷.屏蔽時,處理機將不接受中斷.反之,不能由程序控制其屏蔽,處理機一定要立即處理的中斷稱為非屏蔽中斷或不可屏蔽中斷.非屏蔽中斷主要用于斷電、電源故障等必須立即處理的情況.處理機響應中斷時,不需執(zhí)行查詢程序.由被響應中斷源向CPU發(fā)向量地址的中斷稱為向量中斷,反之為非向量中斷.向量中斷可以提高中斷響應速度。
分類:
·可屏蔽中斷(maskable interrupt)。硬件中斷(Hardware Interrupt)
的一類,可通過在中斷屏蔽寄存器中設定位掩碼來關閉。
·非可屏蔽中斷(non-maskable interrupt,NMI)。硬件中斷的一類,無法通過在中斷屏蔽寄存器中設定位掩碼來關閉。典型例子是時鐘中斷(一個硬件時鐘以恒定頻率—如50Hz—發(fā)出的中斷)。
·處理器間中斷(interprocessor interrupt)。一種特殊的硬件中斷。由處理器發(fā)出,被其它處理器接收。僅見于多處理器系統(tǒng),以便于處理器間通信或同步。
·偽中斷(spurious interrupt)。一類不希望被產生的硬件中斷。發(fā)生的原因有很多種,如中斷線路上電氣信號異常,或是中斷請求設備本身有問題。
·軟件中斷(Software Interrupt)是一條CPU指令,用以自陷一個中斷。由于軟中斷指令通常要運行一個切換CPU至內核態(tài)(Kernel Mode/Ring 0)的子例程,它常被用作實現(xiàn)系統(tǒng)調用(System call)?!园俣劝倏?/p>
【4】$當前位置?? $$當前段起始位置
【5】引導程序標記,在引導扇區(qū)的512字節(jié)中最后兩個字節(jié)寫入55aa標記此扇區(qū)為引導扇區(qū)。至于為什么是55AA,那得問IBM的爺爺們了。
【6】https://www.glamenv-septzen.net/en/view/6
【7】https://www.ruanyifeng.com/blog/2015/09/0x7c00.html