汇编语言程序设计22578_第1页
汇编语言程序设计22578_第2页
汇编语言程序设计22578_第3页
汇编语言程序设计22578_第4页
汇编语言程序设计22578_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、汇编语言程序设计上机实验一、 设计课题名称及要求本次上机实验一共有三项的内容及要求如下:1、在屏幕上开出三个窗口:(5,10)(5,50)(15,30)(15,70)(18,15)(22,65) 用“ ”和“ ”键选择左窗口或右窗口为当前活动窗口,从键盘输入字符,字符就会从当前活动窗口的最下行开始显示,同时也在下窗口显示。当一行字符显示满后(左右窗口一行显示20个字符,下窗口显示50个字符),窗口自动向上卷动一行,输入的字符仍显示于最低一行,窗口最高一行向上卷动后消失,按ESC键程序运行结束。2、用递归的方法求斐波那契数的第24项(N=24),并将结果用十进制显示出来(要求:显示用宏实现)。斐

2、波那契函数FIB(N)的定义为: 程序输出FIB(24)的值。3、请编制程序PROG1.ASM, 其功能是: 内存中连续存放着16个十六位二进制数,在原16个数的第4和第5个数之间插入00FFH,在原16个数的第8和第9个数之间插入FF00H,在原16个数的第12和第13个数之间插入55AAH, 在原16个数的最后加入AA55H。将按上述方法插入4个数后得到的20个数存入内存中。 例如: 内存中有 1020H,2002H,3033H,4440H,5008H,8FF8H (共16个字) 结果为 1020H,2002H,3033H,4440H,00FFH,5008H,8FF8H,AA55H(共20

3、个字)二、 设计思想和实施方案论述课题1:因为教学书中有功能类似程序(例9.13),所以在设计第一个程序中,大部分的想法还是模仿该例题。但与例题不同之处是,这个程序要实现同时两个窗口的字符输出。也就是说光标位的记录将会比例题中一个窗口的复杂很多。在程序设计的过程中,可以先调试一个窗口的输出,并能完成上卷功能;再到两个窗口左右分布,并能根据左右键的输入改变光标位,进行输入操作;最后完成三个窗口的功能。课题2:利用递归算法,将程序功能实现。由于可能会出现数据溢出,所以直接使用EAX的操作将能避免溢出的情况。课题3:插入操作可以有很多种方法实现,由于程序要求中没有严格规定,所以我使用的是增加一个数列

4、的空间,将数据依次填入该空间内。以空间的开销,换取运算时间上的优势。三、 课程设计中遇到的问题及解决方法在编写第一个三窗口显示这个程序过程中就遇到了不少麻烦!一开始,就碰到了在做程序前没有学过的显示I/O,虽然课上老师反复重复着:“其实这三道题目里面,最简单的是第一题!”但是当自己实际操作时,感觉并不是那么容易。经过一段时间的思考和审题后,决定先从第三项课题下手,再是第二项,最后再做第一项。在做第三个程序的过程中发现虽然在插入操作中并没有遇到太多问题,但是总是不能查看结果,要看结果,还非得debug-t到结束再用-d命令,查看内存中的数据结果,于是多花了一点时间,在程序的末尾加了一段COMVE

5、RT HEX TO ASC,终于自我较为满意地完成了TASK3。第二个程序的编写遇到了子程序自身递归调用边界问题,经常是虽然编译工具没有检查出错误,但是不能编译、不能产生目标文件,后来经过不断的debug-t发现有运算边界上的错误,导致死循环,所以不能生成目标文件。在经过了前两个程序的考验后,再来做这个大部分人都望而生畏的TASK1。我在后来的课程学习过程中也慢慢了解了不少显示I/O操作,并在教材中发现了一个与这项课程有着极其相似的小程序。敲入代码后,却仍然不能运行,后来发现主要是INCLUDE这出了问题。于是把CLS.INC 中的代码当作子程序加到该程序后面,问题解决。在运行书中例题的时候我

6、发现一处BUG当我输入的是“ENTER”的时候,光标会换到下一行,并且是0光标位,继续输入,是在那个光标之后直至一行小窗口的字符数后(即例题中的20)才能回到原小窗口。我认为是MOV AH,1INT 21H这里出的问题,直接输出键盘字符,会导致上述的问题出现,于是改用mov ah,0ah ; mov bh,0 mov cx,1 int 10h 替代之前的MOV AH,1INT 21H经过调试,果然解决了这个BUG。再后来的两窗口,三窗口输出过程中,唯一困扰到我的就是光标的移动问题,需要的是不断的调试修改。后来再仔细想了一想,其实光标的操作并不难。一口气将它解决!四、 收获与体会通过这次的课程设

7、计,我了解到,一些细节对于编程的认识相当重要的,其一:良好的文档习惯,良好的文档是正规研发流程中非常重要的环节,作为代码程序员,大部分的时间都是用来写代码写文档的。要是缺乏良好的文档管理习惯,一个软件系统就缺乏生命力,在未来的查错,升级以及模块的复用时就都会遇到极大的麻烦。其二,在这次的课程设计中,我还了解到程序的模块化设计的重要性。当一个较大的程序任务放在你面前的时候,如果能把这一项任务很好的分成几部分模块,就能大大减少任务的困难程度,缩减程序开发时间,同时,一些重复性工作就成了完全可以避免的了。再者,良好的测试能力。这分为两方面,一,在写完程序之后,经常会遇到各种我们预期之外的结果情况,在

8、这种时候就需要程序员不断的反复调试,修改程序代码,最终得到预期结果。第二方面,是程序在非正常输入的时候的解决能力(也就是上数据结构时,老师说的程序的健壮性)。最后,就是学习和总结的能力。虽然说在开始编程前,我对任务中TASK1没有丝毫的解决能力,但是通过后来的学习和查阅资料,最终能够将任务较好的完成。因为课程设计的时间较短,程序中仍然有很多不足之处,但在这次的课程设计中,我已经学到了很多单纯在课堂中没有学到的东西。五、 程序流程图,程序清单和程序注释a) 课题1程序清单和程序注释ROW FULL?STARTINITIALISE DATALEFT WIN SHOWRIGHT WIN SHOWIN

9、C LCURINC RCURREAD FORM KEYBOARDDOWN WIN SHOWROW UPINITIAL CUREXITEND;*dseg segment cury db 15 curx db 50 lluy db 5 llux db 10 lrdy db 15 lrdx db 30 rluy db 5 rlux db 50 rrdy db 15 rrdx db 70 dluy db 18 dlux db 15 drdy db 22 drdx db 65 lx db 10 ly db 15 rx db 50 ry db 15 dwx db 15 dwy db 22 ulrow db

10、 0 ulcol db 0 lrrow db 0 lrcol db 0 dseg ends ;*clear macro a,b,c,d ;宏定义窗口mov ah,6 mov al,0 mov ch,a mov cl,b mov dh,c mov dl,d mov bh,7 int 10h endm scroll macro cont,ulrow,ulcol,lrrow,lrcol ;宏定义卷窗口操作mov ah,6 mov al,cont mov ch,ulrow mov cl,ulcol mov dh,lrrow mov dl,lrcol mov bh,70h int 10h endm po

11、stc macro y,x ;置光标位mov ah,2 mov dh,y mov dl,x mov bh,0 int 10h endm ;*cseg segment assume cs:cseg,ds:dseg main proc far push ds sub ax,ax push ax mov ax,dseg mov ds,ax clear 0,0,24,79 ;清屏scroll 10,5,10,15,30 ;开出三个窗口scroll 10,5,50,15,70 scroll 4,18,15,22,65 postc cury,curx input: mov ah,0 ;从键盘读入int 1

12、6h cmp ah,4bh ;is leftjnz right push ax ;保存axmov al,cury ;改动各光标位mov ry,al mov al,curx mov rx,al mov al,ly mov cury,al mov al,lx mov curx,al pop ax postc cury,curx jmp input right: cmp ah,4dh ;is rightjnz left push ax ;保存光标位mov al,cury mov ly,al mov al,curx mov lx,al mov al,ry mov cury,al mov al,rx m

13、ov curx,al pop ax postc cury,curx jmp input left: cmp ah,01 ;is ESCjnz display ;if no then displayret ;if yes then exitdisplay: mov ah,0ah ;在光标位显示字符mov bh,0 mov cx,1 int 10h inc curx ;cur mov rightpostc dwy,dwx ;置下窗口光标mov ah,0ah ;在光标位显示字符mov bh,0 mov cx,1 int 10h inc dwx ; mov cur positiongcmp dwx,6

14、5 ;line ja down ;postc cury,curx ;mov al,curx;查看是否满行cmp al,30 ; left winjle next cmp al,50 ;right winjle next2 cmp al,70 ;down winjle next ja next3 next2: scroll 1,5,10,15,30 ;scroll left win mov cury,15 mov curx,10 jmp next next3: scroll 1,5,50,15,70 ;scroll right winmov cury,15 mov curx,50 next: ;

15、post curpostc cury,curx jmp input down: scroll 1,18,15,22,65 ;scroll down winmov dwx,15 postc cury,curx jmp input main endp cseg ends ;*end mainb) 课题2程序清单和程序注释 .model small .386 .stack 100h .data oper1 dd 0h oper0 dd 0h n dw 0ah displaymacro mov eax , ebx mov edx , 0h div ecx mov ebx , edx mov dl ,

16、al endm ;* .code ;-mainprocfarstart: push ds xor ax , ax mov ax , data mov ds , axrotate1: mov esi , 2h ;初始化数据 xor ebx , ebx xor eax , eax mov ebx , 0hrotate2:mov eax , ebx mul n mov bx , ax mov ah , 0 ;get number int 16h cmp ax, 011bh; is esc je exit ;then exit sub al , 30h ;ASC TO DEC cmp al, 0ah;

17、 jg exit ;非数字则退出 add ebx , eax dec esi cmp esi , 0 jnz rotate2 and ebx , 000000ffh;清除BX 高位 mov ecx , ebx xor edx , edx xor eax , eax;- call fib ;调用斐波那契子程序;- mov ebx , edx xor eax , eax mov si , 8 mov oper0 , 0ah mov ecx , 10000000doutputs:DISPLAY;-print DL add dl , 30h mov ah , 02h int 21h mov edx ,

18、 0 mov eax , ecx div oper0 mov ecx , eax dec si cmp si , 0 jg outputs mov dl , 0ah mov ah , 02 int 21h mov dl , 0dh mov ah , 02 int 21h jmp rotate1 exit: mov ah , 004ch int 21h main endp;=fibprocnear ;斐波那契子程序 cmp ecx , 0h jz ff1 cmp ecx , 1h jz ff2 dec ecx call fib ;自身递归调用 jmp largeff1: mov oper0 ,

19、0h ;fib(0) mov oper1 , 1h mov eax , 0h mov edx , 1 jmp quitff2:mov oper0 , 1 ;fib(1) mov oper1 , 1 mov eax , 0 mov edx , 1 jmp quit large:mov eax , oper0 add eax , oper1 mov edx , eax mov eax , oper1 mov oper0 , eax mov oper1 , edx quit: ret fib endp ;*end start STARTGET NUM FROM KEYBOARDIS NUM?ESCE

20、XITCHG ASCTO HEX CALL FIBDISPLAYFIB HERE=1/=0/1FIB(0)=1FIB(1)=1RETDEC ECXCALL FIBSAVE RESULTENDc) 课题3程序清单和程序注释data segment array1 dw 1010h,1020h,1030h,1040h,1050h,1060h,1070h,1080h,1090h,1200h,1210h,1220h,1230h,1040h,1250h,1260h array2 dw 00ffh,0ff00h,55aah,0aa55h array3 dw 20 DUP (?),0dh,0ah,$ flag

21、 db ?data endsprogram segmentmain proc far assume cs:program,ds:datastart: push ds sub ax,ax push ax mov ax, data mov ds, ax;- mov bx,0; initial all data mov si,0 mov cx,20 mov flag,0 next: cmp flag,4;mov 4 Num finished je insert mov ax,array1bx;mov ARRAY1 to ARRAY3 mov array3bxsi,ax inc flag ;finish one movement inc bx;mov cur to next Num inc bx jmp short re

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论