当前位置: 技术问答>linux和unix
看书的问题,请帮忙!
来源: 互联网 发布时间:2015-12-28
本文导语: 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, 01301...
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 ; 结束标志
上面的代码是《自己动手写操作系统》一书上的,请问第一句中为什么是07c00h,我试着修改成别的数字,运行结果不对,为什么?
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 ; 结束标志
上面的代码是《自己动手写操作系统》一书上的,请问第一句中为什么是07c00h,我试着修改成别的数字,运行结果不对,为什么?
|
好像是计算机体系结构规定的,CMOS程序会自己到07C00H地址处加载引导程序,所以就必须是07C00H,换成其他的,系统都不能成功引导。
|
不用资料,你可以用书上介绍的bochs来调试。按照书上讲的方法写好.bat文件之后,运行.bat文件,进入调试界面,敲入命令"b 0:0x7c00"回车,再敲入"s"回车,表示单步运行,你就可以看到你的程序(用disassemble还可以看到你写的代码的对应代码)是从这里开始运行的了,所以就可以知道实际上BIOS是将我们的引导代码拷贝到这里然后开始运行的。