陈贱伟 发表于 2013-8-29 12:13:01

一个操作系统实现 谁能帮我把代码缩短

%macro Descriptor 3
dw %2 & 0FFFFh ; 段界限1
dw %1 & 0FFFFh ; 段基址1
db (%1 >> 16) & 0FFh ; 段基址2
dw ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh) ; 属性1 + 段界限2 + 属性2
db (%1 >> 24) & 0FFh ; 段基址3
%endmacro ; 共 8 字节

org 07c00h
jmp c16

;GDT 段基址 段界限 属性
NULL: Descriptor 0, 0, 0 ;空描述符
code: Descriptor 0, Len-1, 98h+4000h;4000h为32位段 98h可执行代码
LDE: Descriptor 0b8000h,0ffffh,92h ;92读写 显存
;GDT结束
GdtLen equ $-NULL ;GDT长度
GdtSize dw GdtLen-1;GDT界限
DD 0 ;GDT基地址
;GDT选择
SetCode32 equ code-NULL ;代码
SetGs equ LDE -NULL ;显存



c16:
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0100h
;初始化32位代码段
xor eax,eax
mov ax,cs
shl eax,4
add eax,code32
mov word ,ax
shr eax,16
mov byte ,al
mov byte ,ah
;加载GDTR做准备
xor eax,eax
mov ax,ds
shl eax,4
add eax,NULL
mov dword ,eax
;加载GDTR
lgdt
;关中断
cli
;打开地址A20
in al,92h
or al,00000010b
out 92h,al
;准备切换到保护模式
mov eax,cr0
or eax,1
mov cr0,eax
;真正进入保护模式
jmp dword SetCode32:0



code32:
mov ax,SetGs
mov gs,ax


jmp $
Len equ $-code32
实模式 跳到保护模式 代码太长了    不容易理解谁能帮我把一些没用代码去掉

小名明SIU 发表于 2013-9-1 12:09:25

这个几乎没法缩短,要不把打开A20的代码去掉,反正现在已经默认打开了

怡静 发表于 2013-9-7 10:39:57

小名明SIU 发表于 2013-9-1 12:09 static/image/common/back.gif
这个几乎没法缩短,要不把打开A20的代码去掉,反正现在已经默认打开了

不错,谢谢鱼友。

玉宁417 发表于 2013-9-26 09:09:44


学习,支持一下!加油:loveliness:

那e丶默默 发表于 2013-9-26 22:18:00



学习,支持一下!   我才初学
页: [1]
查看完整版本: 一个操作系统实现 谁能帮我把代码缩短