From 984b2886d07ab13b10aeddc6de530f76b2a89fb8 Mon Sep 17 00:00:00 2001 From: Yourtion Date: Tue, 3 May 2016 11:42:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8D=E7=BB=93=E6=9D=9F=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 20_day/bootpack.h | 1 + 20_day/console.c | 2 +- 20_day/hlt.nas | 16 +++++++++++----- 20_day/naskfunc.nas | 6 +++++- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/20_day/bootpack.h b/20_day/bootpack.h index e16df46..e850791 100644 --- a/20_day/bootpack.h +++ b/20_day/bootpack.h @@ -30,6 +30,7 @@ void asm_inthandler27(void); void asm_inthandler2c(void); unsigned int memtest_sub(unsigned int start, unsigned int end); void farjmp(int eip, int cs); +void farcall(int eip, int cs); void asm_cons_putchar(void); /* fifo.c */ diff --git a/20_day/console.c b/20_day/console.c index 9b966ac..b99d188 100644 --- a/20_day/console.c +++ b/20_day/console.c @@ -256,7 +256,7 @@ void cmd_hlt(struct CONSOLE *cons, int *fat) p = (char *) memman_alloc_4k(memman, finfo->size); file_loadfile(finfo->clustno, finfo->size, p, fat, (char *) (ADR_DISKIMG + 0x003e00)); set_segmdesc(gdt + 1003, finfo->size - 1, (int) p, AR_CODE32_ER); - farjmp(0, 1003 * 8); + farcall(0, 1003 * 8); memman_free_4k(memman, (int) p, finfo->size); } else { /*没有找到文件的情况*/ diff --git a/20_day/hlt.nas b/20_day/hlt.nas index 475c8fa..44a1079 100644 --- a/20_day/hlt.nas +++ b/20_day/hlt.nas @@ -1,6 +1,12 @@ [BITS 32] - MOV AL,'A' - CALL 2*8:0xbe3 -fin: - HLT - JMP fin \ No newline at end of file + MOV AL,'h' + CALL 2*8:0xbe8 + MOV AL,'e' + CALL 2*8:0xbe8 + MOV AL,'l' + CALL 2*8:0xbe8 + MOV AL,'l' + CALL 2*8:0xbe8 + MOV AL,'o' + CALL 2*8:0xbe8 + RETF diff --git a/20_day/naskfunc.nas b/20_day/naskfunc.nas index 84b0bdc..b6ed01e 100644 --- a/20_day/naskfunc.nas +++ b/20_day/naskfunc.nas @@ -16,7 +16,7 @@ GLOBAL _asm_inthandler20, _asm_inthandler21 GLOBAL _asm_inthandler27, _asm_inthandler2c GLOBAL _memtest_sub - GLOBAL _farjmp + GLOBAL _farjmp, _farcall GLOBAL _asm_cons_putchar EXTERN _inthandler20, _inthandler21 EXTERN _inthandler27, _inthandler2c @@ -213,6 +213,10 @@ _farjmp: ; void farjmp(int eip, int cs); JMP FAR [ESP+4] ; eip, cs RET +_farcall: ; void farcall(int eip, int cs); + CALL FAR [ESP+4] ; eip, cs + RET + _asm_cons_putchar: PUSH 1 AND EAX,0xff ; 将AH和EAX的高位置0,将EAX置为已存入字符编码的状态