现在的位置: 首页 > 技术文章 > 操作系统 > 正文

王爽《汇编语言》之课程设计二

2014年01月01日 操作系统 ⁄ 共 3059字 ⁄ 字号 评论 2 条 ⁄ 阅读 153 次

相关链接:

王爽《汇编语言》之课程设计一   http://www.techbulo.com/732.html

最近加班加点的总算把王爽老师的《汇编语言》这本书看完了,讲得不错,到了最后有个课程设计二,写个引导程序,如果认真看了这本书,写出来不是很难,主要涉及到了BIOS中断服务例程的调用,磁盘扇区的读写等。

题目要求如下:

问题描述一

问题描述一

问题描述二

问题描述二

问题描述三

问题描述三

先看一下用我的程序引导起来的界面吧:

引导程序

引导程序

说明一下:我只实现了菜单项中的1、2、5功能,即重启电脑、从硬盘引导系统、关闭电脑的功能,至于读取时间和设置CMOS中的时间由于时间原因没有实现(这两项实现起来也是比较简单的),框架已经搭建好,读者可以自行实现一下,有问题咱们再交流。

下面贴一下我的代码:


assume cs:setupsg
setupsg segment
 start:
 ;将主引导程序安装到第一扇区
 mov ax,initsg
 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

 ;子程序安装到从第2扇区开始的扇区
 mov ax,syssg
 mov es,ax
 mov al,15
 mov cl,2

 mov ah,3
 int 13h

 mov ax,4c00h
 int 21h
setupsg ends
initsg segment
assume cs:initsg
 init_start:
 call clear
 call loadsys

 mov ax,2000h
 push ax
 mov ax,0
 push ax
 retf

 loadsys:
 mov ax,2000h
 mov es,ax
 mov bx,0

 mov al,15
 mov ch,0
 mov cl,2
 mov dl,0
 mov dh,0

 mov ah,2
 int 13h
 ret

clear:
 mov ax,0b800h
 mov ds,ax
 mov bx,0
 mov cx,24*80*2
 clear_s:
 mov byte ptr ds:[bx],0
 add bx,2
 loop clear_s
 mov bx,1
 mov cx,24*80*2
 clear_resetcol:
 mov byte ptr ds:[bx],07h
 add bx,2
 loop clear_resetcol
 ret

 init_end: nop
 db 509-(offset init_end-offset init_start) dup (0)
 db 55h, 0aah

initsg ends

syssg segment
assume cs:syssg
 menu:
 jmp near ptr menushow
 menudata dw offset md0,offset md1,offset md2,offset md3,offset md4,offset md5,offset md6
 md0 db "------ BOOT MENU ------",0
 md1 db "1) reboot pc",0
 md2 db "2) start system from disk",0
 md3 db "3) clock",0
 md4 db "4) set clock",0
 md5 db "5) shutdown now",0
 md6 db "copyright @ 2013 LiDong,Inc.All rights reserved.",0
 systable dw sys_restart,sys_disksys,sys_showclock,sys_setclock,sys_shutdown
 menushow:
 mov dh,5 ;行
 mov dl,30 ;列
 mov bp,0
 mov ax,cs
 mov ds,ax
 mov cx,6
 menushow_s:
 push cx
 mov si,menudata[bp] ;ds:si指向字符串首地址
 mov cl,02h ;cl=颜色
 call sys_showstr
 add bp,2
 add dh,2
 pop cx
 loop menushow_s

 mov si,offset md6
 mov dh,23
 mov dl,28
 mov cl,02h
 call sys_showstr

 ;处理用户输入
 sys_input:
 mov ah,0
 int 16h
 mov bx,0
 mov bl,al
 mov al,30h
 sub bl,al ;ascii转换为序列号
 sub bl,1 ;1-5转换为0-4

 cmp bx,0
 jb cycle
 cmp bx,4
 ja cycle
 add bx,bx
 call word ptr systable[bx] ;调用菜单功能

 cycle:
 jmp short sys_input

 ;重启计算机
sys_restart:
 mov ax,0ffffh
 push ax
 mov ax,0h
 push ax
 retf

 ;从硬盘引导
 sys_disksys:
 call cls

 mov ax,0h ;硬盘数据读取到0:7c00
 mov es,ax
 mov bx,7c00h

 mov al,1 ;读取的扇区数
 mov ch,0 ;0磁道
 mov cl,1 ;1扇区
 mov dl,80h ;c盘
 mov dh,0 ;0面

 mov ah,2
 int 13h

 mov ax,0h
 push ax
 mov ax,7c00h
 push ax
 retf

 ;显示时钟
 sys_showclock:
 ;////////////////////////////////////////////////////////////////////////

 ;设置时钟
 sys_setclock:
 ;////////////////////////////////////////////////////////////////////////

 ;关机
 sys_shutdown:
 mov ax,5301H
 xor bx,bx
 xor cx,cx
 int 15H
 mov ax,530EH
 xor bx,bx
 mov cx,102H
 int 15H
 mov ax,5307H
 mov bx,1
 mov cx,3
 int 15H
 ;清屏
 cls:
 mov ax,0b800h
 mov ds,ax
 mov bx,0
 mov cx,24*80*2
 cls_s:
 mov byte ptr ds:[bx],0
 add bx,2
 loop cls_s
 mov bx,1
 resetcol:
 mov byte ptr ds:[bx],07h
 add bx,2
 loop resetcol
 ret

 ;显示0结尾的字符串
 ;参数:dh=行号,dl=列号,cl=颜色,ds:si指向字符串首地址
 sys_showstr:
 push ax
 push cx
 push dx
 push si
 push bp
 push es
 mov ax,0b800h
 mov es,ax
 mov al,80*2 ;80*2*行号
 mul dh
 mov dh,0
 add dx,dx ;列号*2
 add ax,dx
 mov bp,ax
 showstr_s:
 mov ch,ds:[si]
 cmp ch,0
 je showstr_return
 mov es:[bp],ch
 inc bp
 mov es:[bp],cl
 inc bp
 inc si
 jmp short showstr_s
 showstr_return:
 pop es
 pop bp
 pop si
 pop dx
 pop cx
 pop ax
 ret
syssg ends

end start

目前有 2 条留言    访客:1 条, 博主:1 条

  1. asm 2015年12月02日 上午8:18  @回复  Δ-49楼 回复

    这里是怎么写入软盘的扇区中的啊……
    是直接运行这个程序就可以了吗


    • 管理员
      techbulo 2015年12月04日 上午9:12  @回复  ∇地下1层 回复

      时间有点久 也记不清了,先把这个程序编译出来,用专门的制作软盘的软件把这个程序弄到软盘里面,就是模拟一个软盘出来,然后开机用制作的这个软盘启动

给我留言

留言无头像?



×