当前位置: 代码迷 >> 汇编语言 >> 初学者求教,最简单的引导程序
  详细解决方案

初学者求教,最简单的引导程序

热度:120   发布时间:2016-05-02 04:37:10.0
菜鸟求教,最简单的引导程序
本帖最后由 xu19951930 于 2014-04-23 01:25:45 编辑

jmp dword 0x07c0:go ;第一种
go:

org 07c00h ;第二种

mov ax,cs
mov es,ax
mov bp,msgstr
mov cx,13
mov dh,12
mov dl,33
mov bh,0
mov al,1
mov bl,0ch
mov ah,13h
int 10h
msgstr: db "welcome i os!"
times 510-($-$$) db 0
dw 55aah
jmp $

上面这段代码,我用第一种用jmp直接跳转到内存0x07c00地址中,程序没有问题,问题是我用org 0x07c00 上面这段代码别的都没有问题,就是输出不了文字
输出结果如下图:

还有一点,还有一点就是,引导程序的在内存中的地址,是0x07c00还是0x07c0,我在网上看到两种结果,是在搞不清,我上面用0x07c0跑,也没有问题。
新人菜鸟求教!!!
谢谢各位了。。
------解决方案--------------------
应该是被加载到 0000:7C00,这个是最初的设定,不会改的,否则兼容性的问题就大了;主引导程序一般会将自己搬移到其它地方,然后将分区引导加载到这里。
第二个代码,nasm 生成后,将前面需要的部分复制写入到硬盘主引导扇区,启动是正常显示的吗?用的是 vpc2007 虚拟机。当然了,你上面的代码也有不妥,最后的 jmp$ 应该是在显示字符串之后,而不是在引导扇区的标记字的后面,否则生成的 bin 就是 514 字节而非标准扇区的 512 字节了。
------解决方案--------------------
无论是jmp还是org两种方式都是对的,jmp dword  0x07c0:go 将cs变为cs=07c0 ip=offset go 按照实模式寻址方式你的程序同样位于内存物理地址07c0*10h+0=7c00的地方,第二种方式 org 7c00h是让编译器在编译的时候对偏移地址的处理从7c00h开始,由于你的代码是放在主引导扇区的所以电脑会直接将它加载到0000:7c00h的地方也就是内存物理地址07c00h,这和jmp的效果是一样的,只是jmp的段寄存器cs=07c0,org的 cs=0000 但是它们都指向同一个物理地址,最重要的一点你这是主引导扇区代码最后两个字节你搞反了是dw 0aa55h 你定义为dw 55aah 就成了高地址存放55 低地址存放aa了,这样的主引导扇区是无效的 还有就是二楼说的jmp $ 应该放在int 10h之后
  相关解决方案