Linux内核注释

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

该代码来自linux0.11内核代码/boot/bootsect.s

这段代码使用asm汇编格式启动代码,之所以不使用AT&T,原因是当时的AT&T汇编不支持16位模式.

 www.ahlinux.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处开始执行,下面的代码       

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。