From 4aa3701408e787417c9a1ac38121ee2879c6218d Mon Sep 17 00:00:00 2001 From: Yourtion Date: Wed, 10 Sep 2014 14:55:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E5=8E=9F=E6=9C=89=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 04_day/Makefile | 6 +-- 04_day/asmhead.nas | 104 +++++++++++++++++++-------------------- 04_day/ipl10.nas | 120 +++++++++++++++++++++++---------------------- 3 files changed, 117 insertions(+), 113 deletions(-) diff --git a/04_day/Makefile b/04_day/Makefile index c33afc9..6d1891a 100644 --- a/04_day/Makefile +++ b/04_day/Makefile @@ -13,12 +13,12 @@ IMGTOL = $(TOOLPATH)imgtol.com COPY = copy DEL = del -# ƒfƒtƒHƒ‹ƒg“®ì +# 默认动作 default : $(MAKE) img -# ƒtƒ@ƒCƒ‹¶¬‹K‘¥ +# é•œåƒæ–‡ä»¶ç”Ÿæˆ ipl10.bin : ipl10.nas Makefile $(NASK) ipl10.nas ipl10.bin ipl10.lst @@ -55,7 +55,7 @@ haribote.img : ipl10.bin haribote.sys Makefile copy from:haribote.sys to:@: \ imgout:haribote.img -# ƒRƒ}ƒ“ƒh +# 其他指令 img : $(MAKE) haribote.img diff --git a/04_day/asmhead.nas b/04_day/asmhead.nas index 4b8b8ae..c5bce1b 100644 --- a/04_day/asmhead.nas +++ b/04_day/asmhead.nas @@ -1,49 +1,49 @@ ; haribote-os boot asm ; TAB=4 -BOTPAK EQU 0x00280000 ; bootpack‚̃[ƒhæ -DSKCAC EQU 0x00100000 ; ƒfƒBƒXƒNƒLƒƒƒbƒVƒ…‚ÌêŠ -DSKCAC0 EQU 0x00008000 ; ƒfƒBƒXƒNƒLƒƒƒbƒVƒ…‚ÌêŠiƒŠƒAƒ‹ƒ‚[ƒhj +BOTPAK EQU 0x00280000 ; 加载bootpack +DSKCAC EQU 0x00100000 ; ç£ç›˜ç¼“存的ä½ç½® +DSKCAC0 EQU 0x00008000 ; ç£ç›˜ç¼“存的ä½ç½®ï¼ˆå®žæ¨¡å¼ï¼‰ -; BOOT_INFOŠÖŒW -CYLS EQU 0x0ff0 ; ƒu[ƒgƒZƒNƒ^‚ªÝ’è‚·‚é +; BOOT_INFO相关 +CYLS EQU 0x0ff0 ; 引导扇区设置 LEDS EQU 0x0ff1 -VMODE EQU 0x0ff2 ; F”‚ÉŠÖ‚·‚éî•ñB‰½ƒrƒbƒgƒJƒ‰[‚©H -SCRNX EQU 0x0ff4 ; ‰ð‘œ“x‚ÌX -SCRNY EQU 0x0ff6 ; ‰ð‘œ“x‚ÌY -VRAM EQU 0x0ff8 ; ƒOƒ‰ƒtƒBƒbƒNƒoƒbƒtƒ@‚ÌŠJŽn”Ô’n +VMODE EQU 0x0ff2 ; å…³äºŽé¢œè‰²çš„ä¿¡æ¯ +SCRNX EQU 0x0ff4 ; 分辨率X +SCRNY EQU 0x0ff6 ; 分辨率Y +VRAM EQU 0x0ff8 ; 图åƒç¼“å†²åŒºçš„èµ·å§‹åœ°å€ - ORG 0xc200 ; ‚±‚̃vƒƒOƒ‰ƒ€‚ª‚Ç‚±‚É“Ç‚Ýž‚Ü‚ê‚é‚Ì‚© + ORG 0xc200 ; 这个的程åºè¦è¢«è£…è½½çš„å†…å­˜åœ°å€ -; ‰æ–ʃ‚[ƒh‚ðÝ’è +; ç”»é¢ãƒ¢ãƒ¼ãƒ‰ã‚’設定 - MOV AL,0x13 ; VGAƒOƒ‰ƒtƒBƒbƒNƒXA320x200x8bitƒJƒ‰[ + MOV AL,0x13 ; VGA显å¡ï¼Œ320x200x8bit MOV AH,0x00 INT 0x10 - MOV BYTE [VMODE],8 ; ‰æ–ʃ‚[ƒh‚ðƒƒ‚‚·‚éiCŒ¾Œê‚ªŽQÆ‚·‚éj + MOV BYTE [VMODE],8 ; å±å¹•çš„模å¼ï¼ˆå‚考C语言的引用) MOV WORD [SCRNX],320 MOV WORD [SCRNY],200 MOV DWORD [VRAM],0x000a0000 -; ƒL[ƒ{[ƒh‚ÌLEDó‘Ô‚ðBIOS‚É‹³‚¦‚Ä‚à‚炤 +; 通过BIOS获å–指示ç¯çŠ¶æ€ MOV AH,0x02 INT 0x16 ; keyboard BIOS MOV [LEDS],AL -; PIC‚ªˆêØ‚ÌŠ„‚èž‚Ý‚ðŽó‚¯•t‚¯‚È‚¢‚悤‚É‚·‚é -; ATŒÝŠ·‹@‚ÌŽd—l‚Å‚ÍAPIC‚̉Šú‰»‚ð‚·‚é‚È‚çA -; ‚±‚¢‚‚ðCLI‘O‚É‚â‚Á‚Ä‚¨‚©‚È‚¢‚ÆA‚½‚܂Ƀnƒ“ƒOƒAƒbƒv‚·‚é -; PIC‚̉Šú‰»‚Í‚ ‚Æ‚Å‚â‚é +; 防止PIC接å—所有中断 +; AT兼容机的规范ã€PICåˆå§‹åŒ– +; 然åŽä¹‹å‰åœ¨CLIä¸åšä»»ä½•äº‹å°±æŒ‚èµ· +; PIC在åŒæ„åŽåˆå§‹åŒ– MOV AL,0xff OUT 0x21,AL - NOP ; OUT–½—ß‚ð˜A‘±‚³‚¹‚é‚Æ‚¤‚Ü‚­‚¢‚©‚È‚¢‹@Ží‚ª‚ ‚é‚炵‚¢‚Ì‚Å + NOP ; ä¸æ–­æ‰§è¡ŒOUT指令 OUT 0xa1,AL - CLI ; ‚³‚ç‚ÉCPUƒŒƒxƒ‹‚Å‚àŠ„‚èž‚Ý‹ÖŽ~ + CLI ; 进一步中断CPU -; CPU‚©‚ç1MBˆÈã‚̃ƒ‚ƒŠ‚ɃAƒNƒZƒX‚Å‚«‚é‚悤‚ÉAA20GATE‚ðÝ’è +; 让CPU支æŒ1M以上内存ã€è®¾ç½®A20GATE CALL waitkbdout MOV AL,0xd1 @@ -53,72 +53,72 @@ VRAM EQU 0x0ff8 ; OUT 0x60,AL CALL waitkbdout -; ƒvƒƒeƒNƒgƒ‚[ƒhˆÚs +; ä¿æŠ¤æ¨¡å¼è½¬æ¢ -[INSTRSET "i486p"] ; 486‚Ì–½—ß‚Ü‚ÅŽg‚¢‚½‚¢‚Æ‚¢‚¤‹Lq +[INSTRSET "i486p"] ; 说明使用486指令 - LGDT [GDTR0] ; Žb’èGDT‚ðÝ’è + LGDT [GDTR0] ; 设置临时GDT MOV EAX,CR0 - AND EAX,0x7fffffff ; bit31‚ð0‚É‚·‚éiƒy[ƒWƒ“ƒO‹ÖŽ~‚Ì‚½‚ßj - OR EAX,0x00000001 ; bit0‚ð1‚É‚·‚éiƒvƒƒeƒNƒgƒ‚[ƒhˆÚs‚Ì‚½‚ßj + AND EAX,0x7fffffff ; 使用bit31(ç¦ç”¨åˆ†é¡µï¼‰ + OR EAX,0x00000001 ; bit0到1转æ¢ï¼ˆä¿æŠ¤æ¨¡å¼è¿‡æ¸¡ï¼‰ MOV CR0,EAX JMP pipelineflush pipelineflush: - MOV AX,1*8 ; “Ç‚Ý‘‚«‰Â”\ƒZƒOƒƒ“ƒg32bit + MOV AX,1*8 ; 写32bit的段 MOV DS,AX MOV ES,AX MOV FS,AX MOV GS,AX MOV SS,AX -; bootpack‚Ì“]‘— +; bootpack传递 - MOV ESI,bootpack ; “]‘—Œ³ - MOV EDI,BOTPAK ; “]‘—æ + MOV ESI,bootpack ; æº + MOV EDI,BOTPAK ; 目标 MOV ECX,512*1024/4 CALL memcpy -; ‚‚¢‚łɃfƒBƒXƒNƒf[ƒ^‚à–{—ˆ‚̈ʒu‚Ö“]‘— +; 传输ç£ç›˜æ•°æ® -; ‚Ü‚¸‚̓u[ƒgƒZƒNƒ^‚©‚ç +; 从引导区开始 - MOV ESI,0x7c00 ; “]‘—Œ³ - MOV EDI,DSKCAC ; “]‘—æ + MOV ESI,0x7c00 ; æº + MOV EDI,DSKCAC ; 目标 MOV ECX,512/4 CALL memcpy -; Žc‚è‘S•” +; 剩余的全部 - MOV ESI,DSKCAC0+512 ; “]‘—Œ³ - MOV EDI,DSKCAC+512 ; “]‘—æ + MOV ESI,DSKCAC0+512 ; æº + MOV EDI,DSKCAC+512 ; 目标 MOV ECX,0 MOV CL,BYTE [CYLS] - IMUL ECX,512*18*2/4 ; ƒVƒŠƒ“ƒ_”‚©‚çƒoƒCƒg”/4‚É•ÏŠ· - SUB ECX,512/4 ; IPL‚Ì•ª‚¾‚¯·‚µˆø‚­ + IMUL ECX,512*18*2/4 ; 除以4得到字节数 + SUB ECX,512/4 ; IPLåç§»é‡ CALL memcpy -; asmhead‚Å‚µ‚È‚¯‚ê‚΂¢‚¯‚È‚¢‚±‚Æ‚Í‘S•”‚µI‚í‚Á‚½‚Ì‚ÅA -; ‚ ‚Æ‚Íbootpack‚É”C‚¹‚é +; 由于还需è¦asmheadæ‰èƒ½å®Œæˆ +; 完æˆå…¶ä½™çš„bootpack任务 -; bootpack‚Ì‹N“® +; bootpackå¯åŠ¨ MOV EBX,BOTPAK MOV ECX,[EBX+16] ADD ECX,3 ; ECX += 3; SHR ECX,2 ; ECX /= 4; - JZ skip ; “]‘—‚·‚é‚ׂ«‚à‚Ì‚ª‚È‚¢ - MOV ESI,[EBX+20] ; “]‘—Œ³ + JZ skip ; ä¼ è¾“å®Œæˆ + MOV ESI,[EBX+20] ; æº ADD ESI,EBX - MOV EDI,[EBX+12] ; “]‘—æ + MOV EDI,[EBX+12] ; 目标 CALL memcpy skip: - MOV ESP,[EBX+12] ; ƒXƒ^ƒbƒN‰Šú’l + MOV ESP,[EBX+12] ; 堆栈的åˆå§‹åŒ– JMP DWORD 2*8:0x0000001b waitkbdout: IN AL,0x64 AND AL,0x02 - JNZ waitkbdout ; AND‚ÌŒ‹‰Ê‚ª0‚Å‚È‚¯‚ê‚Îwaitkbdout‚Ö + JNZ waitkbdout ; AND结果ä¸ä¸º0跳转到waitkbdout RET memcpy: @@ -127,15 +127,15 @@ memcpy: MOV [EDI],EAX ADD EDI,4 SUB ECX,1 - JNZ memcpy ; ˆø‚«ŽZ‚µ‚½Œ‹‰Ê‚ª0‚Å‚È‚¯‚ê‚Îmemcpy‚Ö + JNZ memcpy ; è¿ç®—结果ä¸ä¸º0跳转到memcpy RET -; memcpy‚̓AƒhƒŒƒXƒTƒCƒYƒvƒŠƒtƒBƒNƒX‚ð“ü‚ê–Y‚ê‚È‚¯‚ê‚ÎAƒXƒgƒŠƒ“ƒO–½—ß‚Å‚à‘‚¯‚é +; memcpy地å€å‰ç¼€å¤§å° ALIGNB 16 GDT0: - RESB 8 ; ƒkƒ‹ƒZƒŒƒNƒ^ - DW 0xffff,0x0000,0x9200,0x00cf ; “Ç‚Ý‘‚«‰Â”\ƒZƒOƒƒ“ƒg32bit - DW 0xffff,0x0000,0x9a28,0x0047 ; ŽÀs‰Â”\ƒZƒOƒƒ“ƒg32bitibootpack—pj + RESB 8 ; åˆå§‹å€¼ + DW 0xffff,0x0000,0x9200,0x00cf ; 写32bitä½æ®µå¯„存器 + DW 0xffff,0x0000,0x9a28,0x0047 ; å¯æ‰§è¡Œçš„文件的32bit寄存器(bootpack用) DW 0 GDTR0: diff --git a/04_day/ipl10.nas b/04_day/ipl10.nas index 3e016f9..7108a21 100644 --- a/04_day/ipl10.nas +++ b/04_day/ipl10.nas @@ -1,105 +1,109 @@ ; haribote-ipl ; TAB=4 -CYLS EQU 10 ; ‚Ç‚±‚Ü‚Å“Ç‚Ýž‚Þ‚© +CYLS EQU 10 ; 声明CYLS=10 - ORG 0x7c00 ; ‚±‚̃vƒƒOƒ‰ƒ€‚ª‚Ç‚±‚É“Ç‚Ýž‚Ü‚ê‚é‚Ì‚© + ORG 0x7c00 ; 指明程åºè£…è½½åœ°å€ -; ˆÈ‰º‚Í•W€“I‚ÈFAT12ƒtƒH[ƒ}ƒbƒgƒtƒƒbƒs[ƒfƒBƒXƒN‚Ì‚½‚ß‚Ì‹Lq +; 标准FAT12æ ¼å¼è½¯ç›˜ä¸“ç”¨çš„ä»£ç  Stand FAT12 format floppy code JMP entry DB 0x90 - DB "HARIBOTE" ; ƒu[ƒgƒZƒNƒ^‚Ì–¼‘O‚ðŽ©—R‚É‘‚¢‚Ä‚æ‚¢i8ƒoƒCƒgj - DW 512 ; 1ƒZƒNƒ^‚Ì‘å‚«‚³i512‚É‚µ‚È‚¯‚ê‚΂¢‚¯‚È‚¢j - DB 1 ; ƒNƒ‰ƒXƒ^‚Ì‘å‚«‚³i1ƒZƒNƒ^‚É‚µ‚È‚¯‚ê‚΂¢‚¯‚È‚¢j - DW 1 ; FAT‚ª‚Ç‚±‚©‚çŽn‚Ü‚é‚©i•’Ê‚Í1ƒZƒNƒ^–Ú‚©‚ç‚É‚·‚éj - DB 2 ; FAT‚̌”i2‚É‚µ‚È‚¯‚ê‚΂¢‚¯‚È‚¢j - DW 224 ; ƒ‹[ƒgƒfƒBƒŒƒNƒgƒŠ—̈æ‚Ì‘å‚«‚³i•’Ê‚Í224ƒGƒ“ƒgƒŠ‚É‚·‚éj - DW 2880 ; ‚±‚̃hƒ‰ƒCƒu‚Ì‘å‚«‚³i2880ƒZƒNƒ^‚É‚µ‚È‚¯‚ê‚΂¢‚¯‚È‚¢j - DB 0xf0 ; ƒƒfƒBƒA‚̃^ƒCƒvi0xf0‚É‚µ‚È‚¯‚ê‚΂¢‚¯‚È‚¢j - DW 9 ; FAT—̈æ‚Ì’·‚³i9ƒZƒNƒ^‚É‚µ‚È‚¯‚ê‚΂¢‚¯‚È‚¢j - DW 18 ; 1ƒgƒ‰ƒbƒN‚É‚¢‚­‚‚̃ZƒNƒ^‚ª‚ ‚é‚©i18‚É‚µ‚È‚¯‚ê‚΂¢‚¯‚È‚¢j - DW 2 ; ƒwƒbƒh‚Ì”i2‚É‚µ‚È‚¯‚ê‚΂¢‚¯‚È‚¢j - DD 0 ; ƒp[ƒeƒBƒVƒ‡ƒ“‚ðŽg‚Á‚Ä‚È‚¢‚Ì‚Å‚±‚±‚Í•K‚¸0 - DD 2880 ; ‚±‚̃hƒ‰ƒCƒu‘å‚«‚³‚ð‚à‚¤ˆê“x‘‚­ - DB 0,0,0x29 ; ‚æ‚­‚í‚©‚ç‚È‚¢‚¯‚Ç‚±‚Ì’l‚É‚µ‚Ä‚¨‚­‚Æ‚¢‚¢‚炵‚¢ - DD 0xffffffff ; ‚½‚Ô‚ñƒ{ƒŠƒ…[ƒ€ƒVƒŠƒAƒ‹”Ô† - DB "HARIBOTEOS " ; ƒfƒBƒXƒN‚Ì–¼‘Oi11ƒoƒCƒgj - DB "FAT12 " ; ƒtƒH[ƒ}ƒbƒg‚Ì–¼‘Oi8ƒoƒCƒgj - RESB 18 ; ‚Æ‚è‚ ‚¦‚¸18ƒoƒCƒg‚ ‚¯‚Ä‚¨‚­ - -; ƒvƒƒOƒ‰ƒ€–{‘Ì + DB "HARIBOTE" ; å¯åŠ¨æ‰‡åŒºå称(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 "HARIBOTEOS " ; ç£ç›˜çš„å称(必须为11å­—?,ä¸è¶³å¡«ç©ºæ ¼ï¼‰ + DB "FAT12 " ; ç£ç›˜æ ¼å¼å称(必??8å­—?,ä¸è¶³å¡«ç©ºæ ¼ï¼‰ + RESB 18 ; 先空出18字节 + +; 程åºä¸»ä½“ entry: - MOV AX,0 ; ƒŒƒWƒXƒ^‰Šú‰» + MOV AX,0 ; åˆå§‹åŒ–寄存器 MOV SS,AX MOV SP,0x7c00 MOV DS,AX -; ƒfƒBƒXƒN‚ð“Ç‚Þ +; 读å–ç£ç›˜ MOV AX,0x0820 MOV ES,AX - MOV CH,0 ; ƒVƒŠƒ“ƒ_0 - MOV DH,0 ; ƒwƒbƒh0 - MOV CL,2 ; ƒZƒNƒ^2 + MOV CH,0 ; 柱é¢0 + MOV DH,0 ; ç£å¤´0 + MOV CL,2 ; 扇区2 + readloop: - MOV SI,0 ; Ž¸”s‰ñ”‚𔂦‚郌ƒWƒXƒ^ + MOV SI,0 ; 记录失败次数寄存器 + retry: - MOV AH,0x02 ; AH=0x02 : ƒfƒBƒXƒN“Ç‚Ýž‚Ý - MOV AL,1 ; 1ƒZƒNƒ^ + MOV AH,0x02 ; AH=0x02 : 读入ç£ç›˜ + MOV AL,1 ; 1个扇区 MOV BX,0 - MOV DL,0x00 ; Aƒhƒ‰ƒCƒu - INT 0x13 ; ƒfƒBƒXƒNBIOSŒÄ‚Ño‚µ - JNC next ; ƒGƒ‰[‚ª‚¨‚«‚È‚¯‚ê‚Înext‚Ö - ADD SI,1 ; SI‚É1‚ð‘«‚· - CMP SI,5 ; SI‚Æ5‚ð”äŠr - JAE error ; SI >= 5 ‚¾‚Á‚½‚çerror‚Ö + MOV DL,0x00 ; A驱动器 + INT 0x13 ; 调用ç£ç›˜BIOS + JNC next ; 没出错则跳转到fin + ADD SI,1 ; å¾€SI加1 + CMP SI,5 ; 比较SI与5 + JAE error ; SI >= 5 跳转到error MOV AH,0x00 - MOV DL,0x00 ; Aƒhƒ‰ƒCƒu - INT 0x13 ; ƒhƒ‰ƒCƒu‚̃ŠƒZƒbƒg + MOV DL,0x00 ; A驱动器 + INT 0x13 ; é‡ç½®é©±åŠ¨å™¨ JMP retry next: - MOV AX,ES ; ƒAƒhƒŒƒX‚ð0x200i‚ß‚é + MOV AX,ES ; 把内存地å€åŽç§»0x200(512/16å六进制转æ¢ï¼‰ ADD AX,0x0020 - MOV ES,AX ; ADD ES,0x020 ‚Æ‚¢‚¤–½—ß‚ª‚È‚¢‚Ì‚Å‚±‚¤‚µ‚Ä‚¢‚é - ADD CL,1 ; CL‚É1‚ð‘«‚· - CMP CL,18 ; CL‚Æ18‚ð”äŠr - JBE readloop ; CL <= 18 ‚¾‚Á‚½‚çreadloop‚Ö + MOV ES,AX ; ADD ES,0x020因为没有ADD ES,åªèƒ½é€šè¿‡AX进行 + ADD CL,1 ; å¾€CL里é¢åŠ 1 + CMP CL,18 ; 比较CL与18 + JBE readloop ; CL <= 18 跳转到readloop MOV CL,1 ADD DH,1 CMP DH,2 - JB readloop ; DH < 2 ‚¾‚Á‚½‚çreadloop‚Ö + JB readloop ; DH < 2 跳转到readloop MOV DH,0 ADD CH,1 CMP CH,CYLS - JB readloop ; CH < CYLS ‚¾‚Á‚½‚çreadloop‚Ö - -; “Ç‚ÝI‚í‚Á‚½‚Ì‚Åharibote.sys‚ðŽÀs‚¾I + JB readloop ; CH < CYLS 跳转到readloop - MOV [0x0ff0],CH ; IPL‚ª‚Ç‚±‚Ü‚Å“Ç‚ñ‚¾‚Ì‚©‚ðƒƒ‚ +; 读å–完毕,跳转到haribote.sysæ‰§è¡Œï¼ + MOV [0x0ff0],CH ; IPLãŒã©ã“ã¾ã§èª­ã‚“ã ã®ã‹ã‚’メモ JMP 0xc200 error: MOV SI,msg + putloop: MOV AL,[SI] - ADD SI,1 ; SI‚É1‚ð‘«‚· + ADD SI,1 ; ç»™SI加1 CMP AL,0 JE fin - MOV AH,0x0e ; ˆê•¶Žš•\Ž¦ƒtƒ@ƒ“ƒNƒVƒ‡ƒ“ - MOV BX,15 ; ƒJƒ‰[ƒR[ƒh - INT 0x10 ; ƒrƒfƒIBIOSŒÄ‚Ño‚µ + MOV AH,0x0e ; 显示一个文字 + MOV BX,15 ; 指定字符颜色 + INT 0x10 ; 调用显å¡BIOS JMP putloop + fin: - HLT ; ‰½‚©‚ ‚é‚Ü‚ÅCPU‚ð’âŽ~‚³‚¹‚é - JMP fin ; –³ŒÀƒ‹[ƒv + HLT ; 让CPUåœæ­¢ï¼Œç­‰å¾…指令 + JMP fin ; æ— é™å¾ªçŽ¯ + msg: - DB 0x0a, 0x0a ; ‰üs‚ð2‚ + DB 0x0a, 0x0a ; æ¢è¡Œä¸¤æ¬¡ DB "load error" - DB 0x0a ; ‰üs + DB 0x0a ; æ¢è¡Œ DB 0 - RESB 0x7dfe-$ ; 0x7dfe‚Ü‚Å‚ð0x00‚Å–„‚ß‚é–½—ß + RESB 0x7dfe-$ ; 填写0x00直到0x001fe DB 0x55, 0xaa