免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1511 | 回复: 0
打印 上一主题 下一主题

《自己动手写操作系统》第三章的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-03 22:00 |只看该作者 |倒序浏览
%include "pm.inc"
org 07c00h
jmp LABEL_BEGIN
;GDT
[SECTION .gdt]
LABEL_GDTescriptor 0,0,0
LABEL_DESC_CODE32escriptor 0,SegCode32Len-1,DA_C+DA_32
LABEL_DESC_VIDEOescriptor 0B8000h,0ffffh,DA_DRW
LABEL_DESC_NORMAL: Descriptor    0,         0ffffh, DA_DRW    ; Normal 描述符
LABEL_DESC_CODE16: Descriptor    0,         0ffffh, DA_C      ; 非一致代码段, 16
LABEL_DESC_DATA:   Descriptor    0,      DataLen-1, DA_DRW    ; Data
LABEL_DESC_STACK:  Descriptor    0,     TopOfStack, DA_DRWA+DA_32; Stack, 32 位
LABEL_DESC_TEST:   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
SelectorNormal                equ        LABEL_DESC_NORMAL        - LABEL_GDT
SelectorCode16                equ        LABEL_DESC_CODE16        - LABEL_GDT
SelectorData                equ        LABEL_DESC_DATA                - LABEL_GDT
SelectorStack                equ        LABEL_DESC_STACK        - LABEL_GDT
SelectorTest                equ        LABEL_DESC_TEST                - LABEL_GDT
[SECTION .data1]         ; 数据段
ALIGN        32
[BITS        32]
LABEL_DATA:
SPValueInRealMode        dw        0
; 字符串
PMMessage:                db        "In Protect Mode now. ^-^", 0        ; 在保护模式中显示
OffsetPMMessage                equ        PMMessage - $$
StrTest:                db        "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0
OffsetStrTest                equ        StrTest - $$
DataLen                        equ        $ - LABEL_DATA
; END of [SECTION .data1]
; 全局堆栈段
[SECTION .gs]
ALIGN        32
[BITS        32]
LABEL_STACK:
        times 512 db 0

TopOfStack        equ        $ - LABEL_STACK - 1

; END of [SECTION .gs]
[SECTION .CODE16]
[BITS 16]
LABEL_BEGIN:
    mov        ax, cs
        mov        ds, ax
        mov        es, ax
        mov        ss, ax
        mov        sp, 0100h
       
                mov        [LABEL_GO_BACK_TO_REAL+3], ax
        mov        [SPValueInRealMode], sp
                ; 初始化数据段描述符
        xor        eax, eax
        mov        ax, ds
        shl        eax, 4
        add        eax, LABEL_DATA
        mov        word [LABEL_DESC_DATA + 2], ax
        shr        eax, 16
        mov        byte [LABEL_DESC_DATA + 4], al
        mov        byte [LABEL_DESC_DATA + 7], ah
                ; 初始化堆栈段描述符
        xor        eax, eax
        mov        ax, ds
        shl        eax, 4
        add        eax, LABEL_STACK
        mov        word [LABEL_DESC_STACK + 2], ax
        shr        eax, 16
        mov        byte [LABEL_DESC_STACK + 4], al
        mov        byte [LABEL_DESC_STACK + 7], ah
        ; 初始化 16 位代码段描述符
        mov        ax, cs
        movzx        eax, ax
        shl        eax, 4
        add        eax, LABEL_SEG_CODE16
        mov        word [LABEL_DESC_CODE16 + 2], ax
        shr        eax, 16
        mov        byte [LABEL_DESC_CODE16 + 4], al
        mov        byte [LABEL_DESC_CODE16 + 7], ah
;初始化CODE32
xor eax,eax
mov ax,cs
shl eax,4
add eax,LABEL_DESC_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
;加载GDTR做准备
xor eax,eax
mov ax,cs
shl eax,4
add eax,LABEL_GDT
mov dword [GdtPtr+2],eax
;加载GDT
lgdt [GdtPtr]
;关中断
cli
;开A20地址线
in al,92h
or al,00000010B
out 92h,al
;
mov eax,cr0
or eax,1
mov cr0,eax
jmp dword SelectorCode32:0
;<<<<<<<<<<
LABEL_REAL_ENTRY:                ; 从保护模式跳回到实模式就到了这里
        mov        ax, cs
        mov        ds, ax
        mov        es, ax
        mov        ss, ax

        mov        sp, [SPValueInRealMode]

        in        al, 92h                ; `.
        and        al, 11111101b        ;  | 关闭 A20 地址线
        out        92h, al                ; /

        sti                        ; 开中断

        mov        ax, 4c00h        ; `.
        int        21h                ; /  回到 DOS
; END of [SECTION .s16]
[SECTION .code32]
ALIGN 32
[BITS 32]
LABEL_DESC_SEG_CODE32:
        mov        ax, SelectorVideo
        mov        gs, ax                        ; 视频段选择子(目的)
        mov        ax, SelectorStack
        mov        ss, ax                        ; 堆栈段选择子
                mov        ax, SelectorData
        mov        ds, ax                        ; 数据段选择子
        ;mov        esp, TopOfStack
        mov        edi, (80 * 11 + 12) * 2        ; 屏幕第 11 行, 第 79 列。
        mov        ah, 0Ch                        ; 0000: 黑底    1100: 红字
        mov        al, 'P'
        mov        [gs:edi], ax
        call SelectorCode16x
jmp SelectorCode16:0
SegCode32Len equ $-LABEL_DESC_SEG_CODE32
; 16 位代码段. 由 32 位代码段跳入, 跳出后到实模式
[SECTION .s16code]
ALIGN        32
[BITS        16]
LABEL_SEG_CODE16:
        ; 跳回实模式:
        mov        ax, SelectorNormal
        mov        ds, ax
        mov        es, ax
        mov        fs, ax
        mov        gs, ax
        mov        ss, ax

        mov        eax, cr0
        and        al, 11111110b
        mov        cr0, eax

LABEL_GO_BACK_TO_REAL:
        jmp        0:LABEL_REAL_ENTRY        ; 段地址会在程序开始处被设置成正确的值

Code16Len        equ        $ - LABEL_SEG_CODE16

; END of [SECTION .s16code]
为什么运行时没有P打印呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP