相关链接:
王爽《汇编语言》之课程设计一 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