. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->使用BIOS进行键盘输入和磁盘读写
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  课程设计2 启动计算机无法通过 求高手解答  [待解决] 回复[ 6次 ]   点击[ 414次 ]  
donggs02
[帖 主]   [ 发表时间: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
chinatree
[第1楼]   [ 回复时间:2011-09-03 16:44 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
帮你顶顶,我也不会。
tily
[第2楼]   [ 回复时间:2011-09-03 21:25 ]   [引用]   [回复]   [ top ] 
荣誉值:12
信誉值:1
注册日期:2011-06-04 00:01
呵呵  说不定我能帮上忙哦
chaplinyip
[第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
donggs02
[第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
donggs02
[第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, 改了位置不能启动
wang_ss
[第6楼]   [ 回复时间:2011-09-27 18:09 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-12-13 12:23
请教楼主,如何将汇编代码写入软盘中?
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved