语言程序设计课程设计指导书由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“课程设计任务及指导书”。
汇编语言程序设计课程设计指导书
一、课程设计的目的本课程设计是《汇编语言程序设计》课程的后继教学环节,其宗旨是使学生通过对一个较大型的、综合性的应用程序进行阅读、修改、添加功能等工作,对汇编语言程序设计有更进一步的认识,提高编程技巧和阅读理解复杂程序的能力。
二、课程设计的任务要求
根据所给的“Reader.asm”应用程序框架,在此基础上修改和添加功能。1.基本任务:
认真阅读“Reader.asm”源程序,理解程序每一条指令在程序中的作用; 用→、←键在窗口内左右移动文本;
用PgDn,PgUp键上下快速移动文本(每次移半帧); 设计专用键放大、缩小窗口,改变窗口位置。
2.扩展任务: 对文本内的Tab字符(ASCII码09H)进行处理:遇到Tab键,下一个字符显示在下一个表站开始处(每个6个字符一个表站);
设置状态行,显示当前文件名、文本位置(仿垂直滚动条)。
3.自行设计的其它任务:
三、课程设计报告的内容
1.课程设计题目名称、班级号、学号、学生姓名和课程设计起止日期(封面);
2.上海应用技术学院课程设计任务书(下发)3.课程设计目的和要求;
4.课程设计任务内容; 5.详细设计说明; 6.软件使用说明; 7.课程设计总结;
8.附录:1 参考文献 2 程序清单(电子版)。
四、课程设计详细设计说明及其它要求
1.2.3.4.5.6.分析原“Reader.asm”程序结构:每个模块说明,较大模块程序流程图; 对你已经实现的功能做详细的说明,并附上流程图及部分程序清单; 自己对该“文件阅读器”的进一步设想;
对于有设想但最终未实现的功能的大致编程思路的阐述; 论述在设计过程中遇到的并且对你具有启发性的问题; 交课程设计报告手写版,源程序交电子版。
五、评分标准
1.根据平时出勤情况和设计时的工作情况;
2.根据课程设计程序的完成情况,必须有可运行的软件。3.根据课程设计报告的质量。课程设计报告不能抄袭,抄袭判为不及格。4.在题目要求之外附加具有实用性的功能。
六、课程设计工作进度计划
星期一:课程设计介绍,源程序阅读理解,功能设计,程序编写。星期二:功能设计,程序编写。
星期三:程序编写与调试,课程设计报告撰写。星期四:程序编写与调试,课程设计报告撰写。
星期五:程序最终修改,课程设计报告撰写,提交报告并答辩。
七、主要参考资料
[1]杨文显.汇编语言程序设计简明教程.北京:电子工业出版社,2005
八、附录
《文本阅读器》汇编语言源程序清单
;Title: Aemble Program “Reader.asm”
;Read a file from disk, display it‟s contents on screen;Move the content on screen by up/down arrow keys;========================== MYDAT SEGMENT MAXLEN DW 1000;最大行数 INDEX DW 1000 DUP(?);行索引 LENCT DW 0;实际行数 CURLINE DW 0;当前页第一行行数 CCOUNT DW ?;文件总字符数
TOP DB 5;窗口左上角行数 LEFT DB 5;窗口左上角列数 WS DW 60;窗口宽度 HS DW 15;窗口高度 FG DB 17H;文字属性 FGB DB 1FH;窗口边框属性
MSG1 DB 'File:$';输入文件名提示 MSG2 DB 'File open error!$';打开文件出错时提示 MSG3 DB 'File read error!$';读文件出错时提示 FILENA DB 80,?,80 DUP(?);输入文件名缓冲区
;定义功能键和相应的处理程序
;每个功能定义两个数据:扫描码,处理程序入口地址;该数据由DOSUB子程序使用
KEYSUB DW 48H, SUB1 , 50H, SUB2, 0
MYDAT ENDS
;==========================
BUFFER SEGMENT PARA DB 65535 DUP(?);文件缓冲区,文件最大为64K BUFFER ENDS
;==========================
SSEG SEGMENT STACK „STACK‟;堆栈段
DW 100 DUP(?)SSEG ENDS
;==========================
;宏定义 DISPINIT: 设置显示器显示方式 DISPINIT MACRO MOV AX,0003H;文本方式 25x80 INT 10H ENDM;----------;宏定义 PROMPT: 显示字符串 PROMPT MACRO OUTMSG LEA DX, OUTMSG MOV AH, 09H;INT 21H;ENDM;--------;宏定义KRYIN: 从键盘读入一个字符 KEYIN MACRO MOV AH,0;读键
INT 16H;AH中为扫描码
ENDM;==========================;代码段开始 CODE SEGMENT
ASSUME CS: CODE, DS: MYDAT, ES: BUFFER, SS: SSEG
START: MOV AX, MYDAT;装载DS,ES MOV DS, AX MOV AX, BUFFER MOV ES, AX
DISPINIT;显示方式初始化
CALL READFILE;读入文件
JC DONE
CALL CLIST;初始化索引行
CALL CLSCREEN;清屏
CALL CREWIN;创建窗口
CALL SHOWCUR;显示当前页
NEXT: KEYIN;进入主程序: 读键盘
CALL COMMAND;命令分析与处理
JNC NEXT;非x键继续循环
DONE: CALL CLSCREEN;清屏
MOV AX, 4C00H INT 21H;退出
;-------;子程序READFILE: 提示并读入文件名,将文件读入缓冲区 READFILE PROC PROMPT MSG1;CALL SIN;读入文件名
MOV AX, 3D00H MOV DX, OFFSET FILENA+2 INT 21H;打开文件(读)JC GETERR1;打开文件出错转GETERR1 PUSH DS PUSH ES POP DS;将DS指向文件缓冲区段
MOV BX, AX;BX=文件号
MOV AH, 3FH;读文件 MOV CX, 0FFFFH;读入最多64K-1 MOV DX, 0;DS: DX指向文件缓冲区
INT 21H POP DS JC GETERR2;读入文件出错转GETERR2 MOV CCOUNT, AX;实际读入字符数存入CCOUNT中
CLC JMP GETFILEXIT
GETERR1: PROMPT MSG2;读入文件出错处理
KEYIN STC JMP GETFILEXIT;
GETERR2: PROMPT MSG3;打开文件出错处理
KEYIN STC
GETFILEXIT: RET
READFILE ENDP;-------;输入文件名子程序 SIN PROC MOV AH, 0AH MOV DX, OFFSET FILENA INT 21H;输入文件名
XOR CH, CH MOV CL, FILENA+1;取文件名长度
LEA BX, FILENA+2 ADD BX, CX;计算字符串结尾地址
MOV BYTE PTR [BX], 0;在字符串尾部加0 RET SIN ENDP;-------;索引行初始化子程序 CLIST PROC MOV CX, CCOUNT JCXZ CSTX;文件为空结束
MOV SI,0;文件缓冲区字符指针
MOV DI,0;索引行指针
MOV DX,0;行数计数
MOV INDEX[DI], 0 INC DX;假设文件至少有一行 CST1: CMP WORD PTR ES:[SI], 0A0DH;判断是否为回车换行符
JNZ CST2;不是行结束,转CST2 INC DX;行数加一
ADD SI, 2;跳过回车换行符
ADD DI, 2;索引行指针加一
MOV INDEX[DI], SI;指向本行开始地址
CMP DX, MAXLEN JNC CST4;是否超过最大行,超过转CST4,结束
JMP CST3;CST2: INC SI;文件缓冲区字符指针指向下一字符 CST3: LOOP CST1;CST4: MOV LENCT, DX;保存行数到LENCT中 CSTX: RET CLIST ENDP;-------;清屏子程序
CLSCREEN PROC MOV AX, 0600H;清屏
MOV CX, 0 MOV DH, 50 MOV DL, 79 MOV BH, 07H INT 10H RET CLSCREEN ENDP;------;显示当前页子程序 SHOWCUR PROC MOV DH, 0;窗口最顶行
MOV SI, CURLINE;取当前页第一行行数
MOV CX, HS;窗口的第一行和最后一行为边框,SUB CX, 2;所以能够显示内容的高度为窗口高度减二 SC1:
CALL SHOWLINE;显示一行
INC DH;窗口下一行
INC SI;文件下一行
MOV AX, LENCT;CMP SI, AX;文件是否显示完
JNC SC2;显示完则转SC2 LOOP SC1 JMP SC1X SC2: JCXZ SC1X;该页显示满则结束
;该页没有显示满,则用空行填满该页 SC3: PUSH CX PUSH DX CALL SHOWSPLINE;显示空行
POP DX POP CX INC DH LOOP SC3 SC1X: RET SHOWCUR ENDP;------;显示一行子程序
;输入:SI=显示行行号;DH=窗口中的行号 SHOWLINE PROC PUSH CX PUSH SI PUSH DX PUSH AX
ADD DH, TOP;INC DH;实际行数=窗口左上角行数+DI+1 MOV DL, LEFT;INC DL;实际列数=窗口左上角列数+1 CALL VADD;
MOV CX, WS;窗口的第一列和最后一列是边框,SUB CX, 2;所以能够显示内容的宽度为窗口宽度减二
SHL SI, 1;行索引为字类型,所以乘二
MOV SI, INDEX[SI];取该行第一个字符在文件缓冲区的地址
PUSH DS MOV AX, 0B800H MOV DS, AX;DS指向显示缓冲区段地址 SL1: MOV AX, ES:[SI] CMP AX, 0A0DH JZ SL2;如果是回车换行,则该行结束
MOV DS: [DI], AL;显示一个字符 ADD DI, 2;INC SI;取下一个字符
LOOP SL1;JCXZ SLX;该行正好显示完,则结束,否则用空格填满
SL2: MOV BYTE PTR DS:[DI], ' ';该行没有显示满,则用空格填满
ADD DI, 2 LOOP SL2
SLX: POP DS
POP AX POP DX POP SI POP CX
RET SHOWLINE ENDP;--------;显示空行子程序
;输入:DI=窗口中的行号 SHOWSPLINE PROC;
MOV AX, HS;SUB AX, 2;CMP DH, AL;显示的空行是否超出最低行
JNC SSLX;如果是,则转SSLX ADD DH, TOP;INC DH;实际行数=窗口左上角行数+DI+1 MOV DL, LEFT;INC DL;实际列数=窗口左上角列数+1 CALL VADD;
MOV CX, WS;窗口的第一列和最后一列是边框,SUB CX, 2;所以能够显示内容的宽度为窗口宽度减二
PUSH DS MOV AX, 0B800H MOV DS, AX SSL1: MOV BYTE PTR DS:[DI], ' ' ADD DI, 2 LOOP SSL1 POP DS SSLX: RET SHOWSPLINE ENDP;-------;创建窗口子程序 CREWIN PROC PUSH ES MOV AX, 0B800H;显示缓冲区地址为B800:0 MOV ES, AX;
MOV DH, TOP MOV DL, LEFT;窗口左上角行列数
MOV CX, HS;窗口高度(行数)CW1: PUSH DX;CALL VADD;计算地址
PUSH CX;MOV CX, WS;窗口宽度(列数)
MOV AL, FG;取属性 CW2: MOV BYTE PTR ES:[DI], ' ';送空白字符
INC DI;MOV BYTE PTR ES:[DI], AL;送属性
INC DI;LOOP CW2;
POP CX POP DX INC DH;行数加一
LOOP CW1
CALL DRAWB;画边框
POP ES RET CREWIN ENDP;-;画边框子程序 DRAWB PROC PUSH DX PUSH CX PUSH BX PUSH AX MOV BL, FGB MOV DH, TOP MOV DL, LEFT CALL VADD
;画左上角角框
MOV BYTE PTR ES:[DI], 0C9H INC DI MOV BYTE PTR ES:[DI], BL INC DI
;画第一行边框
MOV CX, WS SUB CX,2 DB1: MOV BYTE PTR ES:[DI], 0CDH INC DI MOV BYTE PTR ES:[DI], BL INC DI LOOP DB1
;画右上角角框
MOV BYTE PTR ES:[DI], 0BBH INC DI MOV BYTE PTR ES:[DI], BL
;画第二行到倒数二行左右边框
MOV DH, TOP MOV DL, LEFT INC DH MOV CX, HS SUB CX, 2 DB2: PUSH DX CALL VADD MOV BYTE PTR ES:[DI], 0BAH INC DI MOV BYTE PTR ES:[DI], BL DEC DI MOV AX, WS DEC AX SHL AX, 1 ADD DI, AX MOV BYTE PTR ES:[DI], 0BAH INC DI MOV BYTE PTR ES:[DI], BL POP DX INC DH LOOP DB2;取边框属性;窗口左上角行列数;计算地址;角框╔;因为去掉了左右角框,所以宽度减二;上下边框═;角框╗;从第二行开始;第一行和最后一行没有左右边框,;所以高度减二;;计算左边框地址;左右边框║;;;;计算右边框地址;;下一行;
;画左下角角框
MOV DH, TOP;MOV DL, LEFT;MOV AX, HS;DEC AX;ADD DH, AL;左下角行数=右上角行数+窗口高度-1 CALL VADD MOV BYTE PTR ES:[DI], 0C8H;角框╚
INC DI MOV BYTE PTR ES:[DI], BL INC DI
;画最低行边框
MOV CX, WS;SUB CX, 2;因为去掉了左右角框,所以宽度减二 DB3: MOV BYTE PTR ES:[DI], 0CDH;上下边框═
INC DI MOV BYTE PTR ES:[DI], BL INC DI LOOP DB3
;画右下角角框
MOV BYTE PTR ES:[DI], 0BCH;角框╝
INC DI MOV BYTE PTR ES:[DI], BL
POP AX POP BX POP CX POP DX
RET DRAWB ENDP;------;计算窗口内某行列位置对应显存地址;输入:DH=行 DL=列;输出:DI为显存地址 VADD PROC MOV AL, 80;MUL DH;XOR DH, DH;ADD AX, DX;行数×80+列数
SHL AX, 1;乘2,因为每个字符占两个字节
MOV DI, AX RET VADD ENDP;--------;命令分析子程序 COMMAND PROC CMP AH, 2DH;2DH为x键的扫描码
JNZ COM1;不是x键,转COM1 STC;值x键标志
RET COM1: CALL DOSUB;转命令散转子程序
CLC RET COMMAND ENDP;--;命令散转子程序 DOSUB PROC MOV AL, AH MOV AH, 0;将键扫描码放入AX中
MOV BX, OFFSET KEYSUB;BX指向KEYSUB DOSUB1: CMP WORD PTR [BX], 0 JZ DOSUBX;KEYSUB表查完,即没有找到转DOSUBX CMP AX, [BX] JZ DOSUB2;找到扫描码转DOSUB2 ADD BX, 4 JMP DOSUB1;DOSUB2: ADD BX, 2 MOV BX, [BX];取处理程序入口地址
JMP BX;转处理程序 DOSUBX: RET
;SUB1和SUB2均为功能键处理程序;处理完后应使用JMP DOSSUBX结束
;上箭头键处理程序 SUB1: CMP CURLINE, 0 JZ SUB1X;已到第一行,结束
DEC CURLINE;向上一行
CALL SHOWCUR;显示当前页 SUB1X: JMP DOSUBX
;下箭头键处理程序 SUB2: MOV AX, LENCT DEC AX DEC AX;至少显示一行
CMP AX, CURLINE;已到最后一行
JZ SUB2X INC CURLINE;向下一行
CALL SHOWCUR;显示当前页 SUB2X: JMP DOSUBX
DOSUB ENDP;--------
CODE ENDS
;========================= END START
课程设计指导书课程名称: C语言程序设计 班次: 自动化2016-01,02,03班 设计任务:整个课程设计一共提供了10个题目,编号为1~10。按学号尾数进行选题设计。 课程设计目的1、进一......
WEB课程设计指导书设计课题:广东海洋大学寸金学院micro blog信息系统设计目的:1。综合应用java程序设计、WEB程序设计、数据库应用、计算机网络等知识设计和实现我校Micro Blo......
可视化程序设计课程设计指导书一、课程设计的目的与要求:1.掌握C++语言中面向对象的概念,并能在程序中熟练运用。2.了解面向对象程序设计(C++)的基本概念以及运用面向对象技术进......
C语言程序设计课程设计任务书项目4:高校工资管理系统一、课程设计项目:高校工资管理系统二、目的与要求:1、目的:(1)要求学生达到熟练掌握C++语言的基本知识和技能; (2)基本掌握面向......
《高级语言程序设计》课程设计教学大纲课程名称:高级语言程序设计课程设计课程总学时:32 适用专业:广播电视工程、电子信息工程、电子科学与技术课程类别:必修一、课程设计任务......