- 论坛徽章:
- 0
|
在linux的启动部分有这样一段代码
SETUPSEG = 0x9020 setup 程序从这里开始;
SYSSEG = 0x1000 system 模块加载到0x10000(64 kB)处;
ENDSEG = SYSSEG + SYSSIZE
mov ax,#BOOTSEG 将ds 段寄存器置为0x7C0;
mov ds,ax
mov ax,#INITSEG 将es 段寄存器置为0x9000;
mov es,ax
mov cx,#256 移动计数值=256 字;
sub si,si 源地址 ds:si = 0x07C0:0x0000
sub di,di 目的地址 es:di = 0x9000:0x0000
rep 重复执行,直到cx = 0
movw 移动1 个字;
jmpi go,INITSEG 间接跳转。这里INITSEG 指出跳转到的段地址。
go: mov ax,cs 将ds、es 和ss 都置成移动后代码所在的段处(0x9000)。
mov ds,ax 由于程序中有堆栈操作(push,pop,call),因此必须设置堆栈。
mov es,ax
mov ss,ax
mov sp,#0xFF00
其中的sub si,si和sub di,di是做什么用的,这个指令在我看来不就是对si和di寄存器进行清零操作的吗。那和后边的注释有什么联系呢,请各位高手给予指点,在下在这里先谢谢了!! |
|