软盘引导程序 入口点的问题a

e0a0 2014-04-11 06:21:52
这是 软盘 引导操作系统的安装和 引导程序的部分代码 , start 开始的代码 有几个问题 求解答

start:

push cs
pop es
mov bx,offset copy_start
mov al,1
mov ah,3
mov cl,1
mov ch,0
mov dl,0
mov dh,0
int 13h ; 把 copy_start标号代码 写入1扇区

mov bx,0
mov al,2
mov ah,3
mov cl,2
mov ch,0
mov dl,0
mov dh,0
int 13h ; <-- 这段 写入 作什么的 书上说 大于512k 要写其他扇区 怎么算 写入哪个扇区 , 怎么写

copy_start:

mov ax,07c00h
mov es,ax
mov bx,0 ; <--这里 好像错了吧 地址是 0:07c00h 这里写成了 7c00h:0

mov al,2
mov ah,2
mov cl,2
mov ch,0
mov dl,0
mov dh,0
int 13h

mov ax,07c00h
push ax
mov ax,0
push ax
retf ; <-- 上面5行 什么意思 干嘛要 retf[/color]
copy_end:nop

code ends
end start


...全文
152 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuexicheng 2014-04-15
  • 打赏
  • 举报
回复
引用 4 楼 u013776377 的回复:
[quote=引用 3 楼 yuexicheng 的回复:] db 510-(offset copy_end-offset copy_start) dup(0) db 55h,0aah 其实还有最重要的一个问题就是主引导扇区的代码的有效性有效的主引导扇区代码最后两个字节必须以55h和aah结尾即位置1feh处的内容必须是字55aah所以被写入软盘0面0道1扇区的代码还缺这东西
比如 程序有写了 500kb 0xaa55 是在511 和 512 位置 中间还有11个空字节 需要填满 是不是还缺点东西 比如写个循环[/quote] 呃 db 510-(offset copy_end-offset copy_start) dup(0)做的就是填充的事它用510减去整个程序所用的字节数得到的 就是要填充的字节数量 在masm里面db n dup (a,b,c```)就是将一组数据以字节的方式重复n次
e0a0 2014-04-15
  • 打赏
  • 举报
回复
引用 3 楼 yuexicheng 的回复:
db 510-(offset copy_end-offset copy_start) dup(0) db 55h,0aah 其实还有最重要的一个问题就是主引导扇区的代码的有效性有效的主引导扇区代码最后两个字节必须以55h和aah结尾即位置1feh处的内容必须是字55aah所以被写入软盘0面0道1扇区的代码还缺这东西
比如 程序有写了 500kb 0xaa55 是在511 和 512 位置 中间还有11个空字节 需要填满 是不是还缺点东西 比如写个循环
e0a0 2014-04-15
  • 打赏
  • 举报
回复
引用 7 楼 yuexicheng 的回复:
[quote=引用 6 楼 u013776377 的回复:] [quote=引用 5 楼 yuexicheng 的回复:] [quote=引用 4 楼 u013776377 的回复:] [quote=引用 3 楼 yuexicheng 的回复:] db 510-(offset copy_end-offset copy_start) dup(0) db 55h,0aah 其实还有最重要的一个问题就是主引导扇区的代码的有效性有效的主引导扇区代码最后两个字节必须以55h和aah结尾即位置1feh处的内容必须是字55aah所以被写入软盘0面0道1扇区的代码还缺这东西
比如 程序有写了 500kb 0xaa55 是在511 和 512 位置 中间还有11个空字节 需要填满 是不是还缺点东西 比如写个循环[/quote] 呃 db 510-(offset copy_end-offset copy_start) dup(0)做的就是填充的事它用510减去整个程序所用的字节数得到的 就是要填充的字节数量 在masm里面db n dup (a,b,c```)就是将一组数据以字节的方式重复n次[/quote] 那么在32位系统里 要怎么写。 我最近在看 GDT. 看不懂 大哥 给我点路子 。 [/quote] gdt的话好像都在开机进入实模式的时候初始化gdt的包括gdt在内存中的线性地址以及它的界限0槽位的空描述符还有切入保护 模式后的必要的代码段数据段栈段描述符 所以这个一般都写入主引导扇区的,主引导扇区512字节的问题依旧可以用 db 510-(offset copy_end-offset copy_start) dup(0)解决 不过你要想真实的实践一下貌似你需要一台裸机啊用虚拟机也行但是在虚拟8086模式下往主引导扇区写数据这个····就算系统允许也不划算啊 用虚拟机的话masm就不大好用了毕竟是针对windows环境的 呃 这个在这儿说不清楚啊你看看这本书李忠的《X86汇编语言-从实模式到保护模式》里面对gdt有很好的讲解这书的pdf版本在csdn里面也可以搜到的就是只有前13章不过也讲了很大一部分gdt的内容了[/quote]
yuexicheng 2014-04-15
  • 打赏
  • 举报
回复
引用 6 楼 u013776377 的回复:
[quote=引用 5 楼 yuexicheng 的回复:] [quote=引用 4 楼 u013776377 的回复:] [quote=引用 3 楼 yuexicheng 的回复:] db 510-(offset copy_end-offset copy_start) dup(0) db 55h,0aah 其实还有最重要的一个问题就是主引导扇区的代码的有效性有效的主引导扇区代码最后两个字节必须以55h和aah结尾即位置1feh处的内容必须是字55aah所以被写入软盘0面0道1扇区的代码还缺这东西
比如 程序有写了 500kb 0xaa55 是在511 和 512 位置 中间还有11个空字节 需要填满 是不是还缺点东西 比如写个循环[/quote] 呃 db 510-(offset copy_end-offset copy_start) dup(0)做的就是填充的事它用510减去整个程序所用的字节数得到的 就是要填充的字节数量 在masm里面db n dup (a,b,c```)就是将一组数据以字节的方式重复n次[/quote] 那么在32位系统里 要怎么写。 我最近在看 GDT. 看不懂 大哥 给我点路子 。 [/quote] gdt的话好像都在开机进入实模式的时候初始化gdt的包括gdt在内存中的线性地址以及它的界限0槽位的空描述符还有切入保护 模式后的必要的代码段数据段栈段描述符 所以这个一般都写入主引导扇区的,主引导扇区512字节的问题依旧可以用 db 510-(offset copy_end-offset copy_start) dup(0)解决 不过你要想真实的实践一下貌似你需要一台裸机啊用虚拟机也行但是在虚拟8086模式下往主引导扇区写数据这个····就算系统允许也不划算啊 用虚拟机的话masm就不大好用了毕竟是针对windows环境的 呃 这个在这儿说不清楚啊你看看这本书李忠的《X86汇编语言-从实模式到保护模式》里面对gdt有很好的讲解这书的pdf版本在csdn里面也可以搜到的就是只有前13章不过也讲了很大一部分gdt的内容了
e0a0 2014-04-15
  • 打赏
  • 举报
回复
引用 5 楼 yuexicheng 的回复:
[quote=引用 4 楼 u013776377 的回复:] [quote=引用 3 楼 yuexicheng 的回复:] db 510-(offset copy_end-offset copy_start) dup(0) db 55h,0aah 其实还有最重要的一个问题就是主引导扇区的代码的有效性有效的主引导扇区代码最后两个字节必须以55h和aah结尾即位置1feh处的内容必须是字55aah所以被写入软盘0面0道1扇区的代码还缺这东西
比如 程序有写了 500kb 0xaa55 是在511 和 512 位置 中间还有11个空字节 需要填满 是不是还缺点东西 比如写个循环[/quote] 呃 db 510-(offset copy_end-offset copy_start) dup(0)做的就是填充的事它用510减去整个程序所用的字节数得到的 就是要填充的字节数量 在masm里面db n dup (a,b,c```)就是将一组数据以字节的方式重复n次[/quote] 那么在32位系统里 要怎么写。 我最近在看 GDT. 看不懂 大哥 给我点路子 。
zara 2014-04-14
  • 打赏
  • 举报
回复
start: 开始的是安装部分吧,copy_start: 开始的是自己的引导代码。
怎么算写入哪个扇区,这个是空白保留没有被使用的都可以写入。
那个 7c00 的问题,应该是不妥。7c00:0000 这个地址和下面的就对不上;但如果是按 07c00:0000 以及 0000:7c00 来说的话,还是有问题,因为这个部分代码本来就是被 bios 加载在 0000:7c00 处的,它若要是也加载第二部分到这里的话,无疑会出现代码的覆盖混乱,后果难料。
最后那个问题,将 0000:7c00 压栈,retf 就是将栈顶作为远程返回的 cs:ip 吗,就是通过这个 retf 返回到 0000:7c00 处。这个功能和上面的 7c00 问题是分不开的,不好理解,应该是有错误的。
yuexicheng 2014-04-14
  • 打赏
  • 举报
回复
汗 第一次用代码这东西注释得不好 不好意思哈
yuexicheng 2014-04-14
  • 打赏
  • 举报
回复

start: 

push cs
pop  es
mov bx,offset copy_start
mov al,1
mov ah,3
mov cl,1
mov ch,0
mov dl,0
mov dh,0
int 13h         ; 将主引导扇区代码写入软驱A中的软盘0面0道1扇区

mov  bx,0
mov  al,2 
mov ah,3
mov cl,2
mov ch,0
mov dl,0
mov dh,0
int 13h      ; <-- 这段 写入  作什么的   书上说 大于512k 要写其他扇区   怎么算 写入哪个扇区 , 怎么写/目测这段代码是向软驱A      ;中的软盘0面0道2扇区开始写入两个山区的内容内容由cs:0提供看这段代码就是要用masm编译了在dos下运行的所以这儿写; ;入的两个扇区的内容就是这段代码从start处开始的1024个字节,至于这段代码完事后的后面的内容是什么就不知道了,至于怎 么算写入哪个扇区你不都用了int 13h了嘛那里面写入的扇区数量al 磁道号ch起始扇区号cl磁头号或者说面号dh向哪个驱动器写入即软盘还是硬盘用dl指定这些都知道了之后怎么写不就是中断的事了嘛。还有是512b不是512k一个扇区一次读写都是以512b为单位的。向软盘写数据到这儿就结束了因此后面的代码是不用执行的那些只是需要写入软盘的数据而已因此要在这儿程序返回加上代码
mov ax,4c00h
int 21h


copy_start:

mov  ax,07c00h
mov  es,ax
mov  bx,0              ; <--这里 好像错了吧   地址是 0:07c00h    这里写成了   7c00h:0/重启计算机后设置从软盘启动那么这段代码将被读入内存0000:7c00处开始执行而es:bx指向的物理地址是7c000h处你在引导扇区代码的最后位置设置了cs:ip指向7c00:0000的地方即物理地址7c000h处这儿正是你从软盘读了两个扇区的数据放入的位置就是下面那个int 13h 而这两个扇区的内容是上面的安装程序写入的就是从start开始的1024b的代码但是cs:ip只会执行到int 21h就停止了你的软盘里面的数据又会被同样的东西覆盖一遍。所以这儿也没错因为它和后面设置cs:ip的地址是一致的

mov  al,2
mov  ah,2 
mov  cl,2
mov  ch,0
mov  dl,0
mov  dh,0
int  13h

mov  ax,07c00h
push  ax                 
mov  ax,0
push ax
retf                      ; <--   上面5行  什么意思   干嘛要   retf/retf就是用当前栈中的数据修改cs:ip低字修改ip高字修改cs在这儿高字就是7c00低字就是0000[/color]
copy_end:nop
 db 510-(offset copy_end-offset copy_start) dup(0)
db 55h,0aah                        其实还有最重要的一个问题就是主引导扇区的代码的有效性有效的主引导扇区代码最后两个字节必须以55h和aah结尾即位置1feh处的内容必须是字55aah所以被写入软盘0面0道1扇区的代码还缺这东西

code ends
end start

以上是个人愚见

21,498

社区成员

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

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