mirror of
https://github.com/yourtion/30dayMakeOS.git
synced 2026-02-05 02:53:19 +08:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0fd3455e42 | ||
|
|
17b146940c | ||
|
|
e1d760124c |
@@ -52,10 +52,29 @@ hello.hrb : hello.nas Makefile
|
||||
hello2.hrb : hello2.nas Makefile
|
||||
$(NASK) hello2.nas hello2.hrb hello2.lst
|
||||
|
||||
a.bim : a.obj a_nask.obj Makefile
|
||||
$(OBJ2BIM) @$(RULEFILE) out:a.bim map:a.map a.obj a_nask.obj
|
||||
|
||||
a.hrb : a.bim Makefile
|
||||
$(BIM2HRB) a.bim a.hrb 0
|
||||
|
||||
hello3.bim : hello3.obj a_nask.obj Makefile
|
||||
$(OBJ2BIM) @$(RULEFILE) out:hello3.bim map:hello3.map hello3.obj a_nask.obj
|
||||
|
||||
hello3.hrb : hello3.bim Makefile
|
||||
$(BIM2HRB) hello3.bim hello3.hrb 0
|
||||
|
||||
haribote.sys : asmhead.bin bootpack.hrb Makefile
|
||||
copy /B asmhead.bin+bootpack.hrb haribote.sys
|
||||
|
||||
haribote.img : ipl10.bin haribote.sys hello.hrb hello2.hrb Makefile
|
||||
crack1.bim : crack1.obj Makefile
|
||||
$(OBJ2BIM) @$(RULEFILE) out:crack1.bim map:crack1.map crack1.obj
|
||||
|
||||
crack1.hrb : crack1.bim Makefile
|
||||
$(BIM2HRB) crack1.bim crack1.hrb 0
|
||||
|
||||
haribote.img : ipl10.bin haribote.sys Makefile \
|
||||
hello.hrb hello2.hrb a.hrb hello3.hrb crack1.hrb
|
||||
$(EDIMG) imgin:../z_tools/fdimg0at.tek \
|
||||
wbinimg src:ipl10.bin len:512 from:0 to:0 \
|
||||
copy from:haribote.sys to:@: \
|
||||
@@ -63,8 +82,11 @@ haribote.img : ipl10.bin haribote.sys hello.hrb hello2.hrb Makefile
|
||||
copy from:make.bat to:@: \
|
||||
copy from:hello.hrb to:@: \
|
||||
copy from:hello2.hrb to:@: \
|
||||
copy from:a.hrb to:@: \
|
||||
copy from:hello3.hrb to:@: \
|
||||
copy from:crack1.hrb to:@: \
|
||||
imgout:haribote.img
|
||||
|
||||
|
||||
# 其他指令
|
||||
|
||||
%.gas : %.c bootpack.h Makefile
|
||||
|
||||
7
21_day/a.c
Normal file
7
21_day/a.c
Normal file
@@ -0,0 +1,7 @@
|
||||
void api_putchar(int c);
|
||||
|
||||
void HariMain(void)
|
||||
{
|
||||
api_putchar('A');
|
||||
return;
|
||||
}
|
||||
14
21_day/a_nask.nas
Normal file
14
21_day/a_nask.nas
Normal file
@@ -0,0 +1,14 @@
|
||||
[FORMAT "WCOFF"] ; 生成对象文件的模式
|
||||
[INSTRSET "i486p"] ; 表示使用486兼容指令集
|
||||
[BITS 32] ; 生成32位模式机器语言
|
||||
[FILE "a_nask.nas"] ; 源文件名信息
|
||||
|
||||
GLOBAL _api_putchar
|
||||
|
||||
[SECTION .text]
|
||||
|
||||
_api_putchar: ; void api_putchar(int c);
|
||||
MOV EDX,1
|
||||
MOV AL,[ESP+4] ; c
|
||||
INT 0x40
|
||||
RET
|
||||
@@ -30,7 +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 start_app(int eip, int cs, int esp, int ds);
|
||||
void asm_hrb_api(void);
|
||||
|
||||
/* fifo.c */
|
||||
|
||||
@@ -257,7 +257,7 @@ int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline)
|
||||
struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
|
||||
struct FILEINFO *finfo;
|
||||
struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT;
|
||||
char name[18], *p;
|
||||
char name[18], *p, *q;
|
||||
int i;
|
||||
|
||||
/*根据命令行生成文件名*/
|
||||
@@ -284,11 +284,22 @@ int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline)
|
||||
if (finfo != 0) {
|
||||
/*找到文件的情况*/
|
||||
p = (char *) memman_alloc_4k(memman, finfo->size);
|
||||
q = (char *) memman_alloc_4k(memman, 64 * 1024);
|
||||
*((int *) 0xfe8) = (int) p;
|
||||
file_loadfile(finfo->clustno, finfo->size, p, fat, (char *) (ADR_DISKIMG + 0x003e00));
|
||||
set_segmdesc(gdt + 1003, finfo->size - 1, (int) p, AR_CODE32_ER);
|
||||
farcall(0, 1003 * 8);
|
||||
set_segmdesc(gdt + 1004, 64 * 1024 - 1, (int) q, AR_DATA32_RW);
|
||||
if (finfo->size >= 8 && strncmp(p + 4, "Hari", 4) == 0) {
|
||||
p[0] = 0xe8;
|
||||
p[1] = 0x16;
|
||||
p[2] = 0x00;
|
||||
p[3] = 0x00;
|
||||
p[4] = 0x00;
|
||||
p[5] = 0xcb;
|
||||
}
|
||||
start_app(0, 1003 * 8, 64 * 1024, 1004 * 8);
|
||||
memman_free_4k(memman, (int) p, finfo->size);
|
||||
memman_free_4k(memman, (int) q, 64 * 1024);
|
||||
cons_newline(cons);
|
||||
return 1;
|
||||
}
|
||||
|
||||
5
21_day/crack1.c
Normal file
5
21_day/crack1.c
Normal file
@@ -0,0 +1,5 @@
|
||||
void HariMain(void)
|
||||
{
|
||||
*((char *) 0x00102600) = 0;
|
||||
return;
|
||||
}
|
||||
11
21_day/hello3.c
Normal file
11
21_day/hello3.c
Normal file
@@ -0,0 +1,11 @@
|
||||
void api_putchar(int c);
|
||||
|
||||
void HariMain(void)
|
||||
{
|
||||
api_putchar('h');
|
||||
api_putchar('e');
|
||||
api_putchar('l');
|
||||
api_putchar('l');
|
||||
api_putchar('o');
|
||||
return;
|
||||
}
|
||||
@@ -16,7 +16,7 @@
|
||||
GLOBAL _asm_inthandler20, _asm_inthandler21
|
||||
GLOBAL _asm_inthandler27, _asm_inthandler2c
|
||||
GLOBAL _memtest_sub
|
||||
GLOBAL _farjmp, _farcall
|
||||
GLOBAL _farjmp, _start_app
|
||||
GLOBAL _asm_hrb_api
|
||||
EXTERN _inthandler20, _inthandler21
|
||||
EXTERN _inthandler27, _inthandler2c
|
||||
@@ -116,29 +116,77 @@ _asm_inthandler20:
|
||||
PUSH ES
|
||||
PUSH DS
|
||||
PUSHAD
|
||||
MOV EAX,ESP
|
||||
PUSH EAX
|
||||
MOV AX,SS
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
CALL _inthandler20
|
||||
POP EAX
|
||||
MOV AX,SS
|
||||
CMP AX,1*8
|
||||
JNE .from_app ; 当操作系统活动时产生中断的情况和之前差不多
|
||||
MOV EAX,ESP
|
||||
PUSH SS ; 保存中断时的SS
|
||||
PUSH EAX ; 保存中断时的ESP
|
||||
MOV AX,SS
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
CALL _inthandler20
|
||||
ADD ESP,8
|
||||
POPAD
|
||||
POP DS
|
||||
POP ES
|
||||
POP DS
|
||||
POP ES
|
||||
IRETD
|
||||
.from_app:
|
||||
; 当应用程序活动时发生中断
|
||||
MOV EAX,1*8
|
||||
MOV DS,AX ; 先仅将DS设定为操作系统用
|
||||
MOV ECX,[0xfe4] ; 操作系统的ESP
|
||||
ADD ECX,-8
|
||||
MOV [ECX+4],SS ; 保存中断时的SS
|
||||
MOV [ECX],ESP ; 保存中断时的ESP
|
||||
MOV SS,AX
|
||||
MOV ES,AX
|
||||
MOV ESP,ECX
|
||||
CALL _inthandler20
|
||||
POP ECX
|
||||
POP EAX
|
||||
MOV SS,AX ; 将SS设回应用程序用
|
||||
MOV ESP,ECX ; 将ESP设回应用程序用
|
||||
POPAD
|
||||
POP DS
|
||||
POP ES
|
||||
IRETD
|
||||
|
||||
_asm_inthandler21:
|
||||
PUSH ES
|
||||
PUSH DS
|
||||
PUSHAD
|
||||
MOV AX,SS
|
||||
CMP AX,1*8
|
||||
JNE .from_app ; 当操作系统活动时产生中断的情况和之前差不多
|
||||
MOV EAX,ESP
|
||||
PUSH EAX
|
||||
PUSH SS ; 保存中断时的SS
|
||||
PUSH EAX ; 保存中断时的ESP
|
||||
MOV AX,SS
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
CALL _inthandler21
|
||||
ADD ESP,8
|
||||
POPAD
|
||||
POP DS
|
||||
POP ES
|
||||
IRETD
|
||||
.from_app:
|
||||
; 当应用程序活动时发生中断
|
||||
MOV EAX,1*8
|
||||
MOV DS,AX ; 先仅将DS设定为操作系统用
|
||||
MOV ECX,[0xfe4] ; 操作系统的ESP
|
||||
ADD ECX,-8
|
||||
MOV [ECX+4],SS ; 保存中断时的SS
|
||||
MOV [ECX],ESP ; 保存中断时的ESP
|
||||
MOV SS,AX
|
||||
MOV ES,AX
|
||||
MOV ESP,ECX
|
||||
CALL _inthandler21
|
||||
POP ECX
|
||||
POP EAX
|
||||
MOV SS,AX ; 将SS设回应用程序用
|
||||
MOV ESP,ECX ; 将ESP设回应用程序用
|
||||
POPAD
|
||||
POP DS
|
||||
POP ES
|
||||
@@ -148,13 +196,37 @@ _asm_inthandler27:
|
||||
PUSH ES
|
||||
PUSH DS
|
||||
PUSHAD
|
||||
MOV AX,SS
|
||||
CMP AX,1*8
|
||||
JNE .from_app ; 当操作系统活动时产生中断的情况和之前差不多
|
||||
MOV EAX,ESP
|
||||
PUSH EAX
|
||||
PUSH SS ; 保存中断时的SS
|
||||
PUSH EAX ; 保存中断时的ESP
|
||||
MOV AX,SS
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
CALL _inthandler27
|
||||
ADD ESP,8
|
||||
POPAD
|
||||
POP DS
|
||||
POP ES
|
||||
IRETD
|
||||
.from_app:
|
||||
; 当应用程序活动时发生中断
|
||||
MOV EAX,1*8
|
||||
MOV DS,AX ; 先仅将DS设定为操作系统用
|
||||
MOV ECX,[0xfe4] ; 操作系统的ESP
|
||||
ADD ECX,-8
|
||||
MOV [ECX+4],SS ; 保存中断时的SS
|
||||
MOV [ECX ],ESP ; 保存中断时的ESP
|
||||
MOV SS,AX
|
||||
MOV ES,AX
|
||||
MOV ESP,ECX
|
||||
CALL _inthandler27
|
||||
POP ECX
|
||||
POP EAX
|
||||
MOV SS,AX ; 将SS设回应用程序用
|
||||
MOV ESP,ECX ; 将ESP设回应用程序用
|
||||
POPAD
|
||||
POP DS
|
||||
POP ES
|
||||
@@ -164,13 +236,38 @@ _asm_inthandler2c:
|
||||
PUSH ES
|
||||
PUSH DS
|
||||
PUSHAD
|
||||
MOV AX,SS
|
||||
CMP AX,1*8
|
||||
JNE .from_app
|
||||
; 当操作系统活动时产生中断的情况和之前差不多
|
||||
MOV EAX,ESP
|
||||
PUSH EAX
|
||||
PUSH SS ; 保存中断时的SS
|
||||
PUSH EAX ; 保存中断时的ESP
|
||||
MOV AX,SS
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
CALL _inthandler2c
|
||||
ADD ESP,8
|
||||
POPAD
|
||||
POP DS
|
||||
POP ES
|
||||
IRETD
|
||||
.from_app:
|
||||
; 当应用程序活动时发生中断
|
||||
MOV EAX,1*8
|
||||
MOV DS,AX ; 先仅将DS设定为操作系统用
|
||||
MOV ECX,[0xfe4] ; 操作系统的ESP
|
||||
ADD ECX,-8
|
||||
MOV [ECX+4],SS ; 保存中断时的SS
|
||||
MOV [ECX ],ESP ; 保存中断时的ESP
|
||||
MOV SS,AX
|
||||
MOV ES,AX
|
||||
MOV ESP,ECX
|
||||
CALL _inthandler2c
|
||||
POP ECX
|
||||
POP EAX
|
||||
MOV SS,AX ; 将SS设回应用程序用
|
||||
MOV ESP,ECX ; 将ESP设回应用程序用
|
||||
POPAD
|
||||
POP DS
|
||||
POP ES
|
||||
@@ -213,15 +310,75 @@ _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
|
||||
_start_app: ; void start_app(int eip, int cs, int esp, int ds);
|
||||
PUSHAD ; 将32位寄存器的值全部保存起来
|
||||
MOV EAX,[ESP+36] ; 应用程序用EIP
|
||||
MOV ECX,[ESP+40] ; 应用程序用CS
|
||||
MOV EDX,[ESP+44] ; 应用程序用ESP
|
||||
MOV EBX,[ESP+48] ; 应用程序用DS/SS
|
||||
MOV [0xfe4],ESP ; 操作系统用ESP
|
||||
CLI ; 在切换过程中禁止中断请求
|
||||
MOV ES,BX
|
||||
MOV SS,BX
|
||||
MOV DS,BX
|
||||
MOV FS,BX
|
||||
MOV GS,BX
|
||||
MOV ESP,EDX
|
||||
STI ; 切换完成后恢复中断请求
|
||||
PUSH ECX ; 用于far-CALL的PUSH(cs)
|
||||
PUSH EAX ; 用于far-CALL的PUSH(eip)
|
||||
CALL FAR [ESP] ; 调用应用程序 ; 应用程序结束后返回此处
|
||||
MOV EAX,1*8 ; 操作系统用DS/SS
|
||||
CLI ; 再次进行切换,禁止中断请求
|
||||
MOV ES,AX
|
||||
MOV SS,AX
|
||||
MOV DS,AX
|
||||
MOV FS,AX
|
||||
MOV GS,AX
|
||||
MOV ESP,[0xfe4]
|
||||
STI ; 切换完成后恢复中断请求
|
||||
POPAD ; 恢复之前保存的寄存器值
|
||||
RET
|
||||
|
||||
_asm_hrb_api:
|
||||
STI
|
||||
PUSHAD ; 用于保存寄存器值的PUSH
|
||||
PUSHAD ; 用于向hrb_api传值的PUSH
|
||||
; 为方便起见从开头就禁止中断请求
|
||||
PUSH DS
|
||||
PUSH ES
|
||||
PUSHAD ; 用于保存的PUSH
|
||||
MOV EAX,1*8
|
||||
MOV DS,AX ; 先仅将DS设定为操作系统用
|
||||
MOV ECX,[0xfe4] ; 操作系统的ESP
|
||||
ADD ECX,-40
|
||||
MOV [ECX+32],ESP ; 保存应用程序的ESP
|
||||
MOV [ECX+36],SS ; 保存应用程序的SS
|
||||
; 将PUSHAD后的值复制到系统栈
|
||||
MOV EDX,[ESP ]
|
||||
MOV EBX,[ESP+ 4]
|
||||
MOV [ECX ],EDX ; 复制传递给hrb_api
|
||||
MOV [ECX+ 4],EBX ; 复制传递给hrb_api
|
||||
MOV EDX,[ESP+ 8]
|
||||
MOV EBX,[ESP+12]
|
||||
MOV [ECX+ 8],EDX ; 复制传递给hrb_api
|
||||
MOV [ECX+12],EBX ; 复制传递给hrb_api
|
||||
MOV EDX,[ESP+16]
|
||||
MOV EBX,[ESP+20]
|
||||
MOV [ECX+16],EDX ; 复制传递给hrb_api
|
||||
MOV [ECX+20],EBX ; 复制传递给hrb_api
|
||||
MOV EDX,[ESP+24]
|
||||
MOV EBX,[ESP+28]
|
||||
MOV [ECX+24],EDX ; 复制传递给hrb_api
|
||||
MOV [ECX+28],EBX ; 复制传递给hrb_api
|
||||
MOV ES,AX ; 将剩余的段寄存器也设为操作系统用
|
||||
MOV SS,AX
|
||||
MOV ESP,ECX
|
||||
STI ; 恢复中断请求
|
||||
CALL _hrb_api
|
||||
ADD ESP,32
|
||||
MOV ECX,[ESP+32] ; 取出应用程序的ESP
|
||||
MOV EAX,[ESP+36] ; 取出应用程序的SS
|
||||
CLI
|
||||
MOV SS,AX
|
||||
MOV ESP,ECX
|
||||
POPAD
|
||||
IRETD
|
||||
POP ES
|
||||
POP DS
|
||||
IRETD ; 这个命令会自动执行STI
|
||||
|
||||
Reference in New Issue
Block a user