x86 从实模式到保护模式 学习笔记(1)


第五章 编写主引导扇区代码

本章介绍了一个简短的主引导扇区代码,其主要功能是在屏幕上显示“label offset”,并显示一个标号的物理地址。

如何在屏幕上显示

在主引导扇区阶段, 0xB8000-0xBFFFF这段物理地址对应的内存是留给显卡的,每屏2000个字符,按顺序存放在这段空间里。所以我们想要在屏幕上输出,就要改写这段内存。

    mov ax,0xb800                 ;指向文本模式的显示缓冲区
    mov es,ax                     ;以下显示字符串"Label offset:"
    mov byte [es:0x00],'L'
    mov byte [es:0x01],0x07

这段代码主要用于改写0xB8000位置的第一个字符表示区域,先把0xb800放入寄存器es中,然后以es作为基地址载入L的ASC码,最后输入8bit颜色信息。总共使用16bit显示一个字符。

将标号地址输出到屏幕上

下一步想要保存一个标号的物理地址,首先我们获得这个标号的地址:

    mov ax,number                 ;取得标号number的偏移地址
    mov bx,10

然后分别求每一位的地址:

    ;设置数据段的基地址
    mov cx,cs
    mov ds,cx

    ;求个位上的数字
    mov dx,0
    div bx
    mov [0x7c00+number+0x00],dl   ;保存个位上的数字

需要注意的是,在做16位除法时,被除数的高8位需要保存在寄存器dx中,低8位需要保存在ax中,做完除法后,商保存在ax中,余数保存在dx中。
接下来,我们把存好的十进制数输出到显示屏上:

    ;以下用十进制显示标号的偏移地址
    mov al,[0x7c00+number+0x04]
    add al,0x30
    mov [es:0x1a],al
    mov byte [es:0x1b],0x04

最后,使程序进入无限循环,并且补充主引导扇区到512字节,并补充结尾标志:0x55AA

    infi: jmp near infi                 ;无限循环
      
    number db 0,0,0,0,0
  
    times 203 db 0
              db 0x55,0xaa

本章的代码解读就到这里,后面有一些调试相关的内容,不在此赘述

一个小问题

代码中设置了数据段基地址,但是却没有用到,这是因为什么?跟全局描述符表有关系么?

第六章 相同的功能,不同的代码

本章主要介绍了显示上一章讲述内容的不同实现方法

打印label offset

    jmp near start
     
mytext db 'L',0x07,'a',0x07,'b',0x07,'e',0x07,'l',0x07,' ',0x07,'o',0x07,\
        'f',0x07,'f',0x07,'s',0x07,'e',0x07,'t',0x07,':',0x07
number db 0,0,0,0, 0

start:
     mov ax,0x7c0                  ;设置数据段基地址 
     mov ds,ax
     
     mov ax,0xb800                 ;设置附加段基地址 
     mov es,ax
     
     cld
     mov si,mytext                 
     mov di,0
     mov cx,(number-mytext)/2      ;实际上等于 13
     rep movsw

本章节使用的方法是把要打印的内容直接存在内存当中,然后把数据段直接搬运到显示数据段。
内容较好理解,需要注意的是movsw可以从[ds:si]把数据搬运到[es:di]中去,cld则是方向标志位清零指令,代表由低地址向高地址的方向传送数据,若方向标志位为1,则相反。同时rep movsw则表示“repeat”执行movsw,直到CX寄存器为0。每次执行movsw,CX寄存器自动减一。

把标号地址存储为十进制

    ;得到标号所代表的偏移地址
    mov ax,number
    
    ;计算各个数位
    mov bx,ax
    mov cx,5                      ;循环次数 
    mov si,10                     ;除数 
digit: 
    xor dx,dx
    div si
    mov [bx],dl                   ;保存数位
    inc bx 
    loop digit

本章使用了循环来把标号地址转换为十进制。代码也十分简单,不赘述。
小tips:把number地址保存到ax中时,number地址存在哪里呢?需要占用内存空间么?事实上,mov ax, number这条指令翻译成机器码后,number的地址是直接写入到这条指令中的,事实上这条指令是一条载入立即数的指令,而不是一眼看上去的寄存器之间的指令。

把标号地址输出到显示器并无限循环

    ;显示各个数位
    mov bx,number 
    mov si,4                      
show:
    mov al,[bx+si]
    add al,0x30
    mov ah,0x04
    mov [es:di],ax
    add di,2
    dec si
    jns show
    
    mov word [es:di],0x0744

    jmp near $

同样的,运用循环的方法把数据搬运到显示区域,那么为什么不仍然使用movsw指令把它们传输过去呢?由于我们的高地址位存放的是十进制中的高位,而去显示的时候则需要地址位存放十进制的高位,所以无论是正向还是反向传输数据都不能满足我们的需求,这时候就需要我们自己来实现这个功能了。

代码中出现了[bx+si]基址+变址的寻址方式,支持这种寻址方式的挚友一下四种:

[bx+si]
[bx+di]
[bp+si]
[bp+di]

其他的方式都不支持。最后,我们通过jns show这条指令来保证循环的正确执行。jns这条指令在符号标志位(SF)为0时跳转,为1时不跳转。而dec指令会改变符号标志位,所以在si减为0后再次执行时,si减为0xffff,改变了符号标志位,结束了循环。

最后,输出了字符D并开始无限循环。

最终的结束区域使用$符号计算出需要填写0的数量,并写入,然后写入结束标志0x55AA

times 510-($-$$) db 0
                 db 0x55,0xaa
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容