系統開機後,從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的過程中結識了新的朋友,耳機哥,是很棒的一件事。第三,得到了乙份很美滿的愛情。最終在一起,還好沒錯過。第四,開始正視自己的不足,不再逃避,開始認真製作簡歷,並開始找工作,...