当前位置:  技术问答>linux和unix

自己动手写操作系统中的源码

    来源: 互联网  发布时间:2017-04-14

    本文导语:  %include "pm.inc" ; 常量, 宏, 以及一些说明 org 0100h jmp LABEL_BEGIN [SECTION .gdt] ; GDT ;                                         段基址,       段界限     , 属性 LABEL_DESC_NORMAL: Descriptor        0,    ...


%include "pm.inc" ; 常量, 宏, 以及一些说明

org 0100h
jmp LABEL_BEGIN

[SECTION .gdt]
; GDT
;                                         段基址,       段界限     , 属性
LABEL_DESC_NORMAL: Descriptor        0,            0ffffh, DA_DRW ; Normal 描述符
LABEL_DESC_CODE32: Descriptor        0,  SegCode32Len - 1, DA_C + DA_32 ; 非一致代码段, 32
LABEL_DESC_CODE16: Descriptor        0,            0ffffh, DA_C
; GDT 结束

GdtLen equ $ - LABEL_GDT ; GDT长度
GdtPtr dw GdtLen - 1 ; GDT界限
dd 0 ; GDT基地址

; GDT 选择子
SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT
SelectorCode16 equ LABEL_DESC_CODE16 - LABEL_GDT
; END of [SECTION .gdt]


[SECTION .s16]
[BITS 16]
LABEL_BEGIN:

; END of [SECTION .s16]


[SECTION .s32]; 32 位代码段. 由实模式跳入.
[BITS 32]

LABEL_SEG_CODE32:

; END of [SECTION .s32]


; 16 位代码段. 由 32 位代码段跳入, 跳出后到实模式
[SECTION .s16code]
ALIGN 32
[BITS 16]
LABEL_SEG_CODE16:
; 跳回实模式:

; END of [SECTION .s16code]


这里有两个16位的代码段和一个32位的数据段,我想知道这两个代码段有什么区别 ?写在一起没问题吧? 
还有就是定义段的时候[SECTION .s16code]这里的“.”后面的字符有实际意义吗? ALIGN是什么意思?
希望得到各为的耐心解答

|
16位代码段在实模式下运行,32的在保护模式下运行,其区别在于寻址方式不同,前者为段地址:偏移,后者段选择子:偏移
后两个问题没必要弄那么清楚,因为nasm并不常用

|
对于数据区32位和16位并没有太大意义

对于代码区,当处理器在保护模式时使用16位指令在指令前加入前缀,貌似是mov ax 前面是0x66,32位指令不加前缀

当处理器处于实模式时32位指令将加入前缀,16位指令不加前缀,例如mov eax前面加入0x66

因此在一个文件中完全可以,32位和16位的不同取决于CPU状态。

对于这一段:
; 16 位代码段. 由 32 位代码段跳入, 跳出后到实模式
[SECTION .s16code]
ALIGN    32
[BITS    16]
LABEL_SEG_CODE16:
    ; 跳回实模式:
 
; END of [SECTION .s16code]

可以看到虽然汇编器将其当作16位代码汇编,但是ALIGN强制要求汇编器使用32位对齐,这是x86下16、32位混合编程的特色。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。














站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,