自制操作系统6:寻址5M-天高任鸟飞
參考:
https://blog.csdn.net/tyler_download/article/details/52242599
DOS是實模式,20位總線,1M內存。體驗不好。寄存器也是16位的。90年代用dos編程,竟然也有WPS這樣的神作,真是佩服求伯君。
windows是保護模式,32位總線。4G內存,80386是經典,win95也是經典。
保護模式不再直接尋址,而是用GDT獲取描述符,描述符中再計算地址。
進入保護模式一個巨大好處是可以引入C語言。
本次實驗就是把數據寫入內存5M位置,然后在從這個位置讀取數據顯示出來,體現尋址5M的能力。
boot_read5M.asm
比上節GDT表中增加了LABEl_DESC_5M這樣一個段,基地址0500000h,也就是5M的位置。
selector_5M是這個段離表頭的偏移。
es指向selector_5M,也就是5M的基地址,es:edi循環寫入字符串msg。
然后顯示msg: [es:si]是5M基地址,到[gs:edi]顯存。
編譯:nasm -o boot.bat boot_read5M.asm
使用上幾節的OpSystem.java類,這個只寫了第一個引導扇區,其他扇區寫了個字符串,不影響,可直接使用這個工具做system.img
加載到virtualbox 運行成功:
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
總結
以上是生活随笔為你收集整理的自制操作系统6:寻址5M-天高任鸟飞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编程之美学习笔记--一摞烙饼的排序
- 下一篇: 李宏毅 线性代数 Introductio