Gappsong
双任务系统设计
采用8086汇编语言,设计并实现双任务系统设计,对两个任务(两个窗口)进行管理和调度,能够实现任务之间的切换,保存上下文信息。任务调度程序使用循环程序来完成。在左边显示窗口,能够运行简单的贪吃蛇游戏,在右边显示窗口,能够画出等边三角形。
贪吃蛇游戏采用键盘按键控制贪吃蛇前进方向,如“W、S、A、D”键分别为上下左右方向控制按键
游戏终止条件为贪吃蛇碰触窗口边框、蛇头碰触身体、身体长度达到上限,以“R”键为游戏重新开始。若游戏进行当中无键按下,则贪吃蛇保持当前方向不变直至撞墙
等边三角形位置在该显示区域的中部,参数边长由键盘输入确定
三角形每次根据输入的参数,在该窗口将三角形重新绘制出来
初始工作窗口为右边显示窗口,以后每按一次Tab键切换至旁边显示窗口
当某个显示窗口被选中时,则焦点停留在该窗口,键盘输入对当前窗口有效
整个系统按ESC键退出,返回DOS操作系统界面
getInt() 读入整数函数:键盘输入一串字符,检测该字符是否为数字字符。若不是数字字符,则做无效处理。直至输入完整的数值字符保存在AX中并将ZF置1(调用者可用JZ判断是否发生特殊情况)。并做如下处理:①若键盘输入Esc键,返回AX=0,并将ZF置0。②若键盘输入Tab键,返回AX=1,并将ZF置0
getchar() 函数:输入一个字符,回显
puts() 函数:输出字符串
getch() 函数:输入一个字符,不回显
putInt() 函数:将AX寄存器中的数字以十进制的形式输出
movCursor() 移动光标模块:将光标移动至y行x列
sDelay() 延时函数模块:控制贪吃蛇移动速度
kbhit() 模块:检测键盘有无输入
rand() 随机数发生模块:生成一定范围内的随机数
三角形模块流程图
贪吃蛇模块流程图
函数内部调用图
顶层调用图示
任务切换
yield proc
pushf ;先保存一下flags
cmp ax,0 ;判断是否是esc
jne yEls1
mov AH, 4CH ;esc exit
int 21h
yEls1:
;是tab,先在它自己的栈里保存寄存器,
push ax
push bx
push cx
push dx
push di
push si
push bp
;再切换栈,恢复另一组寄存器
cmp yFunc,0 ;当前是tri?
je yTri
mov stack_snake_sp,sp
mov sp,stack_tri_sp ;当前是1:snake,要切换成tri
mov ax,STACK_RTI
mov ss,ax
mov yFunc,0
jmp yTriEd
yTri:
mov stack_tri_sp,sp
mov sp,stack_snake_sp ;当前是0:tri,要切换成snake
mov ax,STACK_SNAKE
mov ss,ax
mov yFunc,1
;恢复寄存器
yTriEd:
pop bp
pop si
pop di
pop dx
pop cx
pop bx
pop ax
popf
ret ;切换
yield endp
贪吃蛇移动
sMove proc
pushf
push ax
push bx
push di
mov ah,0
mov al,sbody_move
mov di,ax
;擦除身体最后一节
shl di,1
mov bl,sbody[di] ;x di*2+0
inc di
mov al,sbody[di] ;y
call movCursor
cmp bl,-1
jz SMEls0
mov al,' '
call putchar
SMEls0:
mov ah,0
mov al,sbody_move
mov bx,ax
mov al,x
mov di,bx
shl di,1
mov sbody[di],al
mov al,y
inc di
mov sbody[di],al
dec sbody_move
cmp sbody_move,0
ja sMElse1 ;手动取余
mov al,blength
mov sbody_move,al
sMElse1:
;不需要擦除头部
;switch(m)
cmp m,'s'
je sMCs1
cmp m,'a'
je sMCs2
cmp m,'d'
je sMCs3
cmp m,'w'
je sMCs4
;case
sMCs1: inc y
jmp SCsEd1
sMCs2: dec x
jmp SCsEd1
sMCs3: inc x
jmp SCsEd1
sMCs4: dec y
jmp SCsEd1
SCsEd1: ;end of switch-case
mov al,y ;重新绘制头部
mov bl,x
call movCursor
mov al,HEAD_CHAR
call putchar
cmp HEAD_CHAR,'#'
jne sMElse2
mov HEAD_CHAR,'*'
jmp sMIfEd2
sMElse2:
mov HEAD_CHAR,'#'
sMIfEd2:
;移动光标
mov bl,0
mov al,SCY
call movCursor
pop di
pop bx
pop ax
popf
ret
sMove endp
画三角形主要流程
triangle proc near
pushf
push AX
push BX
push CX
push DX
mov triLenth,AX ;记录AX输入的边长
call triHypotenuse ;第一次call画左边
call triHypotenuse ;第二次call画右边
call triBase ;画横线
pop DX
pop CX
pop BX
pop AX
popf
ret
开始界面
输入等边三角形边长
若输入超出范围,清除输入数据并等待重新输入(此处为500)
输入符合规范(此处为200)
按Enter画等边三角形并重新打印提示信息
可循环读入等边三角形边长(此处为80)
按Enter清除右半部分屏幕并重新打印
按Tab键画等边三角形程序停止,贪吃蛇程序开始运行
食物出现在随机位置,用W A S D键控制贪吃蛇运动
若撞墙或碰到自己游戏结束并暂停
游戏过关
按R键重新开始游戏
按Tab键贪吃蛇程序暂停,画等边三角形程序等待输入
不足
改进
在本次竞赛学习过程中,项目经过功能划分、肢解分为一层一层的模块调用。将计算机基本指令和中断调用整合起来形成底层模块,再由底层模块整合起来形成较大的功能模块,再由功能模块进行逻辑组合形成snake和tri模块,使用yield任务切换模块作为桥梁将整个程序整合在一起。
在实际操作中我们认识到熟练掌握汇编语言中的指令的基本用法和组织结构的重要性。只有熟练掌握指令的基本用法,我们才能在实际的编程中像运用高级语言一样灵活的变通,认清计算机组织结构才能灵活设计程序整体架构。汇编语言作为一种低级设计语言,它是最底层的、与计算机内部的结构联系密切,我们在这次竞赛过程中深刻地了解到了这一点。
在贪吃蛇程序和画等边三角形的程序设计中,加深了对计算机体系结构的理解,深刻理解汇编语言和其他语言的不同。在代码设计中也遇到很多的困难,比如一些寄存器使用冲突的问题,还有一些宏的使用问题和两个程序切换的问题等,以及如何对程序调用时对参数和返回值做一系列约定。在这个方面,我们深刻理解了团队协作能力的重要性。
keyboard_arrow_left上一篇 : 基于Android实现的锁屏软件APP Windows驱动级云安全主动防御系统 : 下一篇keyboard_arrow_right