《汇编语言程序设计》实验指导书.docx
《《汇编语言程序设计》实验指导书.docx》由会员分享,可在线阅读,更多相关《《汇编语言程序设计》实验指导书.docx(22页珍藏版)》请在冰豆网上搜索。
《汇编语言程序设计》实验指导书
前言
《汇编语言程序设》在计算机科学中是一门综合性的专业基础课,是计算机专业的核心课程。
它不仅是一般程序设计的基础,而且也是设计和实现编译程序、操作系统及其它系统程序和大型应用程序的重要基础。
它为后续专业课程的学习打下了理论基础和实践基础。
由于汇编语言程序设中有大量的指令,因此汇编语言程序设实验课在教学中占有重要的地位。
通过实验可以使学生更好的巩固和掌握所学的内容,进一步增强动手能力和解决实际问题的能力。
为了提高实验的效率,任课教师提前一周布置实验任务,并且进行一定的分析和讲解,要求学生进行准备工作。
准备工作包括查找资料,设计算法,写出预习报告,其中预习报告包括题目的解题思想,概要设计,实现算法的源代码清单等。
每次实验前,学生应向实验指导教师上交实验预习报告,预习报告经指导教师认可后方能进行实验。
实验完毕写出实验报告,用A4纸打印成册(源程序存盘),由学习委员统一收齐交指导教师审阅评定。
实验成绩考核:
实验成绩占《数据结构》总评成绩的20%,其中实验效果占10分,出勤率和实验报告各占5分。
有以下情形之一者,实验成绩为不及格:
1.迟到,早退,无故缺勤总共3次及以上者;
2.未按时完成实验达4次及以上者;
3.缺交实验报告3次及以上者。
实验一简单程序编制和上机过程
一.实验目的
1.掌握计算机常用代码的软件转换技术。
2.熟悉DEBUG软件的使用。
3.掌握简单程序的编程方法。
二.实验内容
代码转换是计算机和I/O设备进行信息交换的重要技术之一。
各种I/O设备所提供和接收的数据编码不尽相同。
为了处理这些信息,计算机必须将各种不同编码形式的信息转换成别种适当的数据形式。
例如,键盘输入的数据均为ASCⅡ码形式存储在内存中,通常要求将其转换成相应的数据形式。
一般实现代码转换有两种方法:
1.软件法利用CPU的算术逻辑运算功能,通过运算或查表实现各种数据代码间的转换。
该方法经济但速度慢。
2.硬件法利用专用代码转换集成电路进行转换。
如74LS74可把BCD码转换为七段代码。
这种方法需要硬件费用,但速度快。
本实验要求掌握软件编码转换技术。
计算机常用的代码有二进制、八进制、十六进制、BCD码、ASCⅡ码、七段码等,它们之间的相互关系如下表所示。
常用数值对照表
16进制数
二进制码
八进制码
BCD码
16进制码
ASCII码
七段码
共阳
共阴
0
0
000
0000
0000
30H
40H
3FH
1
1
001
0001
0001
31H
79H
06H
2
010
0010
0010
32H
24H
5BH
3
011
0011
0011
33H
30H
4FH
4
100
0100
0100
34H
19H
66H
5
101
0101
0101
35H
12H
6DH
6
110
0110
0110
36H
02H
7DH
7
111
0111
0111
37H
78H
07H
8
1000
1000
38H
00H
7FH
9
1001
1001
39H
18H
67H
A
1010
41H
08H
77H
B
1011
42H
03H
7CH
C
1100
43H
46H
39H
D
1101
44H
21H
5EH
E
1110
45H
06H
79H
F
1111
46H
0EH
71H
本次试验的内容是ASCⅡ码转换为未组合BCD码
设从键盘输入十进制数的ASCⅡ码已存放在起始地址CS:
150H的单元中,把它转换成未组合BCD码后,再分别存入起始地址为CS:
15AH的单元中。
若输入的不是十进制数的ASCⅡ码,则相应存放结果单元的内容为“FF”。
提示:
1.组合BCD码是一位十进制数字占一个字节,高半字节为0,低半字节为该十进制数字的BCD码。
ASCⅡ码转换为未组合BCD码只需减30H。
2.程序框图如下图所示。
3.程序执行前,需要在CS:
150H内存缓冲区写入待转换的ASCⅡ码。
方法如下:
方法一:
用A命令
-ACS:
150DB35,39,30,41,32
CS:
155∧C
方法二:
用E命令
-ECS:
150,35,39,30,41,32
方法三:
用F命令
-FCS:
150L535,39,30,41,32
1.执行程序后检查执行结果可用D命令:
-DCS:
15A
CS:
15A05,09,00,FF,02
ASCⅡ码转换为未组合BCD码的程序流程图
三.参考程序
ORG100H
MOVCX,0005H
MOVDI,150H
BB:
MOVBL,0FFH
MOVA,[DI]
CMPAL,3AH
JNBDONE
SUBAL,30H
JBDONE
MOVBL,AL
DONE:
MOVAL,BL
MOV[DI+0AH],AL
INCDI
LOOPBB
INT20H
ORG150H
DB35H,39H,30H,41H,32H
四.运行结果
五.调试分析及实验心得
六.源程序清单
实验二顺序结构的程序设计
一.实验目的
1.掌握计算机常用代码的软件转换技术。
2.进一步首席DEBUG软件的使用。
3.掌握简单顺序结构程序的编程方法。
二.实验内容
本次实验的内容延续上一次实验内容,将16进制数转换为ASCⅡ码,相关内容参看上一次实验的表格。
设经过CPU运算后的4位16进制数已存放在CS:
150H字单元中,把它转换为ASCⅡ码后分别存入CS:
15AH为起始地址的4个单元中,低位数存在低地址的字节中。
提示:
1.十六进制数0-9H加30H即可得到ASCⅡ码,而A-FH则需要加37H,也就是加7H后再加30H,才能完成转换。
因此对每一位十六进制数应先判断是0-9H的数还是A——FH的数,再分别加30H和37H即可完成转换。
2.4位数的转换需用循环程序结构。
用CX作为计数器,DI作为地址指针,指向150H单元,则DI+0AH就指向结果存放单元。
用逻辑右移指令使高位逐个地移至个位,用AND指令可以将个位从4位数中分离出来进行转换。
MOVCL,04H
SHRDX,CL
两条指令使DX中的数右移4位,由于CX已用做循环控制计数器,因此右移前应将CX压栈保护,移位后再出栈恢复CX。
3.程序流程图如下图所示。
16进制数转换为ASCII码程序流程图
三.参考程序
ORG100H
MOVCX,0004H;给循环计数器赋转换代码长度
MOVDI,0150H;16进制数首地址送DI
MOVDX,[DI];16进制数送DX
AA:
MOVAX,DX
ANDAX,000FH;取低四位值
CMPAL,0AH;判别是否为“0-9”数
JBASC;是“0-9”数转ASC
ADDAL,07H;是“A-F”数加7
ASCADDL,30H;转换为ASCII码
MOV[DI+0AH],AL;ASCII码送15AH单元
INCDI
PUSHCX;保护循环计数器内容
MOVCL,04H;置移位次数
SHRDX,CL;16进制数右移4位
POPCX;循环计数器内容出栈
LOOPAA;(CX)<>0,转AA
INT20H
ORG150H
DW45A7H
四.运行结果
五.调试分析及实验心得
六.源程序清单
实验三分支结构的程序设计
一.实验目的
4.掌握计算机常用代码的软件转换技术。
5.熟悉DEBUG软件的使用。
6.掌握分支结构程序的编程方法。
二.实验内容
本次实验的内容延续第一次实验内容,将BCD码转换为二进制码,相关内容参看第一次实验中的表格。
在各种智能仪器和信息处理中,人们总习惯于十进制数来表示信息。
但是绝大多数计算机没有十进制运算指令(仅有十进制调整指令)。
这是因为实现十进制算术运算的硬件电路要比采用二进制算术运算的硬件电路复杂得多。
例如,当两个整数进行算术运算时,对一个N进制的数需记住N(N+1)/2个“积”与“和”,当N=10时,需记住55个“积”与“和”;而当N=2时,只需记住3个。
从占用存储空间来看,采用二进制数比采用十进制数要节省得多。
例如,8bit表示十进制数,其数值范围为0-99,而8bit表示的二进制数则为0-255(均指无符号数)。
所以,常规的方法是将输入的十进制数转换为二进制数后,再进行各种数据处理。
BCD码分别为组合BCD码和未组合BCD码。
组合BCD码每字节存放两位BCD数,未组合BCD码每字节只存放一位BCD数,高半字节为0。
组合BCD码加、减后必须用DAA和DAS指令进行调整(乘法或除法没有调整指令)。
未组合BCD码则可进行加、减、乘、除四则运算,其调整指令分别为AAA、AAS、AAM和AAD。
组合BCD码转换位二进制数的算法通过实例说明于下。
一个组合BCD码表示的数可以用其按权展开式表示。
例如
2497=2*1000+4*100+9*10+7*1
=2*3E8H+4*64H+9*0AH+7*1H
由此,逐位转换后相加便可得到结果。
改用另一种表示方法,可以写成
2497=((((2*10)+4)*10)+9)*10)+7
而10=8+2,于是便可以采用循环结构程序来完成转换。
本实验是要把两位未组合BCD码数转换成二进制数。
设未组合BCD码已存放在起始地址为CS:
150H的区域,把它们转换为二进制数后,再分别存入起始地址为CS:
165H的区域。
例如
ORG150H
DB03H,06H,08H,09H,06H,05H,02H,09H
则转换后CS:
165H开始的单元的内容为:
CS:
165H24H,00H,59H,00H,41H,00H,1DH,00H
提示:
1.算法是十位*10+个位。
其中的*10可以用10=8+2来实现。
2.程序流程图如下图所示。
BCD码转换为二进制码程序流程图
三.参考程序
ORG100H
START:
MOVCX,0004H;给循环计数器赋转换代码长度
MOVDI,150H;BCD码首址送DI
AA:
MOVAL,[DI];BCD码十位数值赋AL
ADDAL,AL;*2
MOVBL,AL
ADDAL,AL;*4
ADDAL,AL;*8
ADDAL,BL;*10
INCDI
MOVAH,OOH
ADDAL,[DI];BCD码十位和个位相加,转换结束
MOV[DI+14H],AX;转换结果存起始地址165H单元
INCDI
LOOPAA;(CX)<>0
INT20H
ORG150H
DB03H,06H,08H,09H,06H,05H,02H,09H
四.运行结果
五.调试分析及实验心得
六.源程序清单
实验四循环结构的程序设计
一.实验目的
1.学习并掌握数据传送指令和算术运算指令的用法。
2.熟悉PC机上建立、汇编、链接和运行8088汇编语言程序的过程。
3.掌握循环结构程序的编写方法。
二.实验内容
将两个多位十进制数相加,并在屏幕上显示加数、被加数以及和。
已知被加数和加数均以ASCII码的形式存放在DATA1和DATA2为首的单元中(低位位于低地址),结果送回DATA1处。
编程提示
1.因被加数和加数均以ASCII码形式存放,所以在相加必须转化为BCD码,此时用未组合BCD码最适宜。
未组合BCD码相加要用到AAA加法调整指令。
2.显示数据可用2号DOS功能调用。
3.程序流程图如下图所示。
多位十进制数相加程序流程图
三.参考程序
CRLFMACR0;建立宏指令CRLF
MOVDL,0DH
MOVAH,02H
INT21H
MOVDL,0AH
MOVAH,02H
INT21H
ENDM
DATASEGMENT
DATA1DB33H,39H,31H,37H,34H
COUNTEQU$-DATA1
DATA2DB36H,35H,30H,38H,32H
DATAENDS
STACKSEGMENTSTACD‘STACK’
DB20DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,OFFSETDATA2
MOVBX,COUTN
CALLDISPL;显示被加数
CRLF
MOVSI,OFFSETDATA1
MOVBX,COUNT;显示加数
CALLDISPL
CRLF
MOVDI,OFFSETDATA2
CALLADDA;加法运算
MOVSI,OFFSETDATA1
MOVBX,COUNT
CALLDISPL;显示结果
CRLF
MOVAX,4C00H
INT21H
DISPLPROCNEAR;显示子程序
DIS:
MOVAH,02H
MOVDL,[SI+BX-1];显示字符串中一字符
INC21H
DECBX;修改偏移量
JNZDS1
RET
DISPLENDP
ADDAPROCNEAR
MOVDX,SI
MOVBP,DI
MOVBX,COUNT
AD1:
SUBBYTEPTR[SI+BX-1],30H
SUBBYTEPTR[DI+BX-1],30H
DECBX;将ASCII码数字串转化为十进制色数字串
JNZAD1
MOVSI,DX
MOVDI,BP
MOVCX,COUNT
CLC
AD2:
MOVAL,[SI]
ADCAL,[DI]
AAA;非组合BCD码的加法调整
MOV[SI],AL;结果送被加数区
INCSI
INCDI;指向下一位
LOOPAD2
MOVSI,DX
MOVDI,BP
MOVBX,COUNT
AD3:
ADDBYTEPTR[SI+BX-1],30H
ADDBYTEPTR[DI+BX-1],30H;十进制数字串转为ASCII码表示的数据串
DECBX
JNZAD3
RET
ADDAENDP
CODEENDS
ENDSTART
四.运行结果
五.调试分析及实验心得
六.源程序清单
实验五子程序设计和调用
一.实验目的
1.通过程序调试,观察子程序调用及嵌套过程,进一步理解CALL指令和RET指令的功能。
2.掌握子程序(或过程)调用时参数传递的方法。
二.实验内容
调试程序PCS5_1.ASM,使实现函数y=(a+b)2(a和b均为0-65535之间的值),并在屏幕上显示y的值(十六进制形式)。
;PCS5-1.ASMTOBEDEBUGED
DATASEGMENT
ADW125
BDW90
YDW2DUP(0)
ZDW0,0
DATAENDS
STASEGMENTSTACK‘STACK’
DW50DUP(‘S’)
STAENDS
CODESEGMENT
ASSUMECS:
CDOE,DS:
DATA,SS:
STA
STARPROCFAR
PUSHDS;保存PSP首地址
XOPAX,AX
MOVAX,A
MOVZ,AX
MOVZ+2,AX
CALLMLT;求A的平方
MOVAX,B
MOVZ,AX
MOVZ+2,AX
CALLMLT;求B的平方
MOVAX,A
MOVZ,AX
MOVAX,B
MOVZ+2,AX
CALLMLT;求A*B
ADDY,AX
ADCY+2,DX;再加一个A*B
ADCY+4,0
CALLDSP6;显示6位数
RET
STAREND
MLTPROC;Z和Z+2字单元内容相乘
MOVAX,Z
MOVBX,Z+2
MULBX
ADDY,AX
ADCY+2,DX
ADCY+4,0
RET
MLTENDP
DSP6PROC;显示6字节结果
LEASI,Y
ADDSI,5
MOVCX,6
L1:
MOVAL,BYTEPTR[R]
CALLDSPAL
DECSI
LOOPL1
RET
DSP6ENDP
DSPALPROC;显示AL
PUSHAX;保护寄存器
PUSHBX
PUSHCX
PUSHDX
MOVBH,AL;暂存与BH
MOVBL,2
MOVCL,4
SHRAL,CL
G1:
CMPAL,10
JGEG2
ORAL,30H
JMPG3
G2:
ADDAL,37H
G3:
MOVDL,AL;CRT显示
MOVAH,2
INT21H
DECBL
JZG4
MOVAL,BH;再处理低4位
ANDAL,0FH
JMPG1
G4:
POPDX
POPCX
POPBX
POPAX
RET
DSPALENDP
CODEENDS
END
程序调试通过后,在DEBUG环境下观察CALL和RET指令执行时堆栈指针的变化及堆栈中压入和弹出的内容。
三.运行结果
四.调试分析及实验心得
五.源程序清单
实验六DOS功能调用
一.实验目的
掌握常用的DOS功能调用。
二.实验内容
编程完成多位十进制与一位十进制数的乘法运算,并在屏幕上显示乘积。
已知被乘数和乘数均以ASCII码形式存放在内存中,并且低位数存放在低地址。
1.十进制数的乘法,必须在乘法指令后用AAM指令进行调整。
多位十进制数乘一位十进制数,必须把每一位乘法运算的部分积加至结果(乘积)单元,十进制数相加还必须用AAA指令进行调整。
下面以两位数乘一位数说明其运算过程。
DATA1DB38H,35H;58(被乘数)
DATA2DB39H;9(乘数)
RESULTDB3DUP(0)
先乘个位。
08H×09H后,AX=0048H;经AAM调整后AX=0702H。
这个部分积加至乘积单元,因此RESULT单元内容为:
02H,07H,00H。
再乘十位。
05H×09H后,AX=002DH;经AAM调整后AX=0405H。
AX=0405H。
AX这个部分积应加至乘积单元的十位:
05H+07H,AL中得到0CH,经AAA指令调整,AL加6并将高四位清零变成02H,AH则加1变成05H,于是AX=0502H。
低字节02H应放入结果的十位,高字节05H应送到百位。
于是乘积单元内容为02H,02H,05H,即58×9=522,得到正确的十进制积。
2.程序流程图如下图所示。
两数相乘程序流程图
三.参考程序
DATASEGMENT
DATA1DB32H,39H,30H,35H,34H;被乘数
COUNTEQU$—DATA1;被乘数位数
DATA2DB33H;乘数
RESULTDBCOUNT+1DUP(0)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK,ES;DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,OFFSETDATA2
MOVBL,[SI];BL=乘数ASCII
ANDBL,00001111B;未组合BCD数
MOVSI,OFFSETDATA1
MOVDI,OFFSETRESULT
MOVCX,COUNT
LOOP1:
MOVAL,[SI]
ANDAL,00001111B
INCSI
MULBL
AAM;未组合BCD数乘法调整
ADDAL,[DI];加至和单元
AAA;未组合BCD数加法调整
MOV[DI],AL
INCDI
MOV[DI],AH
LOOPLOOP1
MOVCX,COUNT+1
MOVSI,OFFSETRESULT;显示结果
ADDSI,COUNT
DISP1:
MOVAH,2
MOVDL,[SI]
ADDDL,30H
INT21H
DECSI
LOOPDISP1
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
四.运行结果
五.调试分析及实验心得
六.源程序清单