汇编语言程序设计报告

更新时间:2023-08-21 11:53:01 阅读量: 高等教育 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

目 录

目 录………………………………………………………………1 课程设计的目的…………………………………………………..2 课程设计的内容…………………………………………………..2 基本要求…………………………………..…………….…………2 具体内容…………………………………………….……………..2

第2题……………………………………………….……………..3

设计思想和实施方案……………………………….……………..3 程序清单和程序注释…………………………….………………..3 典型程序模块和典型编程技巧分析………….…………………..4 程序框图……………………………………….…………………..5

第3题…………………………………………….………………..6

设计思想和实施方案…………………………….………………..6 程序清单和程序注释……………………………….……………..6 典型程序模块和典型编程技巧分析…………….………………..9 程序框图…………………………………………….…………….10

第4题…………………………………………….……………….11

设计思想和实施方案…………………………….……………….11 程序清单和程序注释……………………………….…………….11 典型程序模块和典型编程技巧分析…………….……………….13 程序框图…………………………………………….…………….14 课程设计中遇到的问题及解决方法……………….…………….15 收获与体会………………………………………….…………….16

一.课程设计的目的:

课程设计是本科教学过程中的重要环节。本课程设计主要目的是使计算机专业学生深入学习汇编语言知识,进一步提高学生汇编语言综合变成能力和程序调试技能,锻炼运用汇编语言编程解决实际问题的能力。

二.课程设计的内容:

1.从键盘输入任意的十进制表达式,计算表达式的结果,并将该表达式及结果显示在屏幕上。(数值取值范围-32768~32767)

2.编写一个能与当前运行程序分时操作的生日程序,将当日生日同学的信息显示在屏幕的右上角。 3.在屏幕上开三个窗口:

(15,30 (15,70)

(22,65)

用“←”和“→”键选择左窗口或右窗口为当前活动窗口,从键盘输入字符,字符就会从当前活动窗口的最下行开始显示,同时也在下窗口显示。当一行字符显示满后(左右窗口一行显示20和字符,下窗口显示50个字符),窗口自动向上卷动一行,输入的字符仍显示于最低一行,窗口最高一行向上卷动后消失,输入命令串“END”后程序运行结束。

4.用汇编语言调用C语言实现:通过键盘输入对角线坐标,在屏幕上开设一个窗口,并设定热键控制窗口的颜色,要求屏幕上自上到下颜色由浅到深变化。

三.基本要求:

1.学生应任选择三题,经教师确认后进行课程设计。

2.学生应人真查阅资料,独立完成设计任务,每道题都必须上机通过。

3.学生应注重培养自己独立思考,综合分析问题解决问题和调试程序的能力。

4.按时完成课程设计,写出课程设计报告(报告要要用统一的报告纸写)。

四.具体内容:

本人编写的是第2,3,4题的程序,各程序具体内容如下:

第2题

1. 设计思想和实施方案:

这个程序要求在屏幕的右上角显示当日过生日的同学,这就要求要把一部分程序驻留在内存当中,从而即时的检测当日的日期,然后比较看看在这个日期下有没有同学过生日,有则打印在屏幕的右上角,没有就不显示。这就是这个程序的基本思想。

也就是说这个程序的关键就在于实现检测生日和显示生日的程序的驻留。要实现驻留,就需要使用中断,也就是在保留各寄存器的原始内容后,用sti开中断,然后进行比较和显示的操作,再用cli关中断,读回压入堆栈中各寄存器原来的数据,恢复中断现场。同时用install部分来控制中断的类型和决定驻留区的大小,这里设置为I/O设备中断向量。 2.程序清单和程序注释: code segment

assume cs:code,ds:code ;段定义 start: jmp install

msg db 'Today is birthday of Li',? ;定义要显示的字符串

old dd ? new:

push ax push bx push cx

push dx ;保留各寄存器原始内容 push si push di push es

sti ;中断标志置1,开中断 mov ah,2ah int 21h

cmp dh,1 ;比较月份 jnz case0

cmp dl,18 ;比较日期 jnz case0

mov ax,0b800h mov es,ax mov di,54*2d

lea si,msg ;把要输出的msg字符串置入si

case: mov al,cs:[si] inc si

or al,al ;判断是否为“?”作为显示结束的标志 jz case1

cld ;设置地址自动增量 stosb

inc di ;把字符串存入附加段中 jmp case ;跳转以实现逐个存入字符

case0:

mov ax, 0600h mov bh, 07h

mov cx, 002eh ;在屏幕右上角初始化窗口 mov dx,0279h int 10h

case1: cli ;中断标志置0,关中断 pop es pop di pop si

pop dx ;取回各寄存器的原始内容 pop cx pop bx pop ax

jmp cs:old ;指令回到old地址处

install: push cs ;通过install部分实现驻留 pop ds

mov ax,351ch ;取中断向量(al=中断类型) int 21h

mov word ptr old,bx ;存储bx和es内容到存储器old mov word ptr old+2,es lea dx,new

mov ax,251ch ;设置中断向量(al=中断类型号) int 21h

mov dx,offset install+120h ;通过dx设置驻留区的大小 mov cl,04h

shr dx,cl ;逻辑右移4位

mov ah,31h ;结束并驻留(al=返回码,dx=驻留区大小) int 21h code ends

end start ;程序结束

3.典型程序模块和典型编程技巧分析:

这个程序中关键是驻留的实现,这里驻留是通过保存现场,开关中断,恢复现场,设置中断类型,设置驻留区大小几个步骤实现的,这里开中断后只检测了是不是1月18号,如果是则显示是李的生日,不是则不显示。

另外,程序中的case0部分的作用是在屏幕的右上角初始化了一个显示窗口,用于显示当天过生日的同学。这里有CH,CL表示左上角的坐标,DH,DL表示右上角的坐标。

而case部分则是一种逐个输出字符的显示字符串的方法,用?作为字符串结束的标志,利用循环,每次输出一个字符,di加1,直到or al,al语句检测到?输出结束,跳出循环。 4.程序框图:

第3题:

1.设计思想和实施方案:

这个程序要求在屏幕上开3个窗口,在键盘输入字符的时候下面的第3个窗口始终显示,上面2个窗口用户可以选择一个显示,对于3个窗口当列数显示满时都会自动向上卷行。三个窗口显示字符和卷行的操作实际上是完全相同

的,现在还需要做的就是上面1,2两个窗口的切换问题,在这里,本人用“1”,“2”来作为2个窗口切换的功能键,也即当在2中显示时按1就转到了1窗口,当在1中显示时按2就转到了2窗口。另外,用ST1,ST2,ST3分别给3个窗口的输入字符计数,以及时的进行卷行操作。 2.程序清单和程序注释: DATA SEGMENT

ST1 DB 0 ST2 DB 0 ST3 DB 0 DATA ENDS

PROGNAM SEGMENT MAIN PROC FAR

ASSUME CS:PROGNAM,DS:DATA START:

PUSH DS SUB AX,AX PUSH AX

MOV AX,DATA MOV DS,AX

CALL CLEAR_SCREEN ;调用设置显示方式的子程序 MOV DI,0 ;置初始状态的DI为0

INPUT:

MOV AH,0

INT 16H ;从键盘读字符,存在AL中 CMP AL,'2'

JE YI ;设定如果按数字2键则跳转到在2号窗口操作 CMP AL,'1'

JE ER ;设定如果按数字1键则跳转到在1号窗口操作 CMP AL,0DH ;设定如果输入回车则结束程序 JE QUIT

CALL SHANG CALL XIA JMP INPUT YI:

MOV DI,1 ;这里置DI为1 JMP INPUT ER:

MOV DI,0 ;这里置DI为0 JMP INPUT

QUIT:

RET

MAIN ENDP

SHANG PROC NEAR

CMP DI,0 ;DI为0在1号窗口输入字符 JNE OUT3 MOV CL,ST1 ADD CL,10

MOV MOV MOV MOV INT

MOV MOV MOV MOV INT

INC CMP JL PUSH MOV MOV MOV MOV MOV MOV MOV MOV INT

POP

OUT2:

JMP OUT3:

MOV ADD

MOV AH,2 DH,15 DL,CL BH,0

10H AH,0EH

BH,0 BL,70H CX,1

10H ST1 ST1, 20 OUT2

AX ST1,0 AH,6

AL,1 CH,5

CL,10 DH,15

DL,30 BH,7 10H AX EXIT CL,ST2 CL,50 AH,2

;置光标位置1号窗口中 ;BH表示页号 ;BL置前景色 ;显示AH中的字符在光标位置;ST1计在窗口1输入字符数目 20则继续输入 ;存储AX的初始植 ;表示屏幕上卷一行 ;CH,CL表示左上角坐标 ;DH,DL表示右上角坐标

;实现字符显示上卷一行 ;如果字符数小于

MOV DL,CL MOV BH,0

INT 10H ;置光标在2号窗口中

MOV AH,0EH

MOV BH,0 ;BH表示页号 MOV BL,70H ;BL置前景色 MOV CX,1

INT 10H

INC ST2 CMP ST2 , 20 JL OUT1 PUSH AX MOV ST2,0 MOV AH,6

MOV AL,1 MOV CH,5

MOV CL,50 MOV DH,15

MOV DL,70 MOV BH,7 INT 10H

POP AX OUT1: EXIT: RET

SHANG ENDP

XIA PROC NEAR MOV CL,ST3 ADD CL,15

MOV AH,2 MOV DH,22 MOV DL,CL MOV BH,0

INT 10H

MOV AH,0EH

MOV BH,0 MOV BL,70H ;显示AH中的字符在光标位置 ST2计在窗口2输入字符数目 ;如果字符数小于20则继续输入 ;表示屏幕上卷一行 ;CH,CL表示左上角坐标 ;DH,DL表示右上角坐标

;实现字符显示上卷一行 ;读出AX的原值 ;在1,2窗口显示字符子程序结束 ;置光标在3号窗口中 ;BH表示页号 ;BL置前景色

INT 10H

INC ST3 ;ST3计在窗口2输入字符数目 CMP ST3, 50 ;如果字符数小于50则继续输入 JL EXT MOV ST3,0 MOV AH,6

MOV AL,1 ;表示屏幕上卷一行 MOV CH,18

MOV CL,15 ;CH,CL表示左上角坐标 MOV DH,22

MOV DL,65 ;DH,DL表示右上角坐标 MOV BH,7

INT 10H ;实现字符显示上卷一行 EXT: RET

XIA ENDP

CLEAR_SCREEN PROC NEAR ;设置显示方式和光标初始位置的子程序 PUSH AX

PUSH BX ;保存寄存器的原始内容 PUSH CX PUSH DX

MOV AX,0003H

INT 10H ;设置显示方式为80X25 16色文本 MOV DX,0 MOV AH,2

INT 10H ;置光标位置为(0,0) POP DX

POP CX ;取出寄存器的原内容 POP BX POP AX RET

CLEAR_SCREEN ENDP

PROGNAM ENDS

END START ;程序结束 3.典型程序模块和典型编程技巧分析:

在这个程序里,显示字符主要涉及的就是卷行操作,INT 10h,AH=6时有AL为上卷行数,BH为卷入行属性,CH/CL表示左上角行/列号,DH/DL=右上角行/列。此处用ST1,ST2,ST3分别做3个窗口显示字符数的计数器,以在正确的时候进行卷行操作。

在这个程序中控制光标的位置和窗口顶点位置的部分也是图形控制和在适当位置显示字符等操作中很有用的编程技巧。

4.程序框图:

第4题:

1. 设计思想和实施方案:

在这个程序中要实现按键控制一个窗口的颜色变化,同时还要使窗口的背景自下到上颜色由浅到深变化,设置显示方式为320x200 256色图形,也就是说满屏是320列200行,在输出背景图时,就用到这组数据,每13行颜色值加1,就可以实现由浅到深的变化。 在实现象素显示的时候,用了write子程序,知道了对角线的坐标(x1,y1),(x2,y2),就可以把这个方形窗口区域逐个象素的上色。

另外,在实现窗口颜色变化的时候,通过键盘输入一个字符,检测如果字符为回车则跳出,结束程序,如果是其他任意字符,则颜色值加1,也就是说除去回车键以外,其他任意键按一次,窗口的颜色就变化1次。 2.程序清单和程序注释: data segment

buff dw 20 dup(?) x1 dw ?

y1 dw ? ;定义存储单元 x2 dw ? y2 dw ? data ends

;---------------------------- code segment

;---------------------------- main proc far

assume cs:code,ds:data

start: push ds

sub ax,ax ;ax置0 push ax mov ax,data mov ds,ax

;---------------------------- mov ah,0 mov al,13h

int 10h call bj

mov x1,0 mov y1,0 mov x2,70 mov y2,70 mov al,01h

call write loop1:

push ax mov ah,0

int 16h cmp al,0dh

je exit pop ax inc al call write jmp loop1 mov ah,0 exit:

mov aX,0003

int 10h ret

main endp

;--------------------------- bj proc near mov dx,0

mov al,0 push bx mov bx,0 mov al, 1fh

case1:

;设置显示方式为320x200 256色图形(VGA) ;设置变色窗口的顶点坐标 ;输出变色窗口的颜色 ;存储原来的ax ;从键盘输入任意字符 ;如果输入的是回车则跳出 ;调出原来的ax ;颜色值加1 ;读光标位置 ;把dx,al置0

;存储bx原来的值

cmp bx,13 ;每13行改变一次颜色 jl case2

dec al ;颜色值减1 mov bx,0

case2:

mov cx,0

rotate:

mov ah,0ch ;显示渐变背景的部分 int 10h inc cx

cmp cx,320 ;0到320列写像素 jl rotate add dx,1 inc bx

cmp dx,200 ;0到200行写像素 jl case1

pop bx ;读取bx原来的值 ret

bj endp

;----------------------------

write proc near ;在方形区域显示像素的子程序 mov dx,y1 line:

mov cx,x1 point:

mov ah,0ch

int 10h ;在(x1,y1)点上写像素 inc cx ;向左移动一列

cmp cx,x2 ;cx小于x2的时候继续写像素 jl point

inc dx ;向下移动一行

cmp dx,y2 ;dx小于y2的时候继续写像素 jl line ret

write endp

;--------------------------- code ends

end start ;结束程序

3.典型程序模块和典型编程技巧分析:

在这个程序里,在实现背景颜色渐变的时候,需要设置每多少行使颜色变化一次,这里本人的程序中用的值13是多次实验得出的最好显示效果的,如果更多或更少行,则可能会显示出彩色的条纹,不符合题目的要求。

另外,利用(x1,y1)和(x2,y2)来限定一个窗口,以对其进行上色等操作,也是图形编程中经常用到的一种手法。 4.程序框图:

五.课程设计中遇到的问题及解决方法:

在第二题中,设置中断类型和驻留区大小的install部分比较难于实现,其

实本人是第一次接触驻留这个概念,在以往的编程中,基本所有程序都是即时运行,即时结束的,并没有驻留到内存中,以时刻调用的例子。因而,一开始很不知该如何下手,后来在网上查阅了一些信息,了解了驻留的实现其实就是一个中断控制的过程,实际上install这部分程序也是原版引用的一份资料中的内容。可以说这部分是实现驻留必不可少的。

在第四题中,要求背景的颜色是渐变的,而一开始设置多少行颜色变化一次就成了一个问题,本人实验了许多组数值,最后发现只有当13行变化一次的时候背景显示的效果最好,完全是灰度色彩变化。如果大一些或这小一些,都会使屏幕上出现彩色的条纹,也就不再是严格定义上的色彩由浅到深变化了。

还有,在第三题和第四题中,其实都涉及到了在窗口显示字符或像素点的问题,起初这对于我来说也是很陌生的,对于如何开设窗口,如何控制卷行,如何逐行逐列的显示像素点又控制在所要求的窗口中,这些问题起初都很让我为难,后来对这部分进行了相对进一步的学习和研究,也就有了一点浅显的认识,又经过多次实验调试,终于实现了这些窗口中的操作。其实,这种课程设计的过程也就是一种学习的过程,如果真的认真的去完成每一步程序,每一条指令,一定会颇为受益的。

六.收获与体会:

这次汇编语言的课程设计虽然说内容并不是很多,只是从四道题目中任选

三道编写程序而已,但还是很有收获的。在这几道题目中,有很多我以前根本就没有接触到过的东西,如程序的驻留,DOS环境下窗口的显示等….....因而在写程序的过程中还是遇到了很多问题的,但通过在网上查阅资料,和同学一起讨论研究,最终还是写出了我认为可以算是不错的程序。而这些查资料和讨论的过程本身就是一种学习和提高的过程,完成了程序的编写后,回过头来再看看,觉得自己对汇编语言的认识真的在一定程度上加深了,而且也了解了许多新的知识领域里的问题。几天的辛苦没有白费。

本文来源:https://www.bwwdw.com/article/98yi.html

Top