菜鸟求教,最简单的引导程序

「已注销」 2014-04-23 01:18:48

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跑,也没有问题。
新人菜鸟求教!!!
谢谢各位了。。
...全文
196 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
WWW1World 2015-08-11
  • 打赏
  • 举报
回复
这个程序是什么啊 为什么这个不能masm 为什么 没有伪指令什么的 求解答啊
WWW1World 2015-08-11
  • 打赏
  • 举报
回复
哥们 为什么这个不能masm 为什么
yuexicheng 2014-04-23
  • 打赏
  • 举报
回复
无论是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之后
zara 2014-04-23
  • 打赏
  • 举报
回复
应该是被加载到 0000:7C00,这个是最初的设定,不会改的,否则兼容性的问题就大了;主引导程序一般会将自己搬移到其它地方,然后将分区引导加载到这里。
第二个代码,nasm 生成后,将前面需要的部分复制写入到硬盘主引导扇区,启动是正常显示的吗?用的是 vpc2007 虚拟机。当然了,你上面的代码也有不妥,最后的 jmp$ 应该是在显示字符串之后,而不是在引导扇区的标记字的后面,否则生成的 bin 就是 514 字节而非标准扇区的 512 字节了。
「已注销」 2014-04-23
  • 打赏
  • 举报
回复
引用 5 楼 yuexicheng 的回复:
我是上的虚拟机virtualbox两种方式都可以显示,用工具将NASM编译生成的bin文件写入mbr的,然后启动虚拟机就可以显示了。楼主就像二楼说的一样看看org编译后的字符串偏移地址是不是BD 18 7c就是那句mov bp,msgstr 如果是的话应该不会出问题的
十分的感谢,总算弄清楚了,原来是虚拟机的问题,我前面用的是VMware虚拟机,使用org就不行,现在改用bochs就可以了,没有任何问题。
yuexicheng 2014-04-23
  • 打赏
  • 举报
回复
我是上的虚拟机virtualbox两种方式都可以显示,用工具将NASM编译生成的bin文件写入mbr的,然后启动虚拟机就可以显示了。楼主就像二楼说的一样看看org编译后的字符串偏移地址是不是BD 18 7c就是那句mov bp,msgstr 如果是的话应该不会出问题的
zara 2014-04-23
  • 打赏
  • 举报
回复
不应该啊,我是主机里 debug 载入生成bin文件,d 命令显示前面 3 行的内容,然后在虚拟机的纯 dos 下进 debug,先用代码读出MBR,然后 debug 的 e 命令照着主机窗口显示修改其前面的内容,然后再写入MBR,重启就显示了。楼主是怎么写入到主引导扇区的?下面是我前面的内容,看字符串地址是 7C18,确实是从 7c00 开始的:
8C C8 8E C0 BD 18 7C B9-0D 00 B6 0C B2 21 B7 00
B0 01 B3 0C B4 13 CD 10-77 65 6C 63 6F 6D 65 20
69 20 6F 73 21 00
「已注销」 2014-04-23
  • 打赏
  • 举报
回复
引用 1 楼 zara 的回复:
应该是被加载到 0000:7C00,这个是最初的设定,不会改的,否则兼容性的问题就大了;主引导程序一般会将自己搬移到其它地方,然后将分区引导加载到这里。 第二个代码,nasm 生成后,将前面需要的部分复制写入到硬盘主引导扇区,启动是正常显示的吗?用的是 vpc2007 虚拟机。当然了,你上面的代码也有不妥,最后的 jmp$ 应该是在显示字符串之后,而不是在引导扇区的标记字的后面,否则生成的 bin 就是 514 字节而非标准扇区的 512 字节了。
引用 2 楼 yuexicheng 的回复:
无论是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之后
感谢两位的回答,看了你们的解释,我理解了,我把代码修改了,但是,还是有问题,还是老问题,org 07c00h运行什么都没有问题,就是无法输出字符串,而jmp dword 0x07c0:go则没有问题,就像上面的图片一样的效果。这是怎么回事??

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧