标签:
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处开始执行,下面的代码
标签:
原文地址:http://www.cnblogs.com/haoboke/p/4222212.html