《汇编语言程序设计》实验指导书.docx

上传人:b****5 文档编号:11636991 上传时间:2023-03-29 格式:DOCX 页数:22 大小:152.33KB
下载 相关 举报
《汇编语言程序设计》实验指导书.docx_第1页
第1页 / 共22页
《汇编语言程序设计》实验指导书.docx_第2页
第2页 / 共22页
《汇编语言程序设计》实验指导书.docx_第3页
第3页 / 共22页
《汇编语言程序设计》实验指导书.docx_第4页
第4页 / 共22页
《汇编语言程序设计》实验指导书.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

《汇编语言程序设计》实验指导书.docx

《《汇编语言程序设计》实验指导书.docx》由会员分享,可在线阅读,更多相关《《汇编语言程序设计》实验指导书.docx(22页珍藏版)》请在冰豆网上搜索。

《汇编语言程序设计》实验指导书.docx

《汇编语言程序设计》实验指导书

前言

《汇编语言程序设》在计算机科学中是一门综合性的专业基础课,是计算机专业的核心课程。

它不仅是一般程序设计的基础,而且也是设计和实现编译程序、操作系统及其它系统程序和大型应用程序的重要基础。

它为后续专业课程的学习打下了理论基础和实践基础。

由于汇编语言程序设中有大量的指令,因此汇编语言程序设实验课在教学中占有重要的地位。

通过实验可以使学生更好的巩固和掌握所学的内容,进一步增强动手能力和解决实际问题的能力。

为了提高实验的效率,任课教师提前一周布置实验任务,并且进行一定的分析和讲解,要求学生进行准备工作。

准备工作包括查找资料,设计算法,写出预习报告,其中预习报告包括题目的解题思想,概要设计,实现算法的源代码清单等。

每次实验前,学生应向实验指导教师上交实验预习报告,预习报告经指导教师认可后方能进行实验。

实验完毕写出实验报告,用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

 

四.运行结果

 

五.调试分析及实验心得

 

六.源程序清单

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1