bootsect.s汇编代码阅读笔记------
#代码段
47 mov
ax,#BOOTSEG
48 mov
ds,ax
49 mov
ax,#INITSEG
!(0x9000)
50 mov
es,ax
51 mov
cx,#256
52 sub
si,si
!si=0,源地址
ds:si=0x07c0:0x0000
53 sub
di,di
!di=0, 目的地址
es:si=0x9000:0x0000
54 rep
!
55 movw
!
56 jmpi
go,INITSEG
!
#代码段
解释:第52行,执行后si=0;之所以这样,估计是这样置0比mov等指令更快。
第47-55,SI为源变址寄存器,DI为目的变址寄存器,在串处理指令中,
SI和DI作为隐含的源变址和目的变址寄存器,此时SI和DS联用,DI和附加段寄存器ES联用
,分别达到在数据段和附加段中寻址的目的。(摘自IBM-PC汇编语言程序设计 第2版 P21)。
由此可以看出为什么可以实现第54行的循环移动操作,而rep指令在地址长度为16位时,用CX寄存器作为计数,直到CX中的值(上面为256)为0。
第56行,jmpi(jump intersegment) 是段间跳转指令
jmpi的格式是: jmpi 段内偏移,段选择子
使得 CS=INITSEG,IP=go,也即程序跳转到0x9000:go地址继续执行。
#代码段
#代码段
解释:第52行,执行后si=0;之所以这样,估计是这样置0比mov等指令更快。
由此可以看出为什么可以实现第54行的循环移动操作,而rep指令在地址长度为16位时,用CX寄存器作为计数,直到CX中的值(上面为256)为0。
使得 CS=INITSEG,IP=go,也即程序跳转到0x9000:go地址继续执行。