刚开始学习《自己动手写操作系统》一书,有一处不明,求高手指点
书中boot.asm代码如下:
org 07c00h ; 告诉编译器程序加载到7c00处
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ; 调用显示字符串例程
jmp $ ; 无限循环
DispStr:
mov ax, BootMessage
mov bp, ax ; ES:BP = 串地址
mov cx, 16 ; CX = 串长度
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
mov dl, 0
int 10h ; 10h 号中断
ret
BootMessage: db "Hello, OS world!"
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
虽然在功能和原理上已经了解,但是对于开头2-4行的内容,总觉得有些迷惑
mov ax, cs
mov ds, ax
mov es, ax
此段代码用cs初始化ds、es
编译结果反汇编后可以看到,在实际需要用到ES:BP的int 10h中断时,
mov ax, BootMessage
mov bp, ax ; ES:BP = 串地址
反汇编代码如下
00007C0B B81E7C mov ax,0x7c1e
00007C0E 89C5 mov bp,ax
可以看到,bp的值被汇编为BootMessage的实际地址,那么意味着为了使程序正确运行,es必须为0,所以我很疑惑,为何不使用
xor ax, ax
mov ds, ax
mov es, ax
仅仅是因为cs在主机上电加载引导程序时必定为0么?
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!