要想看懂下面的代码需要读哪些书?

原创 2006年06月24日 22:23:00

以下是一段由实模式转变到保护模式的代码,请问要看懂它需要学哪些书?

; ==========================================
; pm.inc;

; ==========================================

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

%macro Gate 4
 dw (%2 & 0FFFFh)    ; 偏移 1    (2 字节)
 dw %1     ; 选择子    (2 字节)
 dw (%3 & 1Fh) | ((%4 << 8) & 0FF00h) ; 属性     (2 字节)
 dw ((%2 >> 16) & 0FFFFh)   ; 偏移 2    (2 字节)
%endmacro ; 共 8 字节

; ==========================================
; 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  0B8000h,           0ffffh, DA_DRW  ; 显存首地址
; GDT 结束

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

; 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, 并跳转到 Code32Selector:0  处
; END of [SECTION .s16]


[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]

 

相关文章推荐

要想看懂 spring 的配置文件:ApplicationContext.xml 第一步

要想看懂 spring 的配置文件:ApplicationContext.xml 就得先从简单的来,一步一步的看才会理解的清楚明白。 首先得知道什么叫ioc---依赖注入,注入的方式一般有2个;设值注...

我想看的是美胸和大长腿,你却给我直播写代码?

除了美胸大长腿,程序员也开直播了! 国外有一个专门直播写代码的网站:https://www.livecoding.tv,打开网页,你会看到很多窗口,点进去就可以围观别人写代码了。 ...

【abap】SE24维护类、接口interface(如何看懂CO03事务码对应的abap代码)

我们今天查看的interface名字是:IF_COIS_DISP_LIST 因为今天的主角是上面这个方法SET_TABLE_FOR_FIRST_DISPLAY 这个名字我们很熟悉,这是abap编程...

容易看懂的才是好代码

整理贴(不同的问题用不同的语句主要目的提高程序的可读性以循环为例)(c语言中) 作为一个初学渣 这里纯粹记录贴(捂脸哭): 循环学了好久也用了好久   用习惯了一种循环语句之后就不会用别的写东西(...

初学者都能看懂的IOS股票K线图代码,用 CoreGraphics 框架

因为是刚转IOS不久,缺乏IOS的项目经验,所以在很多面试中都应聘不到好岗位,不料同学的一个公司招人,但需要做出某种功能,于是乎我迷上了画股票K线图,没想到两三天时间就搞定了,顺利拿下了offer,当...
  • dangfm
  • dangfm
  • 2014年02月14日 13:26
  • 5836

用了一年时间才大致把导师的 java 代码 看懂

导师编写的 java 代码,用到了 最新的 java8 的不少知识,例如 lambda 表达式与 function 类, stream 类, 使用 hashmap 存储动态规划的状态矩阵,的确比 ma...

测试 代码的一些体会!说实话,前半部分能看懂,因为深有感触

测试的一些体会 在写完一个类之后,做一下测试是在所难免的。这个文想讨论一下以往个人采用的一些做测试的方法,并从他们的优劣之处加以比较。只是需要注意的是,这里的测试和调试的含义并不相同。测试...

几行代码看懂android View的事件传递机制(视图逻辑)

安卓的视图事件传递机制。

如何看懂Java混淆后的反编译代码

如何看懂Java混淆后的反编译代码 分类: JAVA相关 如何看懂Java混淆后的反编译代码 作者:dozb 一般情况下Java应用的开发者为了保护代码不被别人抄袭,在生成clas...
  • xpp1993
  • xpp1993
  • 2013年01月24日 13:20
  • 4059
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:要想看懂下面的代码需要读哪些书?
举报原因:
原因补充:

(最多只允许输入30个字)