1 1 系統啟動 第一階段bootset s

2021-10-23 00:17:44 字數 2715 閱讀 9632

系統開機後,從0xffff0處(rom)取出第一條指令開始執行,進行bios自檢,檢查正常後就用bios的輸入功能將啟動磁碟上的bootset.s讀入記憶體0x7c00處,然後將自己移動到0x90000處。

該段程式的主要作用就是:

1)將setup載入到bootset後,0x90200處

2)呼叫int 0x10中斷,輸出螢幕資訊:「loading system…」

3)將system模組載入到記憶體0x10000處

4)跳到setup執行setup程式

bootseg  =

0x07c0

! original address of boot-sector

initseg =

0x9000

! we move boot here - out of the way

_start:

mov ax,#bootseg //設定ds段接觸器為0x7c0

mov ds,ax

mov ax,#initseg //設定es段接觸器為0x9000

mov es,ax

mov cx,#256

//設定移動數值

sub si,si //源位址 ds:si = 0x7c0:0x0000

sub di,di //目的位址 es:di = 0x9000:0x0000

repmovw

jmpi go,initseg //跳轉到0x90000處(inieseg為段位址)

go:     mov     ax,cs	//將ds,es,ss都設定為移動後**的段處(0x900)

mov ds,ax

mov es,ax

mov ss,ax

mov sp,#0xff00

! arbitrary value >>

512//設定堆疊指標

! load the setup-sectors directly after the bootblock.

! note that 'es' is already set up.

//利用bios的中斷0x13將setup模組,從第二扇區開始讀到0x90200處,共讀四個扇區

load_setup:

mov dx,#0x0000

! drive 0

, head 0

mov cx,#0x0002

! sector 2

, track 0

mov bx,#0x0200

! address =

512, in initseg

mov ax,#0x0200

+setuplen ! service 2

, nr of sectors

int0x13

! read it

jnc ok_load_setup ! ok -

continue

mov dx,#0x0000

mov ax,#0x0000

! reset the diskette

int0x13

j load_setup

! print some inane message

mov ah,#0x03

! read cursor pos

xor bh,bh //讀游標的位置

int0x10

mov cx,#24

//總共24個字元

mov bx,#0x0007

! page 0

, attribute 7

(normal)

mov bp,#msg1 //指向要顯示的字串

mov ax,#0x1301

! write string, move cursor

int0x10

//寫字串並移動游標..

....

...msg1:

//字串資訊

.byte 13,10

//回車,換行的ascii碼

.ascii "loading system ..."

.byte 13,10

,13,10

//共24個字元

ok, we've written the message, now

! we want to load the system (at 0x10000

) mov ax,#sysseg

mov es,ax ! segment of 0x010000

call read_it //讀磁碟上的system模組,es為輸入引數

call kill_motor

!after that (everyting loaded)

, we jump to the setup-routine loaded directly after

!the bootblock:

jmpi 0

,setupseg //跳轉到0x90200處,執行setup**

u boot啟動流程 第一階段

具體分析參見另一篇blog 第一階段的啟動在.cpu arm920t start.s檔案中完成,之後執行c程式,對硬體進行更細緻的初始化操作 硬體初始化 設定svc模式 關閉watch dog 禁止irq 設定時鐘 fclk hclk pclk 禁止i cache d cache 禁止mmu和cac...

第一階段練習

1 輸入乙個整數,把該整數分別按照八進位制 十進位制 十六進製制形式輸出 include stdio.h main 2 輸入乙個小數 整數部分3位 小數部分5位 把該小數分別按照以下格式輸出 小數部分4位寬度,整個數字8位寬度 小數部分3位寬度,整個數字9位寬度,空白部分使用0填充 include ...

第一階段 2015 12 2016 03

距離上一次寫部落格,大半年就過去了,這半年,都做了些什麼呢,生活又都有些什麼變化呢。2015的下半年是收穫的半年吧。第二,學ios的過程中結識了新的朋友,耳機哥,是很棒的一件事。第三,得到了乙份很美滿的愛情。最終在一起,還好沒錯過。第四,開始正視自己的不足,不再逃避,開始認真製作簡歷,並開始找工作,...