西安财经学院 信息学院
《汇编语言程序设计》 实验报告
实验名综合实验程序设计 实验室 实验日期 20##-12-15
一、实验目的及要求
1.悉debug命令,学习汇编语言的调试环境;
2.熟练撑握一些简单程序的调试,理解基本的顺序结构、分支结构、循环结构及子程序的调试过程;
3.通过对一些综合程序的调试,加深对各种结构程序的理与学习掌握汇给语言编程思想。
二、实验环境
硬件环境:一台微型计算机;
软件环境:windows xp,debug环境,masm。
三、实验内容
人名排序程序。先从终端键入最多30个人名,当所有人名都进入后,按字母上升的次序排序,并在屏幕上显示已经排好序的人名。
四、设计:
设计思想:通过运用计算机汇编语言指令系统,将我们所要表达的语言转换成机器指令,任其识别。
这是一个在使用子程序为主的基础上,综合应用顺序结构、循环结构和分支等结构的程序,以实现从键盘终端输入的人名按字母上升的次序排序。它们的过程和功能如下:
1.B10READ 接收键入的人名存放在NAMEPAR中,并用空格符清除其后的单元;
2.D10STOR 把人名从NAMEPAR 传送到NAMETAB中,并用NAMECTR计数;
3.G10SORT 用气泡排序算法对人名排序,并用SWAPPED作为交换的标志控制循环结束。其中用调用子程序H10XCHG来交换两个人名串的位置,并设置SWAPPED标志。
4.K10DISP 显示已经排序好了的人名。
人名排序的程序实现图1:
图1
五、调试与测试
1.由于masm5程序安装于D,改变工作目录于D盘环境下;
2.用MASM程序把ASM文件转换成OBJ文件;
3.用LINK程序把OBJ文件转换成EXE文件;
4.用DEBUG 命令调试程序;
5.用U命令返汇编;
6.用单步执行命令t,逐步实现数据段及代码段的初始化;
7.将数据据段的地址赋给DI指针寄存器,并用单步执行命令T按顺序执行程序的下一步指令,调用地址为0039的程序段b10read程序段,为实现名字的输入与输出操作;
8.用u命令返汇编,找出将要执行的程序段,用g命令一步执行地址为0039到0047
之间和程序段,显示数据段中messg1的内容即字符串Name?;
9.继续返汇编,执行程序段0047到0041完成第一个名字的输入,输入名字zhanglina,ret返回到DOS系统下,程序在调用前的地址,用T命令继续下一条指令,比较输入字符和长度和0的大小;
10.若相等,则跳到a30程序段,执行无字符输入时的程序。由于输入的字符个数为9(从数据段DS中的0001单元可以得到),然后比较所输入的名字的个数与所设的名字的最多个数30的大小;
11.由于输入名字的个数为9小于最大字符串长度30,调用d10store程序段对输入的字符个数进行计数;
12.无条件跳转到a20loop程序段;
13.继续调用b10read程序段,实现名字的继续输入;
14.返汇编输入下一个名字yingtianzi;
15.同样进行字符串长度10(即DS:0001=0A)与0的比较,根据所输入的字符串再选择相应和操作;
16.比较所输入的名字的个数,是否达到所设的名字最大个数字30;
17.对所输入的名字操作完成之后,调用程序段对所输d10stor入的名字进行计数;
18.继续调用输入名字程序段b10read,名字未输完,继续输入名字;
19.用G命令一步执行输入名字为:duanxiangxiang,并将最终的结果显示出来;
20.比较所输入字符串的长度,是否为0,若不为0,则进行字符个数的比较;字符串的长度为0,则执行无字符输入时的程序段,由数据段得知所输入的字符串长度为14。
21.由于所输入的字符串长度不为0,则进行比较所输入的名字的个数是否达到所设的最大个数30;由数据段所得已经有两个名字被计数;
22. 继续调用d10stor程序段进行名字个数的计数。
23.调用b10read程序段,输入并显示字符串;
24.循环多次输入字符串,即输入多个人名字;
25.用D命令查看所输入的字符串;
26.用U命令返汇编,对所输入的名字进行排序并输出,程序正常结束;
五、[源程序清单]
Data segment
namepar label byte
maxnlen db 21
namelen db ?
namefld db 21 dup(?)
crlf db 13,10,'$'
endaddr dw ?
messg1 db 'name?','$'
messg2 db 'sorted names',13,10,'$'
namectr db 0
nametab db 30 dup (20 dup(' '))
namesav db 20 dup (?),13,10,'$'
swapped db 0
Data ends
Code segment
main proc far
assume cs:code,ds:data,es:data
start: push ds
mov ax,0
push ax
mov ax,data
mov ds,ax
mov es,ax
cld
lea di,nametab
a20loop:
call b10read
cmp namelen,0
jz a30
cmp namectr,30
je a30
call d10stor
jmp a20loop
a30: cmp namectr,1
jbe a40
call g10sort
call k10disp
a40: mov ax,4c00h
Int 21h
Main endp
b10read proc near
mov ah,09
lea dx ,messg1
int 21h
mov ah,0ah
lea dx,namepar
int 21h
mov ah,09
lea dx,crlf
int 21h
mov bh,0
mov bl ,namelen
mov cx,21
sub cx,bx
b20: mov namefld[bx],20h
inc bx
loop b20
ret
b10read endp
d10stor proc near
inc namectr
cld
lea si,namefld
mov cx,10
rep movsw
ret
d10stor endp
g10sort proc near
sub di ,40
mov endaddr,di
g20: mov swapped,0
lea si,nametab
g30: mov cx,20
mov di,si
add di,20
mov ax,di
mov bx,si
repe cmpsb
jbe g40
call h10xchg
g40: mov si,ax
cmp si,endaddr
jbe g30
cmp swapped,0
jnz g20
ret
g10sort endp
h10xchg proc near
mov cx,10
lea di , namesav
mov si,bx
rep movsw
mov cx,10
mov di,bx
rep movsw
mov cx ,10
lea si,namesav
rep movsw
mov swapped,1
ret
h10xchg endp
k10disp proc near
mov ah,09
lea dx,messg2
int 21h
lea si,nametab
k20: lea di,namesav
mov cx,10
rep movsw
mov ah,9
lea dx, namesav
int 21h
dec namectr
jnz k20
ret
K10disp endp
code ends
end start
六.总结
1.通过课程设计的编程和对编程过程中遇到的问题的思考,有效的提高了我对汇编的认识和理解,切实的提高了我的编程能力,补全了我的不足。
2.通过这次课程设计,我巩固所了学过的知识,能用汇编语言熟练地运用顺序、选择、循环、分支、子程序等结构,进一步掌握了各个指令的功能,特别是转向指令,掌握了子程序的定义及调用,以及正确地运用DEBUG指令。
3.在整个程序的编写中,调试占了很大部分的时间。要想写好汇编语言的程序,必须认真对待代码的每一个细节,还必须熟练的掌握debug命令,这对程序的调试是非常重要的。通过这次实际动手能力的培养,我进一步熟悉了汇编语言的结构和使用方法,基本达到了能独立阅读和调试一定规模的汇编语言程序的水平。
第二篇:汇编语言实验指导书
汇编语言实验指导书
前 言
汇编语言是计算机专业的一门重要的专业基础课,主要介绍汇编语言程序设计的基本原理和方法。汇编语言是一门理论性和实践性较强的课程,辅助课堂教学的实验有助于帮助学生理解汇编语言的基本原理,锻炼学生的动手能力,提高学生的综合应用知识的能力。
本实验指导书按照汇编语言程序设计的教学大纲要求编写。依据循序渐进、由浅入深的规律,通过实例复习巩固所学知识,借助实例开展汇编语言程序设计。通过这种既具有构造性又具有创造性的学习活动,更便于初学者的理解和掌握,通过上机实验,并在实验后完成实验报告,又能进一步加深和拓宽所学知识。为了帮助老师和学生开展实验,我们特编了这本实验指导书,希望能对我校的《汇编语言》教学工作有所帮助。
本实验指导书所有实例均在PC机上调试通过。
目 录
实验1 利用DEBUG调试汇编语言程序段………………………………………54
实验4 汇编语言程序上机过程 63
实验5 分支程序实验……………………………………………………………...65
实验6 循环程序实验……………………………………………………………...68
实验7 子程序实验…………………………………………………………… ….69
实验8 字符处理程序实验…………………………………………………………73
实验9 排序程序设计 77
实验1 利用DEBUG调试汇编语言程序段
一.实验目的
1.熟悉DEBUG有关命令的使用方法;
2.利用DEBUG掌握有关指令的功能;
3.利用DEBUG运行简单的程序段。
二.实验内容
1.进入和退出DEBUG程序;
2.学会DEBUG中的D命令、E命令、R命令、T命令、A命令、G命令等的使用。对于U命令、N命令、W命令等,也应该试用一下;
3.用DEBUG,验证乘法、除法、加法、减法、带进位加、带借位减、堆栈操作指令、串操作指令的功能。
三.实验要求
1.仔细阅读有关DEBUG命令的内容,对有关命令,要求事先准备好使用的例子;
2.作为例子,准备用A命令,输入在显示器上显示字符“$”的系统调用程序段;
3.编写将AX左移9位的程序段。
四.实验环境
PC微机
DOS操作系统或 Windows 操作系统
MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境
五.实验步骤
1.在DOS提示符下,进入DEBUG程序;
2.在DOS目录下启动DEBUG;
3.详细记录每一步所用的命令,以及查看结果的方法和具体结果。
六.实验报告要求
1.如何启动和退出DEBUG程序;
2.整理每个DEBUG命令使用的方法,实际示例及执行结果。
七.思考题
启动DEBUG后,要装入某一个.EXE文件,应通过什么方法实现?
实验2 初级程序的编写与调试实验(一)
一.实验目的
1.进一步熟悉DEBUG命令;
2.掌握数据在内存中的存放方式和内存操作数的几种寻址方式,段寄存器和物理地址计算;
3.熟悉数据传送指令、算术运算指令、逻辑指令、数据串传送程序和数据串传送指令MOVS、STOS及重复前辍REP;
4.掌握简单的汇编语言程序编写与调试。
二.实验内容
1.内存操作数及各种寻址方式使用;
2.求累加和程序;
3.多字节加法程序;
4.数据串搬家程序;
5.段寄存器概念及字符串传送指令练习。
三.实验要求
1.仔细阅读有关DEBUG命令的内容,对有关命令,要求事先准备好使用的例子;
2.阅读数据传送指令、算术运算指令、逻辑指令、数据串传送程序和数据串传送指令MOVS、STOS及重复前辍REP的内容;
3.用DEBUG的有关命令调试本实验中的求累加和程序、多字节加法程序、数据串搬家程序段。
四.实验环境
PC微机;
DOS操作系统或 Windows 操作系统;
MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境。
五.实验步骤
1.内存操作数及各种寻址方式使用
MOV AX,1234
MOV [1000],AX
MOV BX,1002
MOV BYTE PTR[BX],20
MOV DL,39
INC BX
MOV [BX],DL
DEC DL
MOV SI,3
MOV [BX+SI],DL
MOV [BX+SI+1],DL
MOV WORD PTR[BX+SI+2],2846
步骤:
(1) 用A命令键入上述程序,并用T命令逐条运行。
(2) 每运行一条有关内存操作数的指令,要用D命令检查并记录有关内存单元的内容并注明是什么寻址方式。
注意D命令显示结果中右边的ASCII字符及双字节数存放法。
2.求累加和程序:
程序:
MOV BX,1000
MOV CX,10
SUB AX,AX
LOP: ADD AL,[BX]
ADC AH,0
INC BX
J: LOOP LOP
INT3
步骤:
(1)用A命令将程序键入到100H开始的内存中,在键入时记下标号LOP和J的实际地址,在键入LOOP指令时LOP用实际地址值代替;
(2)用命令N AA 将此程序命名为文件AA(文件名可任取);
(3)用R命令将BX:CX改为程序长度值(即最后一条指令后面的地址减去开始地址;
(4)用命令W 100将此程序存到AA命名的磁盘文件中;
(5)用命令Q退出DEBUG;
(6)用命令DEBUG AA再次调入DEBUG和文件AA,可用U命令检查调入程序;
若调入DEBUG时忘了加AA文件名,可用N命令和L命令将文件调入;
(7)用E命令在内存地址1000H处键入16个数字;
(8)用命令G=100 J(J用实际地址代替),使程序运行并停在断点J上,检查AX,BX的值是否符合你的预计值;
(9)用T命令运行一步,观察程序方向(IP值)和CX值是否与你的估计一样,若不一样,检查程序是否有错;
(10)重复G、J与T,再检查AX是否正确;
(11)用G命令使程序运行到结束,检查AX值是否正确。
3.多字节加法程序
程序:
MOV DI,1000
MOV CX,8
MOV SI,2000
CLC
LOP: MOV AL,[SI]
ADC [DI],AL
INC SI
INC DI
LOOP LOP
INT 20
步骤:
(1) 用命令键入此程序
(2) 用E命令在1000H开始处键入一个8字节被加数,在2000H开始处键入一个8字节加数,均为低字节在前面。
4.数据串搬家程序
(1)用A命令键入下列程序:
MOV SI,1000
MOV DI,1500
MOV CX,0FH
LOP:MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
LOOP LOP
INT 20
(2)用A命令DB伪指令在1000H键入下列字符串:
‘IBM_PC COMPUTER'
(3)用G命令运行此程序,并用D命令检查目的地址处的字符与源串是否一致。
5.段寄存器概念及字符串传送指令练习
(1) 用A命令键入下列程序:
MOV SI,0
MOV DI,0
MOV AX,1000
MOV DS,AX
MOV AX,1500
MOV ES,AX
MOV CX,0F
CLD
REP MOVSB
INT 20
(2) 用A命令DB伪指令在1000:0000处键入字符串'IBM_PC COMPUTER',并用D命检查之
(3) 用D命令检查0F00:1000处内容,看是否一样。为什么?
(4) 用G命令运行此程序,检查目的地址1500:0000处内容。并记下DS与ES值。
(5) 修改此程序,使ES与DS为同一值,以减少一条指令,而源物理地址和目的物理地址(是多少?)仍和原来一样。
6.自编程序
用16位减法指令编一个32位(4字节)数减法程序,两个源数及结果存放地址同多字节加法程序,调试并做记录。
六.实验报告要求
1.各项实验记录;
2.要求你修改的程序的清单(修改后)和调试记录;
3.自编程序原稿及调试后修正稿,写出原稿错在那里。
七.思考题
1.MOV BYTE PTR[BX],20
MOV WORD PTR[BX+SI+2],2846
上述指令中BYTE PTR及WORD PTR伪操作不加行不行?试一试。
2.用G命令运行多字节加法程序,并用D命令检查其结果(存放在哪里?),是否正确?
3.将多字节加法程序中的INT 20H指令改为INT 3,有何区别?若这条指令不加,行不行?试一试。
4.数据串搬家程序中的目的地址改为1002H,再运行此程序,看能不能把1000H开始的字符串搬到1002H开始的地方去?修改程序以做到这一点。
实验3 初级程序的编写与调试实验(二)
一.实验目的
1.掌握无条件转移指令、条件转移指令;
2.掌握利用DOS功能调用INT21H的2号和9号功能进行屏幕显示的方法;
3.掌握直接向视频RAM送ASCII码进行屏幕显示的方法;
4.掌握屏幕字符显示程序编写与调试。
二.实验内容
1. 字符、字符串的屏幕显示;
2. 直接向VRAM送ASCII码显示字符;
3. 用字符搜索法确定字符串长度;
4. 16进制数化ASCII码的一般方法(显示内存内容)。
三.实验要求
1. 仔细阅读有关无条件转移指令、条件转移指令的内容;
2. 阅读利用DOS功能调用INT21H的2号和9号功能进行屏幕显示的内容;
3.阅读实验指导书中的字符串屏幕显示程序、字符屏幕显示程序、直接向VRAM送ASCII码显示字符程序、用字符搜索法确定字符串长度程序、16进制数化ASCII码的一般方法的程序段,调试上述程序。
四.实验环境
PC微机;
DOS操作系统或 Windows 操作系统;
MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境。
五.实验步骤
1.利用INT 21 0AH号功能调用显示字符串。
(1)用A命令在100H处键入下列程序:
MOV AH, 9
MOV DX,110
INT 21
INT 20
(2)用A命令在110H处键入下列字符串的ASCII码:
DB 'This is a sample!$'
(3)用N命令和W命令将此程序(包括数据区)存入文件名为AA.OM的磁盘文件中。(存入前BX:CX必须置为文件长度值)。
(4)用Q命令退出DEBUG。
(5)在DOS命令下打AA,运行此程序,即在屏幕上显示'This is a sample!'字符串,若不出现,用DEBUG检查程序有无错误。
2.利用INT 21H 2号功能显示字符
(1)用A命令在100H处键入下列程序:
XOR DL,DL
MOV CX,100
LOP: MOV AH,2
INT 21
INC DL
PUSH CX
MOV CX,8
DELY: PUSH CX
MOV CX,0
J: LOOP J
POP CX
LOOP DELY
POP CX
LOOP LOP
INT 20
(2)用G命令运行程序,即在屏幕上依次缓慢的显示256个ASCII字符。仔细观察每个字符,和IBM-PC ASCII码表对照,看07H-0DH处控制字符显示结果与表上有何不同?
(3)按CTRL+BREAK退出此程序,若一次不行可多做几次。
3.直接向VRAM送ASCII码显示字符
(1)用A命令在100H处键入下列程序
MOV AX,B000
MOV DS,AX
XOR AL,AL
XOR BX,BX
MOV CX,100
LOP:MOV [BX],AL
INC BX
INC AL
PUSH CX
MOV CX,8
DELY:PUSH CX
MOV CX,0
J: LOOP J
POP CX
LOOP DELY
POP CX
LOOP LOP
INT 20
(2)用N命令和W命令将此程序存入BB.COM文件中。(一定要先存入!)
(3)用G命令运行此程序,仔细观察每一个ASCII码显示结果,并和字符表及上一道程序运行情况进行对照,其控制字符区(07-0DH)显示结果和INT 21H 2号功能调用有何不同?
4.用字符搜索法确定字符串长度
(1)用A命令在100H开始的内存处键入下列程序
JMP START
DB 'This is the program to measure'
DB 'the length of a string!$'
START: MOV BX,102
MOV AL,24
XOR CL,CL
LOP: CMP AL,[BX]
JZ EXIT
INC BX
INC CL
JMP LOP
EXIT: INT3
(2)用G命令运行此程序,并检查CL的统计长度是否与你自己统计的实际长度是否一样?
5.用字符搜索法确定字符串长度
(1)用A命令在100H处键入下列程序:
MOVSI,0
MOVBL,10
LOP: MOVDL,[SI]
MOVCL,4
SHRDL,CL
CMPDL,0A
JC J1
ADD DL,7
J1: ADD DL,30
MOV AH,2
INT 21
MOV DL,[SI]
AND DL,0F
CMP DL,0A
JC J2
ADD DL,7
J2: ADD DL,30
MOV AH,2
INT 21
MOV DL,20
MOV AH,2
INT 21
INC SI
DEC BL
JNZ LOP
INT 20
(2)用N,W命令将此程序用CC.COM文件名存入磁盘。
(3)用Q命令退出DEBUG。
(4)在DOS命令状态下直接运行CC.COM命令文件,应在屏幕上显示出内存从0000H开始的16个字节的内容,若有错误,用DEBUG检查之。
(5)自编程序:修改上面程序,使除以16进制数形式显示内存内容外,还能在其右边显示该16进制码所对应的ASCII字符,07-0D的控制字符用'.'代替。
六.实验报告要求
1、各项实验记录及观察体会。
2、自编程序草稿及调试结果。
七.思考题
利用INT 21H 显示和直接向VRAM送ASCII码显示方法在显示结果上有什么不同?
实验4 汇编语言程序上机过程
一.实验目的
熟练掌握汇编语言程序的编辑、调试和运行的过程和方法。了解汇编语言程序的汇编、运行环境。
二.实验内容
1.掌握常用的编辑工具软件(如WORD、EDIT)、MASM和LINK的使用;
2.伪指令: SEGMENT,ENDS,ASSUME,END,OFFSET,DUP;
3.利用的INT 21H的1号功能实现键盘输入的方法;
三.实验要求
1.仔细阅读有关伪指令SEGMENT,ENDS,ASSUME,END,OFFSET,DUP的内容;
2.了解利用的INT 21H的1号功能实现键盘输入的方法,了解.EXE文件和.COM文件的区别及用INT 21H 4C号功能返回系统的方法;
3.阅读下面程序段。
四.实验环境
PC微机
DOS操作系统或 Windows 操作系统
MASM。EXE,LINK。EXE,DEBUG。COM或宏汇编集成环境
五.实验步骤
程序:
data segment
message db 'This is a sample program of keyboard and disply'
db 0dh,0ah,'Please strike the key!',0dh,0ah,'$'
data ends
stack segment para stack 'stack'
db 50 dup(?)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start: mov ax,data
mov ds,ax
mov dx,offset message
mov ah,9
int 21h
again: mov ah,1
int 21h
cmp al,1bh
je exit
cmp al,61h
jc nd
cmp al,7ah
ja nd
and al,11011111b
nd: mov dl,al
mov ah,2
int 21h
jmp again
exit: mov ah,4ch
int 21h
code ends
end start
实验步骤:
1.用用文字编辑工具(记事本或EDIT)将源程序输入,其扩展名为.ASM。
2.用MASM对源文件进行汇编,产生.OBJ文件和.LST文件。若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。
3.用TYPE命令显示1产生的.LST文件。
4.用LINK将.OBJ文件连接成可执行的.EXE文件。
5.在DOS状态下运行LINK产生的.EXE文件。即在屏幕上显示标题并提示你按键。每按一键在屏幕上显示二个相同的字符,但小写字母被改成大写。按ESC键可返回DOS。若未出现预期结果,用DEBUG检查程序。
六.实验报告要求
汇编,连接及调试时产生的错误,其原因及解决办法。
七.思考题
1.若在源程序中把INT 21H的'H'省去,会产生什么现象?
2.把 INT 21H 4CH号功能改为 INT 20H,行不行?
实验5 分支程序实验
一.实验目的
1. 掌握分支程序的设计方法;
2. 掌握利用DEBUG修改参数、检查结果的方法;
3. 熟悉汇编语言源程序的编辑、汇编、连接及调试过程。
二.实验内容
1.编写一个程序,显示AL寄存器中的两位十六进制数
2.编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。
三.实验要求
1.编写实验内容要求的两个程序;
2.写出调试以上程序,即修改程序参数,检查结果的操作方法;
3.熟悉源程序汇编、连接命令的使用方法即要回答的内容。
四.实验环境
PC微机
DOS操作系统或 Windows 操作系统
MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境
五.实验步骤
1. 用EDIT或其它编辑软件,编写.ASM源程序,例如HEXASC.ASM及DSPKEY.ASM。
2.对其进行汇编及连接,产生.EXE文件。
3.对.EXE文件进行调试运行。
(1)用DEBUG调试运行,学会修改AL内容的方法;
(2)对DSPKEY.EXE键入不同的字符,分别进行调试;
(3)在MS-DOS下运行这两个.EXE文件。
六.实验报告要求
1.画出两个程序的流程图,若要独立编写程序,应列出相应的程序清单。
2.说明本实验是如何利用DEBUG进行调试的。
七.思考题
编写显示AX中四位十六进制数程序,画出程序的流程图。
实验参考程序清单
(1) 显示AL中两位十六进制数程序:
;DISPHEX.ASM
CODE SEGMENT
ASSUME CS:CODE
START:MOV AL,3EH
MOV BL,AL
MOV DL,AL
MOV CL,4
SHR DL,CL
CMP DL,9
JBE NEXT1
ADD DL,7
NEXT1:ADD DL,30H
MOV AH,2
INT 21H ;显示高位ASCII码
MOV DL,BL
AND DL,0FH
CMP DL,9
JBE NEXT2
ADD DL,7
NEXT2:ADD DL,30H
MOV AH,2
INT 21H ;显示低位ASCII码
MOV AH,4CH
INT 21H
CODE ENDS ;返回DOS
END START
(2) 显示键入字符程序
;DISPKEY.ASM
CODE SEGEMENT
ASSUME CS:CODE
START: MOV AH,1
INT 21H ;等待键入字符,送AL
CMP AL,0DH ;是否是回车符?
JZ DONE ;是则转DONE退出程序
CMP AL,’0’
JB NEXT
CMP AL,’9’
JA CHARUP
MOV DL,AL
MOV AH,2
INT 21H
JMP START
CHARUP:CMP AL,41H
JB NEXT
CMP AL,5AH
JA CHRDN
DISPC: MOV DL,’C’
MOV AH,2
INT 21H
NEXT: JMP START
CHRDN:CMP AL,61H
JB NEXT
CMP AL,7AH
JA NEXT
JMP DISPC
DONE: MOV AH,4CH
INT 21H
CODE: ENDS
END START
实验6 循环程序实验
一.实验目的
1.掌握循环程序的设计方法;
2.学会针对不同的问题,选用不同的组织循环的方法;
3.进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。
二.实验内容
1.编写一个程序,显示BX寄存器中的两位十六进制数;
2.编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。
三.实验要求
1.编写实验内容要求的两个程序;
2.写出调试以上程序,即修改程序参数,检查结果的操作方法;
3.熟悉源程序汇编、连接命令的使用方法即要回答的内容。
四.实验环境
PC微机
DOS操作系统或 Windows 操作系统
MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境
五.实验步骤
1.用EDIT或其它编辑软件,编写.ASM源程序,例如HEXASC.ASM及DSPKEY.ASM;
2.对其进行汇编及连接,产生.EXE文件;
3.对.EXE文件进行调试运行。
(1)用DEBUG调试运行,学会修改AL内容的方法;
(2)对DSPKEY.EXE键入不同的字符,分别进行调试;
(3)在MS-DOS下运行这两个.EXE文件。
六.实验报告要求
画出两个程序的流程图,若要独立编写程序,应列出相应的程序清单。
七.思考题
编写一循环程序,测量一字符串长度,并用16进制数显示之。
实验7 子程序实验
一.实验目的
1.掌握主程序与子程序之间的调用关系及调用方法;
2.掌握子程序调用过程中近程调用与远程调用的区别;
3.掌握通过堆栈转送参数的方法。
二.实验内容
1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。
2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。
三.实验要求
1.第一个实验程序用子程序的近程调用实现。由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。实验过程中可以从堆栈的内容看到两个子程序的返回地址值。由于是近调用,地址值只包括返回地址的段内偏移量。在每个子程序的执行中,检查CS值是不变的。
2.第二个程序是利用远调用的方法调用子程序的。在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。
3.第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。有关该方法的原理此处不再介绍。
4.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图; 熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。
四.实验环境
PC微机
DOS操作系统或 Windows 操作系统
MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境
五.实验步骤
1.编辑、汇编两个源程序,生成相应的可执行文件(.EXE)
2.用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。
3.检查程序执行的结果是否正确。
六.实验报告要求
1.说明用堆栈传送参数的过程及其具体方法。
2.分析实验结果及所遇到问题,并说明解决的方法。
七.思考题
分析远程调用与近程调用的区别,在用DEBUG有关命令观察时,执行过程有何不同。
参考程序清单
1.码型转换程序清单:
;CONV.ASN
DATA SEGMENT
BUF DB 0ABH,0CDH,0DEH,01H,02H,03H
DB 3AH,4BH,5CH,6FH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV CX,10
LEA BX,BUF
AGAIN: MOV AL,[BX]
CALL HEXASC
INC BX
LOOP AGAIN
MOV AH,4CH
INT 21H
HEXASC PROC NEAR
MOV DL,AL
PUSH CX
MOV CL,4
SHR DL,CL
POP CX
CALL DISP ;显示高位HEX数
MOV DL,AL
AND DL,0FH
CALL DISP
RET
HEXASC ENDP
DISP PROP
CMP DL,9
JBE NEXT
ADD DL,7
NEXT: ADD DL,30H
MOV AH,2
INT 21H ;显示
RET
DISP ENDP
CODE ENDS
END START
2.统计并显示某键入字符的个数的程序:
;COUNTER.ASM
DATA SEGMENT
CHAR DB ‘b’
BUF DB 50H,? ,50H DUP(?)
DATA ENDS
MCODE SEGMENT
ASSUME CS: MCODE, DS: DATA
START: MOV AX,DATA
MOV DS,AX
LEA DX,BUF
MOV AH,9
INT 21H
LEA SI BUF
MOV CL, [SI+1]
MOV CH, 0 ;CX中为字符串长度
INC SI
INC SI ;SI指向串首址TABLE
MOV AL,CHAR
MOV AH,0 ;AX中为待查字符
PUSH SI
PUSH CX
PUSH AX ; 参数送堆栈
CALL CHECK
POP AX :统计个数在AL中
MOV DL,CHAR
MOV AH,2
INT 21H
MOV DL,AL
AND DL, 0FH
CMP DL,9
JBE NEXT
ADD DL,7
NEXT: ADD DL,30H
MOV AH,2
INT 21H ;显示统计个数
MOV AH,4CH
INT 21H
M CODE ENDS
SCODE SEGMENT
ASSUME CS:SCODE
CHECK PROC FAR
PUSH BP
MOV BP,SP
MOV SI,[BP+10]
MOV CX, [BP+8]
MOV AX, [BP+6]
XOR AH, AH
AGAIN: CMP AL.[SI]
JNE NEXT1
INC AH
NEXT1: INC SI
LOOP AGAIN
MOV AL, AH
MOV [BP+10],AX
POP BP
RET 4
CHECK ENDP
END START
实验8 字符处理程序实验
一. 实验目的
1.熟悉串操作指令的功能与应用;
2.掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序。
二.实验内容
1.字符串统计。自STRN开始的存储区中,有一个字符串,统计其中含有小写字母的个数,将统计结果以两位十进制数显示在屏幕上。
2.在给定的字符串中,删除重复的字符,其余的字符向前递补。
三. 实验要求
1.认真预习有关串操作的指令极其寻址方式的特点,能够正确使用串操作指令,并准备好数据。
2.按正常的方法将删除字符程序编成子程序,规定子程序的入口和出口参数。
四.实验环境
PC微机
DOS操作系统或 Windows 操作系统
MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境
五.实验步骤
1.用1号系统调用从键盘键入一个字符串,然后统计其中小写字母的个数。程序每次执行,都能得到不同的结果。
2.删除字符串中重复字符,要求编写一个在同一个字符串中删除字符,并将其余字符向前递补的程序。
六.实验报告要求
1、对照参考程序,画出程序流程图。
2、总结字符串处理的编程方法,提出改进和完善此类程序的设计方案。
七.思考题
编写程序,在一个字符串中查找匹配字符。
参考程序清单
1.统计小写字母个数的程序清单:
;COUNTDC.ASM
DATA SEGMENT
STRN DB 80 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX
LEA DI, STAN
MOV CL, 0
AGAIN: MOV AH, 1
INT 21H
CMP AL,0DH
JZ DONE
MOV [DI],AL
INC DI
INC DL
JMP AGAIN
DONE: LEA SI,STRN
MOV CH,0
MOV BL,0
CLD
CYCLE:LODSB
CMP AL,61H
CMP AL,7AH
JA NEXT
INC BL
NEXT: LOOP CYCLE
MOV AL,BL
MOV AH,0
MOV CL,10
DIV CL ;十位数在AL中,个位数在AH中
XCHG AH,AL ;以下显示两位十进制数
MOV DL,AH
OR DL,30H
INT 21H
MOV DL,AL
OR DL,30H
MOV AH,2
INT 21H
MOV DL,AL
OR DL,30H
INT 21H
MOV DL,AL
OR DL,30H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
2.删除字符串中重复字符的源程序清单:
;DELD.ASM
DATA SEGMENT
STAN DB 80 DUP(?)
LEN DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE,DS: DATA,ES: DATA
ATART: MOV AX, DATA
MOV DS,AX
MOV ES,AX
LEA SI,STRN
MOV CL,0
AGAIN: MOV AH,1
INT 21H
CMP AL,0DH
JZ DONE
MOV [SI],AL
INC SI
INC CL
JMP AGAIN
DONE: MOV CH,0
MOV LEN,[CL]
REPEAT: PUSH SI
PUSH CX ;CX为内循环记数
PUSH CX ;DX为外循环记数
POP DX
DEC CX
JE NEXT1 ;是最后一个字符,不再查找重复字符
MOV AL,[SI]
CMP AL,0
JE NEXT1
COMP: INC SI
CMP AL,[SI]
JNE GOON ;为非重复字符
MOV BUTE PTR[SI],0
GOON: LOOP COMP ;查出与该字符重复的所有字符,并用0替换
NEXT1: POP DX
POP SI
DEC DX`
JNZ REPEAT ;对所有重复字符都进行查找
LEA SI,STRN ;删除重复字符
MOV CL,LEN
MOV CH,0
CYCLE: MOV AL,[SI]
CMP AL,0 ;是重复字符吗?
JNZ NEXT ;不是,查找下一个字符
DEC CX ;递补字串长度送CX
JZ DONE ;若是最后字符不递补
CALL DELE ;删除该空字符并递补
DEC SI ;对递补子串从头处理
NEXT: INC SI
LOOP CYCLE
MOV AH,4CH
INT 21H
DELE PROC
PUSH SI
PUSH CX
CLD
MOV DI,SI ;空字符处为目的首址
INC SI ;下一个地址为源串首址
REP MOVSB
POP CX
POP SI
RET
DELE ENDP
CODE ENDS
END START
实验9 排序程序设计
一.实验目的
掌握数据排序的一些常用算法,了解数列的有序、无序、升序和降序的概念。
二.实验内容
使用“冒泡排序”法,将内存中10个数据由小到大排序(每个数为16位二进制);
三.实验要求
1.复习排序的几个基本算法;
2.准备数据,按选择好的算法编写源程序。数据以DW定义和键盘输入两种方法提供。
四.实验环境
PC微机
DOS操作系统或 Windows 操作系统
MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境
五.实验步骤
1.将编写好的源程序输入,建立源程序文件且存盘;
2.汇编、连接和运行此程序;
3.运行成功后,将程序的数据区建立方式改为键盘输入,由小到大排序改为由大到小排序,修改后重新调试、运行;
4.记录并分析排序的效率。
六.实验报告要求
1.对照参考程序,画出程序流程图。
2.说明所使用算法,是否为最优算法,与你知道的其它算法比较,指出它们的差别。
七.思考题
如果要求显示排序结果,程序应如何修改?
参考程序清单、
code segment
org 100h
assume cs:code,ds:code
main: jmp start
array dw 1234h,5673h,7fffh,8000h,0dffh
dw 0ab5h,0369h,005fh,5634h,9069h
count equ $-array
start: mov cx,count
shr cx,1
dec cx
mov bl,-1
again: mov dx,cx
and bl,bl
je exit
xor bl,bl
xor si,si
again1: mov ax,array[si]
cmp ax,array[si+2]
jle nchg
xchg array[si+2],ax
mov array[si],ax
mov bl,-1
nchg: inc si
inc si
dec dx
jnz again1
loop again
exit: int 20h
code ends
end main
实验10 计算机钢琴程序
一.实验目的
1.掌握利用PC机扬声器发出不同频率声音的方法;
2.学习利用系统功能调用从键盘上读取字符的方法。
二.实验内容
编写程序,使PC机成为一架可弹奏的“钢琴”。当按下数字键1-8时,依次发出1,2,3,4,5,6,7,I八个音调。当按下CTRL-C,则退出“钢琴”状态。
三.实验要求
1.了解PC机发音的原理;
2.编写发音程序。
PC机扬声器电路图如下:
通过给8253定时器装入不同的计数值,可以使其输出不同频率的波形。当与门打开后,经过放大器的放大作用,便可驱动扬声器发出不同频率的音调。要使音调的声音持续一端时间,只要插入一端延时程序之后,再将扬声器切断(关闭与门)。
另外,要使计算机成为可弹奏的钢琴,需要使用系统调用的01H功能以接收键入字符,并且要建立一张表,使键入字符与频率构成一个对应关系。
四.实验环境
PC微机
DOS操作系统或 Windows 操作系统
MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境
五.实验步骤
1.将编写好的源程序输入,建立源程序文件且存盘;
2.汇编、连接和运行此程序;
3.运行成功后,改变常数或频率值,看看声音的变化。
六.实验报告要求
1.实验记录和体会。
2.自编程序。
七.思考题
如果要演奏高音、低音,程序应如何修改?
程序框图如下:
实验11 键盘和窗口程序
一.实验目的
1.掌握利用INT 16H 2号功能调用实行键盘输入的方法;
2.熟悉键盘的扫描码和ASCII码的关系;
3.掌握利用INT 10H功能调用实现窗口功能的方法。
二.实验内容
1.编写键盘输入程序;
2.编写设置屏幕窗口程序。
三.实验要求
1.复习INT 16H 2号功能调用;
2.阅读键盘的扫描码和ASCII码的关系的内容;
3.复习INT 10H功能。
四.实验环境
PC微机
DOS操作系统或 Windows 操作系统
MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境
五.实验步骤
1.将键盘输入程序输入,建立源程序文件且存盘;
2.汇编、连接、运行此程序,观察并记录各个键的扫描码,ASCII码及对应字符。汇编、连接和运行此程序;
3.将窗口程序输入,建立源程序文件且存盘;
4.汇编、连接、运行此程序,观察按不同键所产生的效果。
六.实验报告要求
1.对照参考程序,画出程序流程图。
2.记录程序运行结果。
七.思考题
窗口程序所产生的窗口效果有何缺陷?试修改之。
参考程序清单:
1.键盘输入程序
PRO_NAM SEGMENT
ASSUME CS:PRO_NAM
ORG 100H
AGAIN: MOV AH,0
INT 16H
MOV BX,AX
CALL BINIHEX
MOV AH,2
MOV dl,20h
INT 21H
MOV DL,BL
MOV AH,2
INT 21H
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
JMP AGAIN
INT 20H
BINIHEX PROC NEAR
MOV CH,4
ROTATE: MOV CL,4
ROL BX,CL
MOV AL,BL
AND AL,0FH
ADD AL,30H
CMP AL,3AH
JL PRINT
ADD AL,7
PRINT: MOV DL,AL
MOV AH,2
INT 21H
DEC CH
JNZ ROTATE
RET
BINIHEX ENDP
PRO_NAM ENDS
END AGAIN
2.窗口程序
code segment
assume cs:code,ss:code
org 100h
start: mov ax,600h
mov cx,0
mov dx,184fh
mov bh,7
int 10h
pos: mov ah,2
mov dx,101eh
mov bh,0
int 10h
mov cx,20
get: mov ah,1
int 21h
cmp al,1bh
jz exit
loop get
mov ax,601h
mov cx,81eh
mov dx,1031h
mov bh,7
int 10h
jmp pos
exit: int 20h
code ends
end start
实验12 磁盘文件操作程序
一.实验目的
1.掌握利用FCB进行磁盘文件读写的方法;
2.掌握利用HANDLE进行磁盘文件读写的方法;
3.INT 21H的0FH、10H、14H、15H、16H、1AH号功能调用;
4.INT 21H的3CH、3DH、3FH、40H号功能调用。
二.实验内容
1.编写文本文件内容显示程序;
2.编写磁盘文件拷贝程序。
三.实验要求
1.复习INT 21H 0FH、10H、14H、15H、16H、1AH、3CH、3DH、3FH、40H号功能调用
2.阅读有关磁盘文件的FCB、HANDLE的内容。
四.实验环境
PC微机
DOS操作系统或 Windows 操作系统
MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境
五.实验步骤
1.将文本文件内容显示程序输入,建立源程序文件且存盘;
2.输入,汇编,连接此程序,用DEBUG将目的程序带参数调入,用D命令观看并记录PSP中的FCB内容。
3.将磁盘文件拷贝程序输入,建立源程序文件且存盘;
4.汇编、连接、运行此程序,观察按不同键所产生的效果。
六.实验报告要求
1.对照参考程序,画出程序流程图;
2.实验中产生的问题及体会;
3.实验记录。
七.思考题
按COPY AAA BBB 格式要求改写此程序,取消人机对话,源文件和目的文件名由命令行输入。
参考程序清单:
1.文本文件内容显示程序:
stack segment stack
db 100h dup(?)
stack ends
data segment
fcb db 36 dup(0)
count db 0
char db 0
dta db 0
errmsg db 'file access error'
data ends
code segment
main proc far
assume cs:code,ss:stack
start: push ds
sub ax,ax
push ax
mov ax,data
mov es,ax
assume es:data
mov si,5ch
mov di,offset fcb
mov cx,12
cld
rep movsb
mov ds,ax
assume ds:data
mov dx,offset dta
mov ah,1ah
int 21h
mov dx,offset fcb
mov ah,0fh
int 21h
cmp al,0
jnz error
mov word ptr fcb+0ch,0
mov word ptr fcb+0eh,1
mov fcb+20h,0
again: lea dx,fcb
mov ah,14h
int 21h
cmp al,0
jnz error
mov al,dta
cmp al,1ah
jz eof
cmp al,9
jz tab
call dispchar
inc char
cmp dta,0ah
jnz again
mov char,0
inc count
cmp count,24
jnz again
mov ah,0
int 16h
mov count,0
jmp again
tab: mov al,' '
call dispchar
inc char
test char,7
jz again
jmp tab
eof: lea dx,fcb
mov ah,10h
int 21h
ret
error: lea bx,errmsg
call display
ret
display proc
mov cx,30
disp1: mov al,[bx]
call dispchar
inc bx
loop disp1
mov al,0dh
call dispchar
mov al,0ah
call dispchar
ret
display endp
dispchar proc
push bx
mov bx,0
mov ah,14
int 10h
pop bx
ret
dispchar endp
main endp
code ends
end start
2、磁盘文件拷贝程序(参考):
stack segment stack
db 100h dup(9)
stack ends
;
data segment
sfile db 64
db ?
db 64 dup(' ')
dfile db 64
db ?
db 64 dup(' ')
ask1 db 0ah,0dh,'please input source'
db 'file name:','$'
ask2 db 0ah,0dh,'please input destnation'
db 'file name:','$'
note db 0ah,0dh,'please insert diskettes'
db 'and strike any when ready ','$'
er1 db 0ah,0dh,'create error $'
er2 db 0ah,0dh,'open error$'
er3 db 0ah,0dh,'read error$'
er4 db 0ah,0dh,'write error$'
er5 db 0ah,0dh,'close source file error'
er6 db 0ah,0dh,'close dest file error'
bufr dw ?
data ends
code segment
assume cs:code,ds:data,ss:stack
start proc far
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov es,ax
lea dx,ask1
call disp
lea dx,sfile
call inpt
mov cl,sfile+1
xor ch,ch
mov si,cx
mov [si+sfile+2],0
lea dx,ask2
call disp
lea dx,dfile
call inpt
mov cl,dfile+1
xor ch,ch
mov si,cx
mov [si+dfile+2],0
lea dx,note
call disp
mov ah,7
int 21h
call copy
ret
start endp
disp proc
mov ah,9
int 21h
ret
disp endp
inpt proc
mov ah,0ah
int 21h
ret
inpt endp
copy proc
mov ah,3ch
lea dx,dfile+2
mov cx,20h
int 21h
lea dx,er1
mov bx,ax
jc err
mov bufr,ax
mov ah,3dh
mov al,0
lea dx,sfile+2
int 21h
lea dx,er2
mov bx,ax
jc err
r_w: mov cx,10h
mov ah,3fh
lea dx,sfile+2
int 21h
lea dx,er3
jc err
or ax,ax
je exit
mov ah,40h
lea dx,sfile+2
xchg bufr,bx
int 21h
lea dx,er4
jc err
xchg bufr,bx
jmp r_w
exit: mov ah,3eh
int 21h
lea dx,er5
jc err
xchg bufr,bx
mov ah,3eh
int 21h
lea dx,er6
jc err
ret
err: mov ah,3eh
int 21h
xchg bufr,bx
mov ah,3eh
int 21h
call disp
ret
copy endp
code ends
end start