Linux内核注释-1/boot/bootsect.s



Linux内核注释-1/boot/bootsect.s
 
该代码来自linux0.11内核代码/boot/bootsect.s
这段代码使用asm汇编格式启动代码,之所以不使用AT&T,原因是当时的AT&T汇编不支持16位模式.
 www.2cto.com  
汇编知识:
串操作指令:
串操作指令的操作数是主存中连续存放的数据串(String)——即在连续的主存区域中,字节或字的序列
串操作指令的操作对象是以字(W)为单位的字串,或是以字节(B)为单位的字节串
 
串寻址方式:
源操作数用寄存器SI寻址,默认在数据段DS中,但允许段超越:DS:[SI]
目的操作数用寄存器DI寻址,默认在附加段ES中,不允许段超越:ES:[DI]
每执行一次串操作指令,SI和DI将自动增(减)
 
串传送指令MOVW,MOVB
把字节(B)或字(W)操作数从主存的源地址传送至目的地址
 
REP重复前缀指令
REP :每执行一次串指令,CX减1,直到CX=0,重复执行结束
 
 1 BOOTSEG = 0x07c0
 2 INITSEG = 0x9000
 3 ... ....
 4 entry start
 5    start:
 6          mov ax , #BOOTSEG
 7          mov ds , ax                 !ds = 0x07c0
 8          mov ax , #INITSEG
 9          mov es , ax                 !es = 0x9000
10          mov cx , #256            !cx = 256 用于循环计数
11          sub si , si                    !si = si - si 意味着si = 0 
12                                           !ds:si = 0x07c0:0x0000 = 0x7c00
13          sub di , di                   !di = di - di 意味着di = 0
14                                  !ds:si = 0x9000:0x0000 = 0x90000
15          rep                  !开始循环操作 直到 cx = 0
16          movw              !每次移动1个字,执行256次,实现:
17                                 !0x7c00开始的256个字(word)即512字节的数据到0x9000处
18                                !即将bootsect.s移到0x9000处
19          jmpi go , INITSEG     !跳转到0x90000处开始执行,下面的代码       
 

相关内容

    暂无相关文章