王爽《汇编语言》(第3版)课程设计2上篇

主体程序的基本样式,3、4功能可以运行显示相应结果
1、2功能并不是最终形式,不要运行,以免出现意外的情况
程序较为复杂,篇幅较长,源码请耐心阅读仔细分析

初步源程序

 ;autoact安装程序;autoact程序可以自行启动计算机;功能:(1)列出功能选项,让用户通过键盘进行选择,界面如下。; 1) reset pc; 2) start system; 3) clock; 4) set clock;(2)用户输入“1”后重新启动计算机;(3)用户输入“2”后引导现有的操作系统;(4)用户输入“3”后,执行动态显示当前日期、时间的程序; 显示格式:年/月/日 时:分:秒; 一直动态显示当前的时间,在屏幕上将出现时间按秒变化的效果; 当按下F1键后,改变显示颜色;按下Esc键后,返回到主菜单;(5)用户输入“4”后可更改当前的日期、时间,更改后返回到主菜单;;
assume cs:code
code segment
;;目标程序;名称:autoact;
autoact:jmp autostarttable dd 0ffff0000h,7c00hsubtab dw sub1,sub2,sub3,sub4   ;功能程序入口地址str db '1) reset pc',0,'2) start system',0,'3) clock',0,'4) set clock',0mastack dw 32 dup (0)    ;定义栈空间
;;界面
autostart: mov ax,csmov ss,ax   ;设置栈空间mov sp,offset mastack + 64
;mov ax,0b800hmov ds,axcall clrscr
;mov cx,4mov bx,0mov si,0
interface:push cxmov di,0mov ch,0
;
row:mov cl,str[si]    ;显示行inc sijcxz rowendmov [bx + di],cladd di,2jmp row
;
rowend:add bx,160pop cxloop interface
;
input: mov ah,0int 16hcmp al,'1'jb inputcmp al,'4'ja input    ;输入不在1~4的范围返回重新输入
; mov ah,0sub ax,'1'mov bx,axshl bx,1    ;根据用户输入计算功能程序入口地址在subtab表中的偏移call word ptr subtab[bx]jmp autostart   ;返回初始化界面
;
;清屏;参数:需要初始化(ds)=b800h
clrscr: push cxpush dimov di,0mov cx,2000
clears:mov byte ptr [di],' '  ;清空屏幕mov byte ptr [di + 1],07h  ;还原颜色属性add di,2loop clearspop dipop cxret
;
;重启计算机
sub1:call clrscr  ;清屏call dword ptr table[0]
;
;引导操作系统
sub2:call clrscr  ;清屏mov ax,0mov es,axmov bx,7c00h ;设置es:bx指向接收从扇区读入数据的内存区
;mov al,1mov ch,0mov cl,1mov dl,80h ;硬盘C驱动器号mov dh,0mov ah,2int 13hcall dword ptr table[4]
;
;动态显示当前日期、时间
sub3:push axpush bxpush cxpush dxpush sipush di
;call clrscr  ;清屏;日期补全mov byte ptr ds:[160*12+30*2],'2'mov byte ptr ds:[160*12+31*2],'0'
;mov si,32*2 ;设置显存mov dl,9  ;初始访问单元mov dh,'/' ;日期分隔符mov bl,1  ;设置访问单元增量,日期部分为1,时间部分为2call datetime
;;时间部分的处理mov byte ptr [160*12+si-2],' 'mov byte ptr [160*12+si],' ' ;日期和时间分隔add si,2mov bl,2
time: push simov dl,4mov dh,':'  ;时间分隔符
;call datetimemov byte ptr [160*12+si-2],' 'pop simov bh,al
;
update: mov ah,0chint 21h   ;作用是清除键盘缓冲区in al,60hcmp al,3bhje color    ;按F1键改变显示颜色cmp al,01hje return3  ;按下Esc键返回主菜单
;mov al,0out 70h,alin al,71hand al,00001111b ;取秒的个位数add al,30hcmp al,bhje update    ;刷新时间jmp time    ;直接显示刷新时间
;
color:mov di,1mov cx,2000
loopc:inc byte ptr [di]add di,2loop loopcjmp update    ;刷新时间
;
return3: pop dipop sipop dxpop cxpop bxpop axret
;;日期时间处理子程序;参数:(dl)=入口单元,(dh)=分隔符,(bl)=地址变量;ds:si指向显示地址;返回:(si)=处理后指向的位置,(al)=末位有效数字;
datetime: push cxpush dxmov cx,3 
;
loopdt: push cxmov al,dlout 70h,alin al,71h  ;取访问单元中的数据
;mov ah,almov cl,4shr ah,cl  ;ah为十位数码值and al,00001111b ;al为个位数码值add ah,30hadd al,30h ;得到ASCII码
;mov byte ptr [160*12+si],ahmov byte ptr [160*12+si+2],almov byte ptr [160*12+si+4],dh
;add si,6sub dl,blpop cxloop loopdt
;pop dxpop cxret
;
;更改当前的日期、时间
sub4:push axpush dxpush espush sipush bpcall clrscr     ;清屏mov byte ptr ds:[0],'2'mov byte ptr ds:[2],'0'  ;初始化日期、时间显示
;jmp start4stringsk db 18 dup (0)  ;定义字符串存储空间——字符栈dw 0      ;预留空间
start4: mov dx,2h  ;显示位置为0行2列mov ax,csmov es,axmov si,offset stringsk  ;设置es:si指向字符栈mov bp,0     ;设置栈顶call getstr 
;
;修改日期、时间mov bp,0mov dl,9mov bl,1call writedt
;mov dl,4mov bl,2call writedt
;pop bppop sipop espop dxpop axret
;;修改CMOS单元的子程序;参数:(dl)=入口单元,(bl)=地址变量;es:bp指向写入的字符串;返回:(bp)=末尾位置
writedt: push axpush cx
;mov cx,3
loopwdt: push cxmov ah,es:[si][bp]sub ah,30hmov cl,4shl ah,clsub byte ptr es:[si][bp + 1],30hor ah,es:[si][bp + 1]
;mov al,dlout 70h,almov al,ahout 71h,aladd bp,3sub dl,blpop cxloop loopwdt
;pop cxpop axret
;
;完整的接收字符串输入的子程序
getstr: push ax 
;
getstrs:mov ah,0int 16h
; cmp al,30hjb nonumber     ;判断的是ASCII码小于30h,说明不是数字cmp al,39hja nonumber     ;判断的是ASCII码大于39h,说明不是数字mov ah,0call charstack  ;字符入栈mov ah,2call charstack  ;显示栈中的字符jmp getstrs
;
;
nonumber: cmp ah,0eh  ;退格键的扫描码je backspacecmp ah,1ch   ;回车键的扫描码je enterjmp getstrs
; 
; 
backspace: ;退格mov ah,1 call charstack  ;字符出栈mov ah,2call charstack  ;显示栈中的字符jmp getstrs
;
enter:  ;回车mov al,' 'mov ah,0call charstack   ;0入栈mov ah,2call charstack  ;显示栈中的字符
;pop axret ;getstr ends
;
;
;字符串功能子程序实现
charstack:jmp short charstart;strtable dw charpush,charpop,charshow;
charstart:  push cxpush bxpush dxpush di
; cmp ah,2ja overflowmov bl,ahmov bh,0add bx,bxjmp word ptr strtable[bx]
;
overflow: jmp sret  ;值超出返回
charpush:cmp bp,18je overflow   ;栈满不再入栈mov es:[si][bp],alinc bp
;mov cl,'/';字符栈2、5单元判断cmp bp,2je sformcmp bp,5je sform
;mov cl,' ';字符栈8、17单元判断cmp bp,8je sformcmp bp,17je sform
;mov cl,':';字符栈11、14单元判断cmp bp,11je sformcmp bp,14je sform;直接返回jmp sret
;;格式符显示
sform: mov ah,2call charstack   ;显示字符mov es:[si][bp],clinc bpjmp sret
;
charpop:cmp bp,0je sretdec bp
;cmp bp,2je cformcmp bp,5je cformcmp bp,8je cformcmp bp,11je cformcmp bp,14je cform
;
rcform: mov al,es:[si][bp] jmp sret
;;格式符清除
cform: mov ah,2call charstack   ;显示字符dec bpjmp rcform    ;返回
;
charshow: mov al,160mov ah,0 mul dhmov di,axadd dl,dlmov dh,0add di,dx
;mov bx,0
;
charshows:cmp bx,bpjne noemptymov byte ptr [di],' ' jmp sret
;
noempty:mov al,es:[si][bx]mov [di],almov byte ptr [di+2],' 'inc bxadd di,2jmp charshows
;
sret: pop dipop dxpop bxpop cxret
;
autoactend:nopmov ax,4c00hint 21h
code ends
end autoact

运行结果

在这里插入图片描述
3号功能
在这里插入图片描述
4号功能
在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部