MOVW 指令
MOVW:将DS:SI的内容送至ES:DI,是复制过去,原来的代码还在。很多书用了“移”这个字,实际上是复制过去。每次复制.DS:SI ,ES:DI自动加1
Linux内核中引导部分一开始有这样一段代码:
45 entry start ! 告知连接程序,程序从start 标号开始执行。
46 start:
47 mov ax,#BOOTSEG ! 将ds 段寄存器置为0x7C0;
48 mov ds,ax
49 mov ax,#INITSEG ! 将es 段寄存器置为0x9000;
50 mov es,ax
51 mov cx,#256 ! 移动计数值=256 字;
52 sub si,si ! 源地址 ds:si = 0x07C0:0x0000
53 sub di,di ! 目的地址 es:di = 0x9000:0x0000
54 rep ! 重复执行,直到cx = 0
55 movw ! 移动1 个字;
56 jmpi go,INITSEG ! 间接跳转。这里INITSEG 指出跳转到的段地址。
57 go: mov ax,cs ! 将ds、es 和ss 都置成移动后代码所在的段处(0x9000)。
! 47--56 行作用是将自身(bootsect)从目前段位置0x07c0(31k)
! 移动到0x9000(576k)处,共256 字(512 字节),然后跳转到
! 移动后代码的go 标号处,也即本程序的下一语句处。
注意,在55行执行完毕之后,0x7c00之后的512字节应当与0x9000之后的512字节一模一样。
然后看56行,这里的go是段内偏移,也就是0x39(十进制的57),而INITSEG=0x9000,所以执行这条语句是跳到0x9000:0x39也就是复制过去的第57行,这样代码就相当于在一个程序里继续执行了。
----------------------------------------------------
REP指令
每次执行rep指令,CX减1,然后判断CX是否等于0,如果不为0则继续执行rep指令后的串操作指令,直到CX为0,实现重复。
----------------------------------------------------
Jmpi指令
段间跳转,其Opcode为Eah,其格式为:jmpi Offset,
Segment Selector