实在搞不懂了,求帮助啊!!

juge0007 2019-03-06 07:41:37
最近在做王爽的汇编课程设计2,我的代码如下,有两段:

assume cs:code

data segment
db 512 dup (0)
data ends

code segment
start: mov ax,cs
mov ds,ax
mov si,offset boot

mov ax,data
mov es,ax
mov di,0

mov cx,offset bootend - offset boot
cld
rep movsb

jmp write

write: mov ax,data
mov es,ax
mov bx,0

mov al,1
mov ch,0
mov cl,1
mov dl,0
mov dh,0
mov ah,3

int 13h

mov ax,4c00h
int 21h

boot: jmp short bootstart
db 10 dup (0)
bootstart:
mov ax,cs
mov ss,ax
mov sp,10

mov ax,0
mov es,ax
mov bx,7c00h

mov al,1
mov ch,0
mov cl,2
mov dl,0
mov dh,0
mov ah,2

int 13h

mov bx,0
push bx
mov bx,7c00h
push bx

retf
bootend: nop
code ends
end start


assume cs:code

data segment
db 512 dup (0)
data ends

code segment
start: mov ax,cs
mov ds,ax
mov si,offset toWrite

mov ax,data
mov es,ax
mov di,0

mov cx,offset writeEnd - offset toWrite
cld
rep movsb

jmp writeToDisk

toWrite: mov ax,0b800h
mov es,ax
mov di,160*12+40

mov al,65
mov ah,100b
mov es:[di],ax
mov es:[di+2],ax
mov es:[di+4],ax

writeEnd: nop

writeToDisk: mov ax,data
mov es,ax
mov bx,0

mov al,1
mov ch,0
mov cl,2
mov dl,0
mov dh,0
mov ah,3

int 13h

mov ax,4c00h
int 21h

code ends
end start


开机进入之后,就是不显示东西,不知道为啥,我觉得代码也没有什么问题啊
我这是参考别人的做的,
第一段的引导程序,我用来显示别人写的内容,是可行的,但是显示我写的第二段的内容就不行了,
各位大神能否详解一下?
...全文
147 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
juge0007 2019-03-07
  • 打赏
  • 举报
回复
引用 6 楼 早打大打打核战争 的回复:
两个问题:
1. 引导扇区是被读取到0000:7c00处执行的,你要先把自己的代码移到另一个位置,比如7800,再把原来的引导扇区读到0000:7c00处,否则你自己的代码还没执行完就被覆盖掉了
2. 0:0:2扇区在软盘中是第一个文件分配表的位置,你直接覆盖了会造成文件系统错乱的
这没办法把显示的内容移到7800啊,我在windows里面把程序写入7800以后,关机再开机,7800里面的内容就自动清理了啊
  • 打赏
  • 举报
回复
不是把显示内容移动,而是把你的引导代码移动:
boot: jmp short bootstart
db 10 dup (0)
bootstart:
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,10
lea si,boot
mov di,7800h
mov cx,bootend - boot
rep movsb
mov ax,781ch
jmp ax

mov bx,7c00h
mov al,1
mov ch,0
mov cl,2
mov dl,0
mov dh,0
mov ah,2
int 13h

mov bx,0
push bx
mov bx,7c00h
push bx

retf
bootend: nop

大致就是这样的,没测试
  • 打赏
  • 举报
回复
楼主的意思应该是想把磁盘原引导扇区写到0:0:2扇区,自己的引导代码写到0:0:1扇区,引导之后再加载原引导扇区
zara 2019-03-06
  • 打赏
  • 举报
回复
第一段能显示内容,如果是直接地显示什么是可以的,但用其它扇区的直接覆盖了,不知道什么后果,你什么测试环境、那个读入的扇区是什么内容?
我还是觉得,应该首先规范了,再谈其它。
juge0007 2019-03-06
  • 打赏
  • 举报
回复
这没办法把显示的内容移到7800啊,我在windows里面把程序写入7800以后,关机再开机,7800里面的内容就自动清理了啊
  • 打赏
  • 举报
回复
两个问题:
1. 引导扇区是被读取到0000:7c00处执行的,你要先把自己的代码移到另一个位置,比如7800,再把原来的引导扇区读到0000:7c00处,否则你自己的代码还没执行完就被覆盖掉了
2. 0:0:2扇区在软盘中是第一个文件分配表的位置,你直接覆盖了会造成文件系统错乱的
juge0007 2019-03-06
  • 打赏
  • 举报
回复
引用 1 楼 zara 的回复:
第一段能显示内容,如果是直接地显示什么是可以的,但用其它扇区的直接覆盖了,不知道什么后果,你什么测试环境、那个读入的扇区是什么内容?
我还是觉得,应该首先规范了,再谈其它。
就是用的vmware虚拟机里面虚拟了一个软盘,把程序写进去的,编译用的masm5.0
juge0007 2019-03-06
  • 打赏
  • 举报
回复
引用 2 楼 早打大打打核战争 的回复:
楼主的意思应该是想把磁盘原引导扇区写到0:0:2扇区,自己的引导代码写到0:0:1扇区,引导之后再加载原引导扇区
可是,为啥就是执行不了啊,我看程序也没啥问题啊
juge0007 2019-03-06
  • 打赏
  • 举报
回复
引用 2 楼 早打大打打核战争 的回复:
楼主的意思应该是想把磁盘原引导扇区写到0:0:2扇区,自己的引导代码写到0:0:1扇区,引导之后再加载原引导扇区
差不多吧,就是把想执行的内容写到2扇区,开机以后,系统去读区1扇区的内容,然后再从1扇区转去执行2扇区的程序

21,459

社区成员

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

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