From 49287c150533d82f1300eebda43747af11652593 Mon Sep 17 00:00:00 2001 From: Yourtion Date: Tue, 12 Apr 2016 11:22:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=85=E5=AD=98=E5=AE=B9=E9=87=8F=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=EF=BC=882=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 09_day/bootpack.c | 26 -------------------------- 09_day/naskfunc.nas | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/09_day/bootpack.c b/09_day/bootpack.c index 95df564..040412f 100644 --- a/09_day/bootpack.c +++ b/09_day/bootpack.c @@ -4,7 +4,6 @@ #include unsigned int memtest(unsigned int start, unsigned int end); -unsigned int memtest_sub(unsigned int start, unsigned int end); void HariMain(void) { @@ -129,28 +128,3 @@ unsigned int memtest(unsigned int start, unsigned int end) return i; } - -unsigned int memtest_sub(unsigned int start, unsigned int end) -{ - unsigned int i, *p, old, pat0 = 0xaa55aa55, pat1 = 0x55aa55aa; - for (i = start; i <= end; i += 0x1000) { - p = (unsigned int *) (i + 0xffc); - old = *p; /* 先记住修改前的值 */ - *p = pat0; /* 试写 */ - *p ^= 0xffffffff; /* 反转 */ - if (*p != pat1) { - /* 检查反转结果 */ - not_memory: - *p = old; - break; - } - *p ^= 0xffffffff; /* 再次反转 */ - if (*p != pat0) { - /* 检查值是否恢复 */ - goto not_memory; - } - *p = old; /* 恢复为修改前的值 */ - } - return i; -} - diff --git a/09_day/naskfunc.nas b/09_day/naskfunc.nas index 3322225..9de8522 100644 --- a/09_day/naskfunc.nas +++ b/09_day/naskfunc.nas @@ -13,6 +13,7 @@ GLOBAL _load_gdtr, _load_idtr GLOBAL _load_cr0, _store_cr0 GLOBAL _asm_inthandler21, _asm_inthandler27, _asm_inthandler2c + GLOBAL _memtest_sub EXTERN _inthandler21, _inthandler27, _inthandler2c [SECTION .text] @@ -148,3 +149,36 @@ _asm_inthandler2c: POP DS POP ES IRETD + +_memtest_sub: ; unsigned int memtest_sub(unsigned int start, unsigned int end) + PUSH EDI ; (由于还要使用EBX, ESI, EDI) + PUSH ESI + PUSH EBX + MOV ESI,0xaa55aa55 ; pat0 = 0xaa55aa55; + MOV EDI,0x55aa55aa ; pat1 = 0x55aa55aa; + MOV EAX,[ESP+12+4] ; i = start; +mts_loop: + MOV EBX,EAX + ADD EBX,0xffc ; p = i + 0xffc; + MOV EDX,[EBX] ; old = *p; + MOV [EBX],ESI ; *p = pat0; + XOR DWORD [EBX],0xffffffff ; *p ^= 0xffffffff; + CMP EDI,[EBX] ; if (*p != pat1) goto fin; + JNE mts_fin + XOR DWORD [EBX],0xffffffff ; *p ^= 0xffffffff; + CMP ESI,[EBX] ; if (*p != pat0) goto fin; + JNE mts_fin + MOV [EBX],EDX ; *p = old; + ADD EAX,0x1000 ; i += 0x1000; + CMP EAX,[ESP+12+8] ; if (i <= end) goto mts_loop; + JBE mts_loop + POP EBX + POP ESI + POP EDI + RET +mts_fin: + MOV [EBX],EDX ; *p = old; + POP EBX + POP ESI + POP EDI + RET