《汇编语言程序设计》实验指导书Word文档格式.docx
- 文档编号:8597948
- 上传时间:2023-05-12
- 格式:DOCX
- 页数:22
- 大小:152.33KB
《汇编语言程序设计》实验指导书Word文档格式.docx
《《汇编语言程序设计》实验指导书Word文档格式.docx》由会员分享,可在线阅读,更多相关《《汇编语言程序设计》实验指导书Word文档格式.docx(22页珍藏版)》请在冰点文库上搜索。
06H
2
010
0010
32H
24H
5BH
3
011
0011
33H
4FH
4
100
0100
34H
19H
66H
5
101
0101
35H
12H
6DH
6
110
0110
36H
02H
7DH
7
111
0111
37H
78H
07H
8
1000
38H
00H
7FH
9
1001
39H
18H
67H
A
1010
41H
08H
77H
B
1011
42H
03H
7CH
C
1100
43H
46H
D
1101
44H
21H
5EH
E
1110
45H
F
1111
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
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码程序流程图
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单元
PUSHCX;
保护循环计数器内容
MOVCL,04H;
置移位次数
SHRDX,CL;
16进制数右移4位
POPCX;
循环计数器内容出栈
LOOPAA;
(CX)<
>
0,转AA
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的区域。
DB03H,06H,08H,09H,06H,05H,02H,09H
则转换后CS:
165H开始的单元的内容为:
165H24H,00H,59H,00H,41H,00H,1DH,00H
1.算法是十位*10+个位。
其中的*10可以用10=8+2来实现。
2.程序流程图如下图所示。
BCD码转换为二进制码程序流程图
START:
MOVCX,0004H;
MOVDI,150H;
BCD码首址送DI
MOVAL,[DI];
BCD码十位数值赋AL
ADDAL,AL;
*2
*4
*8
ADDAL,BL;
*10
MOVAH,OOH
ADDAL,[DI];
BCD码十位和个位相加,转换结束
MOV[DI+14H],AX;
转换结果存起始地址165H单元
实验四循环结构的程序设计
1.学习并掌握数据传送指令和算术运算指令的用法。
2.熟悉PC机上建立、汇编、链接和运行8088汇编语言程序的过程。
3.掌握循环结构程序的编写方法。
将两个多位十进制数相加,并在屏幕上显示加数、被加数以及和。
已知被加数和加数均以ASCII码的形式存放在DATA1和DATA2为首的单元中(低位位于低地址),结果送回DATA1处。
编程提示
1.因被加数和加数均以ASCII码形式存放,所以在相加必须转化为BCD码,此时用未组合BCD码最适宜。
未组合BCD码相加要用到AAA加法调整指令。
2.显示数据可用2号DOS功能调用。
多位十进制数相加程序流程图
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
MOVAX,DATA
MOVDS,AX
MOVSI,OFFSETDATA2
MOVBX,COUTN
CALLDISPL;
显示被加数
CRLF
MOVSI,OFFSETDATA1
MOVBX,COUNT;
显示加数
CALLDISPL
MOVDI,OFFSETDATA2
CALLADDA;
加法运算
MOVBX,COUNT
显示结果
MOVAX,4C00H
INT21H
DISPLPROCNEAR;
显示子程序
DIS:
MOVDL,[SI+BX-1];
显示字符串中一字符
INC21H
DECBX;
修改偏移量
JNZDS1
RET
DISPLENDP
ADDAPROCNEAR
MOVDX,SI
MOVBP,DI
AD1:
SUBBYTEPTR[SI+BX-1],30H
SUBBYTEPTR[DI+BX-1],30H
将ASCII码数字串转化为十进制色数字串
JNZAD1
MOVSI,DX
MOVDI,BP
MOVCX,COUNT
CLC
AD2:
MOVAL,[SI]
ADCAL,[DI]
AAA;
非组合BCD码的加法调整
MOV[SI],AL;
结果送被加数区
INCSI
INCDI;
指向下一位
LOOPAD2
AD3:
ADDBYTEPTR[SI+BX-1],30H
ADDBYTEPTR[DI+BX-1],30H;
十进制数字串转为ASCII码表示的数据串
DECBX
JNZAD3
ADDAENDP
CODEENDS
ENDSTART
实验五子程序设计和调用
1.通过程序调试,观察子程序调用及嵌套过程,进一步理解CALL指令和RET指令的功能。
2.掌握子程序(或过程)调用时参数传递的方法。
调试程序PCS5_1.ASM,使实现函数y=(a+b)2(a和b均为0-65535之间的值),并在屏幕上显示y的值(十六进制形式)。
;
PCS5-1.ASMTOBEDEBUGED
ADW125
BDW90
YDW2DUP(0)
ZDW0,0
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
求B的平方
MOVAX,A
求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
MLTENDP
DSP6PROC;
显示6字节结果
LEASI,Y
ADDSI,5
MOVCX,6
L1:
MOVAL,BYTEPTR[R]
CALLDSPAL
DECSI
LOOPL1
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
DECBL
JZG4
MOVAL,BH;
再处理低4位
ANDAL,0FH
JMPG1
G4:
POPDX
POPCX
POPBX
POPAX
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.程序流程图如下图所示。
两数相乘程序流程图
DATA1DB32H,39H,30H,35H,34H;
被乘数
COUNTEQU$—DATA1;
被乘数位数
DATA2DB33H;
乘数
RESULTDBCOUNT+1DUP(0)
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK,ES;
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
DECSI
LOOPDISP1
MOVAX,4C00H
ENDSTART
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言程序设计 汇编语言 程序设计 实验 指导书