




25
org 07c00h
mov ax, cs
mov ds, ax
mov es, ax
call DispStr
jmp $
DispStr:
mov ax, BootMessage
mov bp, ax
mov cx, 16
mov ax, 01301h
mov bx, 000ch
mov dl, 0
int 10h
ret
BootMessage: db “Hello, OS world!”
times 510-($-$$) db 0
dw 0xaa55
这个代码段是存于磁盘引导扇区的系统引导(自举)程序。若存于硬盘第一个扇区,则这段代码称为:硬盘主引导记录;若存于硬盘某个分区的第一个扇区,则称为:分区引导记录;若存于软盘的第一个扇区,则称为:软盘引导记录。称为磁盘引导记录的重要标志是:
dw 0xaa55
磁盘的一个扇区是512字节,标志0xaa55存于这个扇区的最后一个字(两字节,偏移地址为:1FEH),其余空间用于存储指令代码和一些参数、提示信息等。磁盘引导记录由ROM BIOS的INT 19H(引导加载程序,相当于热启动系统,对应的快捷键为:Ctrl+Alt+Del),固定装入内存的0000:7C00H,然后将控制权交给磁盘引导程序,相当于开始执行下面的程序段。下面详细解答一下这个程序段的功能:
org 07c00h ;调整偏移量伪指令ORG,指定下面的指令从7c00h处开始,因为BIOS一旦发现引导扇区,就会将这512字节装载到内存0000:7c00处
mov ax, cs ;数据传送指令,将代码段寄存器cs的内容赋给通用寄存器ax
mov ds, ax ;ax→ds,使数据段与代码段在同一个段
mov es, ax ;ax→es,使附加段与代码段在同一个段
call DispStr ;调用子程序DispStr,显示字符串信息:Hello, OS world!
jmp $ ;$表示当前地址,实现死循环
DispStr: ;子程序:显示字符串
mov ax, BootMessage ;BootMessage的首地址给ax
mov bp, ax ;BootMessage首地址给堆栈指针BP
mov cx, 16 ;要显示的字符数
mov ax, 01301h ;AH=13h,int 10h,即视频中断13h号功能:写字符串;AL=01H,表示写完字符串后,更新光标位置
mov bx, 000ch ;BH=0,页号(视频缓冲区是分页的),初学者暂时不必理会;BL=0CH,字符显示属性,以黑底亮红显示字符
mov dl, 0 ;DH、DL=写串的光标位置,DH=行号,DL=列号
int 10h ;调用视频中断
ret ;子程序返回指令,返回调用者
BootMessage: db “Hello, OS world!” ;要显示的字符串信息
times 510-($-$$) db 0 ;$是当前地址,$$是首地址,总体意思就是从此处一直到510都用0填充
dw 0xaa55 ;磁盘引导记录重要标志 ,最后2个字节代表这是引导扇区。
本文永久链接地址:http://www.ourys.com/post/simple-boot-img.html
原创文章如转载,请注明:转载自IT元素 [ http://www.ourys.com ]
中文转码 乱码 二叉树 元标记 兼容 域名 层次遍历 数据库 模板类 正则表达式 爬虫 百度 软软的 链表 队列 Access Ajax Asp Asp.Net CSS Eclipse feedsky Google IIS IIS7 JAVA JavaScript jQuery JTBC linux Lucene MyEclipse Mysql Oracle Reseller Hosting SEO SQL SQL Server TinyMce Ubuntu Ubuntu9.04 Ubuntu9.10 Ubuntu10.04 Win7 WordPress Plugin
WP Cumulus Flash tag cloud by Roy Tanck and Luke Morton requires Flash Player 9 or better.
汇编啊,我学得一团糟,看到这些代码就有点头大哦
[回复]
#1