1. 程式人生 > 其它 >30天自制作業系統-merk11的第二天

30天自制作業系統-merk11的第二天

主要都是跟著書上的講解走,一步步慢慢來

30天自制作業系統-merk11的第二天

主要還是跟著書上的步驟走~~~~

暫存器介紹

AX——accumulator累加暫存器

CX——counter計數暫存器

DX——data資料暫存器

BX——base基址暫存器

SP——stack pointer棧指標暫存器

BP——base pointer基址指標暫存器

SI——source index源變址暫存器

DI——destination index目的變址暫存器

ES——附加段暫存器(extra segment)

CS——程式碼段暫存器(code segment)

SS——棧段暫存器(stack segment)

DS——資料段暫存器(data segment)

FS——沒有名稱(segment part 2)

GS——沒有名稱(segment part 3)

以上為16位暫存器

AL——累加暫存器低位(accumulator low)

CL——計數暫存器低位(counter low)

DL——資料暫存器低位(data low)

BL——基址暫存器低位(base low)

AH——累加暫存器高位(accumulator high)

CH——計數暫存器高位(counter high)

DH——資料暫存器高位(data high)

BH——基址暫存器高位(base high)

以上為8位暫存器

組合語言學習

ORG: 這個指令會告訴nask,在開始執行的時候,把這些機器語言指令裝載到記憶體中的哪個地址。如果沒有它,有幾個指令就不能被正確地翻譯和執行。另外,有了這條指令的話,美元符($)的含義也隨之變化,它不再是指輸出檔案的第幾個位元組,而是代表將要讀入的 記憶體地址。

ORG		0x7c00        ;起始地址為0x7c00

JMP: 相當於C語言中的goto,entry是標籤的宣告,是JMP的目的地

MOV:賦值指令

CMP:比較指令

JE:跳轉指令

CMP	AL,	0

JE	fin              ;相當於if(AL == 0){ goto fin; }

HIT: CPU停轉指令

附上學習程式碼:

; hello-os
; TAB=4

		ORG		0x7c00			; 指明程式裝載地址

; 標準FAT12格式軟盤專用的程式碼 Stand FAT12 format floppy code

		JMP		entry
		DB		0x90
		DB		"HELLOIPL"		; 啟動扇區名稱(8位元組)
		DW		512				; 每個扇區(sector)大小(必須512位元組)
		DB		1				; 簇(cluster)大小(必須為1個扇區)
		DW		1				; FAT起始位置(一般為第一個扇區)
		DB		2				; FAT個數(必須為2)
		DW		224				; 根目錄大小(一般為224項)
		DW		2880			; 該磁碟大小(必須為2880扇區1440*1024/512)
		DB		0xf0			; 磁碟型別(必須為0xf0)
		DW		9				; FAT的長度(必??9扇區)
		DW		18				; 一個磁軌(track)有幾個扇區(必須為18)
		DW		2				; 磁頭數(必??2)
		DD		0				; 不使用分割槽,必須是0
		DD		2880			; 重寫一次磁碟大小
		DB		0,0,0x29		; 意義不明(固定)
		DD		0xffffffff		; (可能是)卷標號碼
		DB		"HELLO-OS   "	; 磁碟的名稱(必須為11字?,不足填空格)
		DB		"FAT12   "		; 磁碟格式名稱(必??8字?,不足填空格)
		RESB	18				; 先空出18位元組

; 程式主體

entry:
		MOV		AX,0			; 初始化暫存器
		MOV		SS,AX
		MOV		SP,0x7c00
		MOV		DS,AX
		MOV		ES,AX

		MOV		SI,msg                                     ;msg由ORG計算出地址代入SI暫存器
putloop:
		MOV		AL,[SI]                                      ; []指的是記憶體地址,把SI地址的1個位元組的內容讀入AL中
		ADD		SI,1			; 給SI加1
		CMP		AL,0
		JE		fin                                            ; 條件跳轉指令,fin是結束的意思
		MOV		AH,0x0e			; 顯示一個文字
		MOV		BX,15			; 指定字元顏色
		INT		0x10			; 呼叫顯示卡BIOS
		JMP		putloop
fin:
		HLT						; 讓CPU停止,等待指令
		JMP		fin				; 無限迴圈

msg:
		DB		0x0a, 0x0a		; 換行兩次
		DB		"hello, world"
		DB		0x0a			; 換行
		DB		0

		RESB	0x7dfe-$		; 填寫0x00直到0x001fe

		DB		0x55, 0xaa