21,498
社区成员
发帖
与我相关
我的任务
分享
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

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
以上是个人愚见