首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

os question解决办法

2012-03-24 
os questionpmtest1.asm编译方式:nasmpmtest1.asm-opmtest1.com%includepm.inc 常量、宏,以及一些说明

os question
;   pmtest1.asm
                        ;   编译方式:nasm   pmtest1.asm   -o   pmtest1.com
                        %include       "pm.inc "     ;     常量、宏,以及一些说明
                        org   0100h
                                jmp   LABEL_BEGIN
                        [SECTION   .gdt]
                        ;   GDT
                        LABEL_GDT:                     Descriptor   0,   0,   0             ;   空描述符
                        LABEL_DESC_CODE32:     Descriptor   0,   SegCode32Len-1,   DA_C   +   DA_32   ;  
                        代码段,32位
                        LABEL_DESC_VIDEO:       Descriptor   0B800h,   0ffffh,   DA_DRW   ;   显存首地址
                        ;   GDT   结束
                        GdtLen         equ   $   -   LABEL_GDT       ;   GDT长度
                        GdtPtr         dw     GdtLen   -1               ;   GDT界限
                                            dd     0
                        ;   GDT   选择子
                        SelectorCode32             equ   LABEL_DESC_CODE32   -   LABEL_GDT
                        SelectorVideo               equ   LABEL_DESC_VIDEO     -   LABEL_GDT
                        ;   END   OF   [SECTION   .gdt]
                        [SECTION   .s16]
                        [BITS   16]
                        LABEL_BEGIN:
                              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,   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
                             
                              ;   为加载gdtr做准备
                              xor   eax,   eax
                              mov   ax,   ds
                              shl   eax,   4
                              add   eax,   LABEL_GDT                                         ;   eax   <-   gdt   基地址
                              mov   dword   [GdtPtr+2],   eax                           ;   [GdtPtr+2]   <-   gdt   基地址
                              ;   加载gdtr
                              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                             ;   执行这一句会把SelectorCode32
                                                                                                              ;  
                        装入cs,并跳转到SelectorCode32:0   处
                        [SECTION     .s32]   ;   32位代码段,由实模式跳入
                        [BITS     32]
                        LABEL_SEG_CODE32:
                              mov   ax,   SelectorVideo
                              mov   gs,   ax                                                             ;   视频段选择子(目的)
                             
                              mov   edi,   (80   *   10   +   0)   *   2                             ;   屏幕第10行,第0行
                              mov   ah,   0Ch                                                           ;   0000:黑底     1100:红字
                              mov   al,   'P '              
                              mov   [gs:edi],   ax


                             
                              ;   到此停止
                              jmp   $  
                        SegCode32Len                       equ   $-LABEL_SEG_CODE32
                        ;   END   OF   [SECTION   .s32]

    摘自仓库:        
    mov   ax,   cs
                              mov   ds,   ax
                              mov   es,   ax
                              mov   ss,   ax
                              mov   sp,   0100h
                        不明白其意,为何要把其他寄存器的值都指向CS?
请详解,另外不明白的是为什么要             mov   sp,   0100h
在该示例中没有call之类的指令,没有用到堆栈,为什么要多出这个指令,
机子加电以后堆栈如何分布?这个0100h从何而来??

谢谢


[解决办法]
汇编技术应用群,群号:33756710。欢迎加入技术讨论。
[解决办法]
C版斑竹?

你当然可以不都指向cs,这是一个simple eg
[解决办法]
C編譯器, 如果是flat binary的話, 默認程序段和資料段的起始點是一樣

热点排行