从白纸到图灵机
计算机工作:取值执行
打开电源,计算机执行的第一句指令是什么?(PC=?)
0磁道0扇区:引导扇区
一个扇区:512个字节
引导扇区代码:bootsect.s
// 对上面汇编代码进行一行一行分析
// 先记住三个地址 BOOTSEC=0x07c0 INITSEC=0x9000 SETUPSEC=0x9020
// 从start开始
mov ax, #BOOTSEC //这时候的ax为0x07c0
mov ds, ax // ds为0x07c0 ds:数据段寄存器
mov ax, #INITSEG // ax为0x9000
mov es, ax // ex为0x9000 es:附加段寄存器
mov cx, #256 // cx为256
sub si, si // 相减 0 (ds:si = 07c0 << 4 + 0 = 0x07c00)
sub di, di // 相减 0 (es:di = 9000 << 4 + 0 = 0x90000)
rep movw // rep: 重复执行该语句直至寄存器cx为0 movw: 将DS:SI的内容送至ES:DI,是复制过去,原来的代码还在 (movw ! 移动1 个字;)。
jmpi go, INITSEG //间接跳转。这里INITSEG 指出跳转到的段地址。cs=0x9000 go为IP
go: mov ax, cs // cs=0x9000
mov ds, as
mov es, ax
mov ss, ax
mov sp, #0xff00
load_setup:
mov dx, #0x0000 // dh =0 dl =0
mov cx, #0x0002 // ch = 00 cl = 02
mov bx, #0x0200
mov ax, #0x0200 + SETUPLEN // ah=2 al=4 从第二个扇区读4个
int 0x13 // ppt已经详细讲解了 将setup读进来 地址为90200
...
ok_load_setup
// 我们把重点的解释一下
mov cx, #24 // 这里的24是字符的数量
mov bp, #msg1 // 这里的msg1的内容可以修改 修改的同时也要把24给改掉。