自制操作系统6:寻址5M-天高任鸟飞
參考:
https://blog.csdn.net/tyler_download/article/details/52242599
DOS是實(shí)模式,20位總線,1M內(nèi)存。體驗(yàn)不好。寄存器也是16位的。90年代用dos編程,竟然也有WPS這樣的神作,真是佩服求伯君。
windows是保護(hù)模式,32位總線。4G內(nèi)存,80386是經(jīng)典,win95也是經(jīng)典。
保護(hù)模式不再直接尋址,而是用GDT獲取描述符,描述符中再計(jì)算地址。
進(jìn)入保護(hù)模式一個(gè)巨大好處是可以引入C語言。
本次實(shí)驗(yàn)就是把數(shù)據(jù)寫入內(nèi)存5M位置,然后在從這個(gè)位置讀取數(shù)據(jù)顯示出來,體現(xiàn)尋址5M的能力。
boot_read5M.asm
比上節(jié)GDT表中增加了LABEl_DESC_5M這樣一個(gè)段,基地址0500000h,也就是5M的位置。
selector_5M是這個(gè)段離表頭的偏移。
es指向selector_5M,也就是5M的基地址,es:edi循環(huán)寫入字符串msg。
然后顯示msg: [es:si]是5M基地址,到[gs:edi]顯存。
編譯:nasm -o boot.bat boot_read5M.asm
使用上幾節(jié)的OpSystem.java類,這個(gè)只寫了第一個(gè)引導(dǎo)扇區(qū),其他扇區(qū)寫了個(gè)字符串,不影響,可直接使用這個(gè)工具做system.img
加載到virtualbox 運(yùn)行成功:
boot_read5M.asm
%include "pm.inc"
org 0x7c00
jmp LABEL_BEGIN
[SECTION .gdt]
LABEL_GDT: ? ? ? ? Descriptor ?0, ? ? ? ? 0, ? ? ? ? ? ? ? ?0
LABEL_DESC_CODE32: Descriptor ?0, ? ? ? ? SegCode32Len - 1, DA_C + DA_32
LABEL_DESC_VIDEO: ?Descriptor ?0B8000h, ? 0ffffh, ? ? ? ? ? DA_DRW
LABEL_DESC_5M: ? ? Descriptor ?0500000h, ?0ffffh, ? ? ? ? ? DA_DRW
GdtLen equ $ - LABEL_GDT
GdtPtr dw ?GdtLen - 1
? ? ? ?dd ?0
SelectorCode32 ?equ ?LABEL_DESC_CODE32 - LABEL_GDT
SelectorVideo ? equ ?LABEL_DESC_VIDEO - LABEL_GDT
Selector5M ? ? ?equ ?LABEL_DESC_5M ? ?- LABEL_GDT
[SECTION .s16]
[BITS 16]
LABEL_BEGIN:
? mov ax, cs
? mov ds, ax
? mov es, ax
? mov ss, ax
? mov sp, 0100h
? xor eax, eax
? mov ax, ?cs
? shl eax, 4
? add eax, LABEL_SEG_CODE32
? mov word [LABEL_DESC_CODE32 + 2], ax
? shr eax, 16
? mov byte [LABEL_DESC_CODE32 + 4], al
? mov byte [LABEL_DESC_CODE32 + 7], ah
? xor eax, eax
? mov ax, ?ds
? shl eax, 4
? add eax, LABEL_GDT
? mov dword [GdtPtr + 2], eax
??
? lgdt [GdtPtr]
? cli
? in al, 92h
? or al, 00000010b
? out 92h, al
? mov eax, cr0
? or eax, 1
? mov cr0, eax
? jmp dword SelectorCode32: 0
[SECTION .s32]
[BITS 32]
LABEL_SEG_CODE32:
? mov ax, SelectorVideo
? mov gs, ax
? mov si, msg
? mov ax, Selector5M
? mov es, ax
? mov edi, 0
write_msg_to_5M:
? cmp byte[si], 0
? je ?prepare_to_show_char
? mov al, [si]
? mov [es:edi], al
? add edi, 1
? add si, 1
? jmp write_msg_to_5M
prepare_to_show_char:
? mov ebx,10
? mov ecx, 2
? mov si, ?0
??
showChar:
? mov edi, (80*11)
? add edi, ebx
? mov eax, edi
? mul ecx
? mov edi, eax
? mov ah, 0ch
? mov al, [es:si]
? cmp al, 0
? je ?end
? add ebx, 1
? add si, 1
? mov [gs:edi], ax
? jmp showChar
end:
? jmp $
msg:
? DB "This string is written to 5M memroy", 0
SegCode32Len equ $ - LABEL_SEG_CODE32
總結(jié)
以上是生活随笔為你收集整理的自制操作系统6:寻址5M-天高任鸟飞的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编程之美学习笔记--一摞烙饼的排序
- 下一篇: XP系统访问共享提示提示:找不到“”。请