|
主题 : : 课程设计2 启动计算机无法通过 求高手解答 [待解决] |
回复[ 6次 ]
点击[ 414次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2011-09-03 16:15 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-04-08 17:43 |
在实软驱dos启动后运行我写是小程序,小程序目的是改写软盘的0面0磁道1扇区内容,软盘的0面0磁道1扇区内容是从硬盘启动,可是重起电脑后软盘程序无法启动硬盘。 郁闷
assume cs:code
code segment
;............要拷贝到软盘内的程序,........
s: mov ax,cs
mov ds,ax
mov si,offset s0
mov ax,20H
mov es,ax
mov di,0
mov cx,offset s1-offset s0
cld
rep movsb
mov ax,20H
push ax
mov ax,0
push ax
retf ;把要读取硬盘程序复制到cs=20H ip=0处
s0: mov ax,0
mov es,ax
mov bx,7c00H
mov al,1
mov ch,0
mov cl,1
mov dl,80H
mov dh,0
mov ah,2
int 13H
mov ax,0
push ax
mov ax,7c00H
push ax
retf
;..........拷贝程序......
start: mov ax,cs
mov es,ax
mov bx,0
mov al,1
mov ch,0
mov cl,1
mov dh,0
mov dl,0
mov ah,3
int 13H
mov ah,4cH
int 21H
s1: nop
code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2011-09-03 16:44 ]
[引用]
[回复]
[ top ] | |
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59 |
|
|
|
|
|
[第2楼]
[ 回复时间:2011-09-03 21:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:12
信誉值:1
注册日期:2011-06-04 00:01 |
|
|
|
|
|
[第3楼]
[ 回复时间:2011-09-03 22:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:12
信誉值:1
注册日期:2011-07-28 10:58 |
;............要拷贝到软盘内的程序,........
s: mov ax,cs
mov ds,ax
mov si,offset s0
mov ax,20H
mov es,ax
mov di,0
mov cx,offset s1-offset s0
cld
rep movsb
mov ax,20H
push ax
mov ax,0
push ax
retf ;把要读取硬盘程序复制到cs=20H ip=0处
在这一段中,处理s1和s2偏移地址时应加上7c00h,例如:offset s1+7c00h。因为计算机从软盘启动时,是先将软盘里的代码复制到0:7c00h,偏移地址是从7c00h算起。而编译器对偏移地址处理是从0算起。
另外,有一点我不是太明白:为什么要先将s0以下的代码先复制到20h:0,再从20h:0执行呢?我觉得完全可以一开始就将c盘1扇区复制到20h:0,再retf,直接启动dos | | |
|
|
|
|
[第4楼]
[ 回复时间:2011-09-03 23:35 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-04-08 17:43 |
感谢3楼的回答程序从软盘启动硬盘成功 代码发出共大家参考
assume cs:code
code segment
s: mov ax,cs
mov ds,ax
mov si,offset s0+7c00H
mov ax,20H
mov es,ax
mov di,0
mov cx,offset s1-offset s0
cld
rep movsb
mov ax,20H
push ax
mov ax,0
push ax
retf
s0: mov ax,0
mov es,ax
mov bx,7c00H
mov al,1
mov ch,0
mov cl,1
mov dl,80H
mov dh,0
mov ah,2
int 13H
mov ax,0
push ax
mov ax,7c00H
push ax
retf
start: mov ax,cs
mov es,ax
mov bx,0
mov al,1
mov ch,0
mov cl,1
mov dh,0
mov dl,0
mov ah,3
int 13H
mov ah,4cH
int 21H
s1: nop
code ends
end start | | |
|
|
|
|
[第5楼]
[ 回复时间:2011-09-03 23:46 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-04-08 17:43 |
ssume cs:code
code segment
mov ax,20H
mov es,ax
mov bx,0
mov al,1
mov ch,0
mov cl,1
mov dl,80H
mov dh,0
mov ah,2
int 13H
mov ax,20H
push ax
mov ax,0
push ax
retf
start: mov ax,cs
mov es,ax
mov bx,0
mov al,1
mov ch,0
mov cl,1
mov dh,0
mov dl,0
mov ah,3
int 13H
mov ah,4cH
int 21H
code ends
end start
代码如果改成这样电脑不能启动,int 19H系统启动中断是将软盘或硬盘的0面0道1扇读入内存0:7c00H,将CS:ip指向0:7c00H, 改了位置不能启动 | | |
|
|
|
|
[第6楼]
[ 回复时间:2011-09-27 18:09 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2010-12-13 12:23 |
|
|