diff --git a/06_day/Makefile b/06_day/Makefile index 60583be..08ef849 100644 --- a/06_day/Makefile +++ b/06_day/Makefile @@ -15,12 +15,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 @@ -81,7 +81,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/06_day/asmhead.nas b/06_day/asmhead.nas index 4b8b8ae..c5bce1b 100644 --- a/06_day/asmhead.nas +++ b/06_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/06_day/bootpack.c b/06_day/bootpack.c index 0c19244..056362a 100644 --- a/06_day/bootpack.c +++ b/06_day/bootpack.c @@ -1,4 +1,4 @@ -/* bootpack‚̃ƒCƒ“ */ +/* bootpack */ #include @@ -68,7 +68,8 @@ void HariMain(void) init_gdtidt(); init_palette(); init_screen8(binfo->vram, binfo->scrnx, binfo->scrny); - mx = (binfo->scrnx - 16) / 2; /* ‰æ–Ê’†‰›‚É‚È‚é‚æ‚¤‚ÉÀ•WŒvŽZ */ + + mx = (binfo->scrnx - 16) / 2; /* 计算画é¢çš„ä¸­å¿ƒåæ ‡*/ my = (binfo->scrny - 28 - 16) / 2; init_mouse_cursor8(mcursor, COL8_008484); putblock8_8(binfo->vram, binfo->scrnx, 16, 16, mx, my, mcursor, 16); @@ -78,4 +79,4 @@ void HariMain(void) for (;;) { io_hlt(); } -} +} \ No newline at end of file diff --git a/06_day/dsctbl.c b/06_day/dsctbl.c index d7d2d0d..8d053c9 100644 --- a/06_day/dsctbl.c +++ b/06_day/dsctbl.c @@ -1,4 +1,4 @@ -/* GDT‚âIDT‚ȂǂÌA descriptor table ŠÖŒW */ +/* GDTã€IDTã€descriptor table å…³ç³»å¤„ç† */ struct SEGMENT_DESCRIPTOR { short limit_low, base_low; @@ -24,7 +24,7 @@ void init_gdtidt(void) struct GATE_DESCRIPTOR *idt = (struct GATE_DESCRIPTOR *) 0x0026f800; int i; - /* GDT‚̉Šú‰» */ + /* GDTåˆå§‹åŒ– */ for (i = 0; i < 8192; i++) { set_segmdesc(gdt + i, 0, 0, 0); } @@ -32,7 +32,7 @@ void init_gdtidt(void) set_segmdesc(gdt + 2, 0x0007ffff, 0x00280000, 0x409a); load_gdtr(0xffff, 0x00270000); - /* IDT‚̉Šú‰» */ + /* IDTåˆå§‹åŒ– */ for (i = 0; i < 256; i++) { set_gatedesc(idt + i, 0, 0, 0); } diff --git a/06_day/graphic.c b/06_day/graphic.c index f10802f..f4b0abf 100644 --- a/06_day/graphic.c +++ b/06_day/graphic.c @@ -1,4 +1,4 @@ -/* ƒOƒ‰ƒtƒBƒbƒNˆ—ŠÖŒW */ +/* å…³äºŽç»˜å›¾éƒ¨åˆ†çš„å¤„ç† */ void io_hlt(void); void io_cli(void); @@ -36,34 +36,34 @@ void putblock8_8(char *vram, int vxsize, int pxsize, void init_palette(void) { static unsigned char table_rgb[16 * 3] = { - 0x00, 0x00, 0x00, /* 0:• */ - 0xff, 0x00, 0x00, /* 1:–¾‚é‚¢Ô */ - 0x00, 0xff, 0x00, /* 2:–¾‚é‚¢—Î */ - 0xff, 0xff, 0x00, /* 3:–¾‚é‚¢‰©F */ - 0x00, 0x00, 0xff, /* 4:–¾‚邢 */ - 0xff, 0x00, 0xff, /* 5:–¾‚邢އ */ - 0x00, 0xff, 0xff, /* 6:–¾‚é‚¢…F */ - 0xff, 0xff, 0xff, /* 7:”’ */ - 0xc6, 0xc6, 0xc6, /* 8:–¾‚é‚¢ŠDF */ - 0x84, 0x00, 0x00, /* 9:ˆÃ‚¢Ô */ - 0x00, 0x84, 0x00, /* 10:ˆÃ‚¢—Î */ - 0x84, 0x84, 0x00, /* 11:ˆÃ‚¢‰©F */ - 0x00, 0x00, 0x84, /* 12:ˆÃ‚¢Â */ - 0x84, 0x00, 0x84, /* 13:ˆÃ‚¢Ž‡ */ - 0x00, 0x84, 0x84, /* 14:ˆÃ‚¢…F */ - 0x84, 0x84, 0x84 /* 15:ˆÃ‚¢ŠDF */ + 0x00, 0x00, 0x00, /* 0:黑 */ + 0xff, 0x00, 0x00, /* 1:æ¢çº¢ */ + 0x00, 0xff, 0x00, /* 2:亮绿 */ + 0xff, 0xff, 0x00, /* 3:亮黄 */ + 0x00, 0x00, 0xff, /* 4:äº®è“ */ + 0xff, 0x00, 0xff, /* 5:亮紫 */ + 0x00, 0xff, 0xff, /* 6:æµ…äº®è“ */ + 0xff, 0xff, 0xff, /* 7:白 */ + 0xc6, 0xc6, 0xc6, /* 8:äº®ç° */ + 0x84, 0x00, 0x00, /* 9:暗红 */ + 0x00, 0x84, 0x00, /* 10:暗绿 */ + 0x84, 0x84, 0x00, /* 11:暗黄 */ + 0x00, 0x00, 0x84, /* 12:æš—é’ */ + 0x84, 0x00, 0x84, /* 13:æš—ç´« */ + 0x00, 0x84, 0x84, /* 14:æµ…æš—è“ */ + 0x84, 0x84, 0x84 /* 15:æš—ç° */ }; set_palette(0, 15, table_rgb); return; - /* static char –½—ß‚ÍAƒf[ƒ^‚É‚µ‚©Žg‚¦‚È‚¢‚¯‚ÇDB–½—ߑГ– */ + /* C语言中的static char语å¥åªèƒ½ç”¨äºŽæ•°æ®ï¼Œç›¸å½“于汇编中的DB指令 */ } void set_palette(int start, int end, unsigned char *rgb) { int i, eflags; - eflags = io_load_eflags(); /* Š„‚螂݋–‰Âƒtƒ‰ƒO‚Ì’l‚ð‹L˜^‚·‚é */ - io_cli(); /* ‹–‰Âƒtƒ‰ƒO‚ð0‚É‚µ‚ÄŠ„‚螂݋֎~‚É‚·‚é */ + eflags = io_load_eflags(); /* è®°å½•ä¸­æ–­è®¸å¯æ ‡å¿—的值 */ + io_cli(); /* å°†ä¸­æ–­è®¸å¯æ ‡å¿—置为0,ç¦æ­¢ä¸­æ–­ */ io_out8(0x03c8, start); for (i = start; i <= end; i++) { io_out8(0x03c9, rgb[0] / 4); @@ -71,7 +71,7 @@ void set_palette(int start, int end, unsigned char *rgb) io_out8(0x03c9, rgb[2] / 4); rgb += 3; } - io_store_eflags(eflags); /* Š„‚螂݋–‰Âƒtƒ‰ƒO‚ðŒ³‚É–ß‚· */ + io_store_eflags(eflags); /* å¤åŽŸä¸­æ–­è®¸å¯æ ‡å¿— */ return; } @@ -128,6 +128,7 @@ void putfont8(char *vram, int xsize, int x, int y, char c, char *font) void putfonts8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s) { extern char hankaku[4096]; + /* C语言中,字符串都是以0x00结尾 */ for (; *s != 0x00; s++) { putfont8(vram, xsize, x, y, c, hankaku + *s * 16); x += 8; @@ -136,7 +137,7 @@ void putfonts8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s } void init_mouse_cursor8(char *mouse, char bc) -/* ƒ}ƒEƒXƒJ[ƒ\ƒ‹‚ð€”õi16x16j */ +/* 鼠标的数æ®å‡†å¤‡ï¼ˆ16x16) */ { static char cursor[16][16] = { "**************..", diff --git a/06_day/ipl10.nas b/06_day/ipl10.nas index 3e016f9..7108a21 100644 --- a/06_day/ipl10.nas +++ b/06_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‚ ‚¯‚Ä‚¨‚­ + 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字节 -; ƒvƒƒOƒ‰ƒ€–{‘Ì +; 程åºä¸»ä½“ 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‚Ö + JB readloop ; CH < CYLS 跳转到readloop -; “Ç‚ÝI‚í‚Á‚½‚Ì‚Åharibote.sys‚ðŽÀs‚¾I - - 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 diff --git a/06_day/naskfunc.nas b/06_day/naskfunc.nas index b46ca1a..32d1b1b 100644 --- a/06_day/naskfunc.nas +++ b/06_day/naskfunc.nas @@ -1,10 +1,10 @@ ; naskfunc ; TAB=4 -[FORMAT "WCOFF"] ; ƒIƒuƒWƒFƒNƒgƒtƒ@ƒCƒ‹‚ðì‚郂[ƒh -[INSTRSET "i486p"] ; 486‚Ì–½—߂܂Ŏg‚¢‚½‚¢‚Æ‚¢‚¤‹Lq -[BITS 32] ; 32ƒrƒbƒgƒ‚[ƒh—p‚Ì‹@ŠBŒê‚ðì‚点‚é -[FILE "naskfunc.nas"] ; ƒ\[ƒXƒtƒ@ƒCƒ‹–¼î•ñ +[FORMAT "WCOFF"] ; åˆ¶ä½œç›®æ ‡æ–‡ä»¶çš„æ¨¡å¼ +[INSTRSET "i486p"] ; 使用到486为止的指令 +[BITS 32] ; 3制作32使¨¡å¼ç”¨çš„æœºå™¨è¯­è¨€ +[FILE "naskfunc.nas"] ; 文件å GLOBAL _io_hlt, _io_cli, _io_sti, _io_stihlt GLOBAL _io_in8, _io_in16, _io_in32 @@ -67,16 +67,16 @@ _io_out32: ; void io_out32(int port, int data); RET _io_load_eflags: ; int io_load_eflags(void); - PUSHFD ; PUSH EFLAGS ‚Æ‚¢‚¤ˆÓ–¡ + PUSHFD ; PUSH EFLAGS POP EAX RET _io_store_eflags: ; void io_store_eflags(int eflags); MOV EAX,[ESP+4] PUSH EAX - POPFD ; POP EFLAGS ‚Æ‚¢‚¤ˆÓ–¡ + POPFD ; POP EFLAGS RET - + _load_gdtr: ; void load_gdtr(int limit, int addr); MOV AX,[ESP+4] ; limit MOV [ESP+6],AX @@ -87,4 +87,4 @@ _load_idtr: ; void load_idtr(int limit, int addr); MOV AX,[ESP+4] ; limit MOV [ESP+6],AX LIDT [ESP+6] - RET + RET \ No newline at end of file