首页
社区
课程
招聘
boot引导程序,初始化段寄存器的疑问,求高手指点
发表于: 2011-4-5 23:57 3854

boot引导程序,初始化段寄存器的疑问,求高手指点

2011-4-5 23:57
3854
刚开始学习《自己动手写操作系统》一书,有一处不明,求高手指点

书中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么?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
为啥说es必须为0,2-4行只保证了cs,ds,es在同一段而已
2011-4-6 10:46
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
int 10hd的13h号功能输入参数就是要ES:BP指向字符串啊!且字符串定义在代码段中,当然需要es=cs了
2011-4-6 11:30
0
雪    币: 192
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
ES:BP指向代码段这一点我是知道的

但是实际分析汇编出来的代码,字符串地址被直接汇编成了以0为段基址的偏移,也就是实际物理地址

那么这种情况下其实就是要求必须 ES = CS = 0 才能正常运行不是么?
2011-4-11 12:49
0
雪    币: 192
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
算了,没人回答,结贴
2011-4-13 11:08
0
游客
登录 | 注册 方可回帖
返回
//