您的位置:首页 > 运维架构 > Linux

linux

2016-07-25 17:29 411 查看
.globl begtext,begdata,begbss,endtext,enddata,endbss!定义了6个全局标识符
.text !文本段
begtext:
.data!数据段
begdata:
.bss!末初始化数据段(Block Started by Symbol)
begbss:
.text!文本段
SETUPLEN = 4 setup ! 程序的扇区数(setup-sectors)值;
BOOTSEG = 0x07c0 bootsect ! 的原始地址 (是段地址,以下同);
INITSEG = 0x90000 将boot !移到这里 -- 避开;
SETUPSEG = 0x9020 setup!程序从这里开始;
SYSSEG = 0x1000 !system ! 模块加载到 0x10000(64kB)处。
ENDSEG = SYSSEG + SYSSIZE ! 停止加载的段地址;
!根文件系统设备使用与引导时同样的软驱设备;
!根文件系统设备在第一个硬盘的第一个分区上,等等;ROOT_DEV = 0x306!
! 指定根文件系统设备是第2个硬盘的第一个分区。这是Linux 老式硬盘命名 entry start !
! 告知连接程序从start 标号开始执行。

start:!17-26 行的作用是将自身(bootsect)从目前段位置0x07c0(31k)
!移动到0x9000(576k)处,共256字(512字节),然后跳转到
!移动代码后的go 标号处,也即本程序的下一语句处。
mov ax,#BOOTSEG! 将ds 段寄存器位置置为0x7C0;
mov ds,ax
mov ax,#INITSEG! 将es段寄存器置为0x9000;
mov es,ax
mov cx,#256 ! 移动计数值 =256 字;
sub si,si! 源地址 ds:si=0x07C00:0x0000
sub di,di! 目的地址:es:di = 0x90000:0x0000
rep ! 重复执行,直到 cx=0x0000
movw ! 移动1个字;
jmpi go,INISEG!间接跳转。这里INITSEG 指出跳转到的段地址。
!从下面开始, CPU 执行已移动到 0x90000 段处的代码。
go:mov ax,cs!将ds、es和ss都置成移动后代码所在的段处(0x9000)。


本文出自 “专注php” 博客,请务必保留此出处http://jingshanls.blog.51cto.com/3357095/1829743
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: