汇编语言 实验报告.docx

上传人:b****4 文档编号:4909640 上传时间:2022-12-11 格式:DOCX 页数:13 大小:20.88KB
下载 相关 举报
汇编语言 实验报告.docx_第1页
第1页 / 共13页
汇编语言 实验报告.docx_第2页
第2页 / 共13页
汇编语言 实验报告.docx_第3页
第3页 / 共13页
汇编语言 实验报告.docx_第4页
第4页 / 共13页
汇编语言 实验报告.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

汇编语言 实验报告.docx

《汇编语言 实验报告.docx》由会员分享,可在线阅读,更多相关《汇编语言 实验报告.docx(13页珍藏版)》请在冰豆网上搜索。

汇编语言 实验报告.docx

汇编语言实验报告

 

大理大学

 

实验报告

 

课程名称:

微机原理与接口技术

学院:

工程学院

专业:

年级:

班级:

姓名:

羽卒兰cl学号:

指导教师:

 

2016年5月19日

大理学院教务处制

实验名称:

汇编语言实验

时间:

2016年5月19日

地点:

工科楼610

班组:

A组

教师评语

成绩

教师签名

实验报告

1 实验目的

   熟悉汇编语言语法

熟悉8086常用指令

掌握BIOS中断调用及DOS功能调用

2 实验工具

硬件配置:

微机原理实验箱(众友)一台、计算机一台

软件环境:

TD、湖北众友

3实验内容和要求

例题4.11,习题4.32,习题4.33程序后面添加注释。

4实验方法及结果

例题4.11:

在以BLOCK开始的存储区域存放着100个字节的8位带符号数,在该存储区域内找出其中的最大数和最小数,分别放在MAX和MIN单元中,编程实现(p216页)。

分析:

100个8位带符号数,从第一个数开始逐个比较,搜索其中的大数和小数,因为其中字节长度已知,可以用个数作为循环控制的计数器。

那么,每次比较,得到一个大数和小数,循环完毕,即可找到最大数和最小数。

NAMEFOUND;模块名

DATASEGMENT;定义数据段

BUFDB-2,+5,+4,-8,-70,+45,+65,+36,-36,-89,+128,+45,+88,+21,-67,-32,+70,+34,+3;定义字节数据

COUNEQU$-BUF;数据个数

MAXDB?

;放最大值的存储单元

MINDB?

;放最大值的存储单元

DATAENDS;数据段结束

STACKSEGMENTSTACK;定义堆栈段

STRDB64HDUP(?

);堆栈段占64个单元

STACKENDS;堆栈段结束

MYCODESEGMENT;定义代码段

ASSUMECS:

MYCODE,DS:

DATA,SS:

STACK

START:

MOVAX,DATA

MOVDS,AX;DS值为数据段首地址DATA,DS赋初值

MOVAX,STACK;SS值为数据段首地址STACK

MOVSS,AX;SS赋初值

MOVSP,LENGTHSTR;设堆栈段指针

MOVCX,COUN-1;实际比较次数

MOVSI,OFFSETBUF;建立地址指针

MOVAL,[SI];取第一个数放AL中,大数放AL

MOVBL,[SI];取第一个数放AL中,小数放BL

INCSI;INC加1指令,在书本p112页,目标操作数加1,取下一个数

LOP:

CMPAL,[SI];CMP比较指令,p114页,将目标操作数AL减

;源操作数[SI],其差值不送回目标操作数。

JGENEXT1;JGE大于或等于,p142页,AL>=下一个数,不交换

MOVAL,[SI];否则交换,大数在AL中

NEXT1:

CMPBL,[SI];最小数与下一个单元数比较

JLNEXT;最小值比较小,BL<=下一个数,不交换

MOVBL,[SI];否则交换,小数放BL中

NEXT:

INCSI;目标操作数加1,取下一个数

LOOPLOP;CX-1到CX,CX不等于0转LOP

MOVMAX,AL;存大数到MAX

MOVMIN,BL;存小数到MIN

MOVAH,4CH;DOS系统功能调用,p201页,

INT21H;结束本程序运行,返回DOS状态

MYCODEENDS;代码段结束

ENDSTART;整个源程序汇编结束

结果分析:

中间有两次比较判断,以便在每次循环中找到该次循环中的大数和小数,100个数比较99次,最后才找到大数放在MAX中,小数放在MIN中(p243页);

找到最大值是+128,放在MAX中,最小值是-89,放在MIN中。

习题4.32:

在键盘上输入两个字符存入A,B单元中,比较它们的大小,并在屏幕显示;A>B或A

DATASEGMENT;定义数据段

STR1DB'A>B','$';DB定义数据字节命令p185页,若字节是字符串,必须用‘’,

STR2DB'A

STR3DB'A=B','$'

DATAENDS;数据段结束

CODESEGMENT;定义代码段

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX;DS值为数据段首地址DATA,DS赋初值

MOVAH,01H;1号功能键调用(键盘输入并显示),等待标准输入设备(键盘)

;送入一个字符,并放到寄存器AL中

INT21H;AL中存放键盘输入字符的ASCII码,并在CRT屏幕上显示

MOVBL,AL;将AL寄存器中的数据放到BL寄存器中

MOVAH,01H

INT21H

CMPBL,AL;比较指令,将AL和BL寄存器中的数据进行比较

JGGOTO1;JG如大于,转移到GOTO1

JLGOTO2;JL如小于,转移到GOTO2

MOVAH,09H;9号功能键调用(屏幕显示字符串符号)

MOVDX,OFFSETSTR3;回车换行显示字符串STR3

INT21H

JMPEXIT;JMP无条件转移指令,p139页,转EXIT

GOTO1:

MOVAH,09H;9号功能键调用(屏幕显示字符串符号)

MOVDX,OFFSETSTR1;回车换行显示字符串STR1

INT21H

JMPEXIT;JMP无条件转移指令,转EXIT

GOTO2:

MOVAH,09H

MOVDX,OFFSETSTR2;回车换行显示字符串STR2

INT21H

EXIT:

MOVAH,4CH;DOS系统功能调用,p201页,

INT21H;结束本程序运行,返回DOS状态

CODEENDS;代码段结束

ENDSTART;整个源程序汇编结束

结果分析:

A输入4,B输入1,结果显示A>B;

A输入4,B输入7,结果显示A

A输入4,B输入4,结果显示A=B;

习题4.33:

将count开始存放的n个字节的字符串,统计相同字符的字符个数,找出相同字符最多的字符,存于CORE单元中(p243页)

DATASEGMENT;定义数据段

STR1DB'ABCDBBBBDFDSASNMMSWA';定义字符串

CHARDB?

;?

表示仅分配1个储存单元,并不存入如何数据

NUMDB0;定义一个变量num并初始化其内存单元,统计相同字符的字符个数

DATAENDS;数据段结束

CODESEGMENT;定义代码段

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX;DS值为数据段首地址DATA,DS赋初值

MOVSI,OFFSETSTR1;字符串STR1偏移地址

MOVAL,[SI];取第一个数放AL中,放AL

MOVCHAR,AL;返回参数AL

MOVAH,01H;1号功能键调用(键盘输入并显示)

COUNT:

MOVBX,SI;SI寄存器的个数传送到BX寄存器,计数

COUNT2:

INCBX;取BX寄存器的下一个

CMPBX,OFFSETCHAR;比较取的字符与BX中的字符是否相同

JZREPLACE;结果为零,转REPLACE

CMPAL,[BX];两个数比较

JNZCOUNT2;结果不为零,转COUNT2

INCAH;加1指令

MOVbyteptr[BX],0;取到BX里面数为0

JMPCOUNT2;无条件转移COUNT2

REPLACE:

CMPNUM,AH;比较相同字符的字符个数

JGNEXT;JG如大于,转移到NEXT

MOVNUM,AH;放相同字符的字符个数

MOVCHAR,AL;放字符

NEXT:

INCSI;指向下一个数据

CMPSI,OFFSETCHAR;比较相同字符个数是否相同

JZEXIT;结果为零,转EXIT

MOVAL,[SI];取字符串中的字符放AL中,放AL

CMPAL,0;比较AL与0

JZNEXT;结果为零,转EXIT

MOVAH,01H;1号功能键调用(键盘输入并显示)

JNZCOUNT;结果不为零,转COUNT

EXIT:

MOVAH,4CH;DOS系统功能调用,p201页

INT21H;结束本程序运行,返回DOS状态

CODEENDS;代码段结束

ENDSTART;整个源程序汇编结束

结果分析:

此题找到相同字符最多的字符B,存于CORE单元。

附加题:

例4.1(p173页)要求把3个16位数相加,其和仍为16位数。

NAMEADDHEX

STACKSEGMENTSTACK'STACK';定义堆栈段

STAPNDB100DUP(?

);定义堆栈段的100个字节的连续存储区

TOPEQULENGTHSTAPN;定义符号TOP,其数值为堆栈区长度

STACKENDS;定义堆栈段结束

DATASEGMENT;定义数据段

NUM1DW1234H;定义16位数1234H,放在变量NUM1中

NUM2DW5678H;定义16位数5678H,放在变量NUM2中

NUM3DW0ABCDH;定义16位数ABCDH,放在变量NUM3中

ANSDW?

;定义变量ANS,存放相加之和

DATAENDS;定义数据段结束

CODESEGMENT;定义代码段

ASSUMECS:

MYCODE,DS:

DATA,SS:

STACK

START:

MOVAX,DATA

MOVDS,AX;DS值为数据段首地址DATA,DS赋初值

MOVAX,STACK;SS值为数据段首地址STACK

MOVSS,AX;SS赋初值

MOVSP,TOP;堆栈指针赋值

MOVAX,NUM1;取被加数

ADDAX,NUM2;第一个数和第二个数相加,和放在AX中

ADDAX,NUM3;再加上第三个数,和放在AX中

MOVANS,AX;存三个数相加之和

MOVAH,4CH;DOS系统功能调用,p201页

INT21H;结束本程序运行,返回DOS状态

CODEENDS;代码段结束

ENDSTART;整个源程序汇编结束

例4.6(p212页)编写计算Z=(X^2-3*Y)/2的程序。

设X、Y均为单字节整数,结果Z仍为1个字节。

DATASEGMENT

XDB25

YDB32

ZDW?

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA;初始化DS

MOVDS,AX

MOVAL,X

MULAL;A=X^2,源操作数*AL送到AX里

MOVBX,0;把BX清零

MOVBL,Y

ADDBL,BL

ADCBH,0;处理前面BL+BL的进位

ADDBL,Y;3*Y

ADCBH,0;考虑进位

SUBAX,BX;X^2-3*Y

SHRAX,1;(X^2-3*Y)/2

MOVZ,AX;保存结果

MOVAH,4CH

INT21H;返回DOS

CODEENDS

ENDSTART;汇编结束

例4.7(p213页)在存储变量DAT1开始有两个字节的无符号加数,在存储变量DAT2开始有两个字节的无符号被加数,求两个数的和并放在DAT3单元中,设二进制数在存储单元存放的顺序为,低字节在低地址上,高字节在高地址上。

NAMEMYPROG

DATASEGMENT

DAT1DB5EH,89H

DAT2DB40H,0ABH

DAT3DW?

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVSI,0;位移量初值

MOVAL,DAT1[SI];取被加数低位5EH

ADDAL,DAT2[SI];两数相加40H+5EH

MOVDAT3[SI],AL

INCSI;加1指令,调整位移量

MOVAL,DAT1[SI];取被加数高位89H

ADCAL,DAT2[SI];带进位加

MOVDAT3[SI],AL

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

大小写互换

DATASEGMENT

BEFOREDB'Beforechange:

',0DH,0AH,'$'

AFTERDB'Afterchange:

',0DH,0AH,'$'

BUFDB'CHANGEasdaAJBHBJBabA',0DH,0AH,'$'

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

BEGIN:

MOVAX,DATA

MOVDS,AX

MOVDX,OFFSETBEFORE

MOVAH,09H

INT21H

MOVDX,OFFSETBUF

MOVAH,09H

INT21H

MOVCL,14H

MOVSI,OFFSETBUF

LOOP1:

MOVAL,[SI]

CMPAL,'A'

JBJ

CMPAL,'Z'

JABG

ADDAL,20H

JMPJ

BG:

CMPAL,'a'

JBJ

CMPAL,'z'

JAJ

SUBAL,20H

JMPJ

J:

MOV[SI],AL

INCSI

DECCL

JNZLOOP1

MOVDX,OFFSETAFTER

MOVAH,09H

INT21H

MOVDX,OFFSETBUF

MOVAH,09H

INT21H

MOVAH,01H

INT21H

EXIT:

MOVAH,4CH

INT21H

CODEENDS

ENDBEGIN

5实验总结

汇编语言是一种符号语言,用助记符表示操作码,用符号或符号地址表示操作数或操作数地址,它与机器指令是一一对应的。

1.汇编语言程序结构

基本程序结构有三种:

顺序结构、分支选择结构和循环结构。

P212页

DATASEGMENT

<数据定义伪指令序列>》源程序由若干条语句组成

DATAENDS》程序由最多4个段组成,

STACKSEGMENTSTACK数据段、堆栈段、代码段、附加段

<数据定义伪指令序列>》每个段有一名字,

STACKENDS并以符合SEGMENT表示段的开始,

CODESEGMENT以END作为段的结束符号

<程序段>

CODEENDS

ENDS

2.汇编语言上机操作步骤

(1)用编辑程序建立.ASM源文件;

(2)用宏汇编程序MASM等汇编源文件,生成.OBJ目标码文件;

(3)用连接程序LINK对目标码文件等模块进行连接,生成.EXE可执行文件;

(4)键入可执行文件名执行该文件,分析执行结果;

(5)用DEBUG等工具调试.ASM源程序,再汇编、连接、运行,直到得出正确结果。

为此,除了DOS系统软件和编辑程序外,还需要备置如下程序:

汇编程序masm.exe或asm.exe或tasm.exe等

连接程序link.exe或tlink.exe等

汇编调试程序等

交叉引用程序cref.exe符号索引文件处理程序等

3.汇编语言程序调试方法

DEBUG.COM程序是一个有效的动态调试工具,用于实现系统维护。

1、DEBUG的启动

DEBUG的启动格式如下:

DEBUG[<文件说明>][<参数>]

其中,文件说明指被调试的程序的全名,参数是该程序所涉及的参数,下面是几个启动DEBUG的例子。

C>DEBUGDISKCOPY.COMA:

B:

C>DEBUGTT.COM

C>DEBUG

第一句是启动DISKCOPY文件,执行从A:

拷贝到B:

的操作。

第二句是调试TT.COM程序。

第三句是启动DEBUG,不装入文件。

DEBUG装入内存后,接着就从磁盘上查找被调试的程序,找到后将其装入内存(对于后缀为EXE的文件,DEBUG将它装入到最低可用的区段中,并从100H开始装入),然后显示出提示符“一”。

等待用户进一步输入命令。

DEBUG命令中使用的地址格式约定如下:

[<段地址>:

]<位移量>

其中<段地址>可以是段寄存器名,或者是十六进制数,也可以默认。

例如:

CS:

0100

2212:

0100

而地址范围的格式为:

<段地址>:

<始位移量><末位移量>

<段地址>:

<始位移量>L<长度>

[例l]列写地址范围。

CS:

100100

2123:

100L10

2、退出DEBUG

当完成动态调试任务时,可使用Q命令。

格式如下:

Q

键入Q之后,自动退到DOS状态下。

3、DEBUG的主要命令

D,显示内存单元内容;U,反汇编命令;

R,显示与修改寄存器内容;E,修改内存单元内容;

A,汇编命令;T、P,单步执行指令;

G,连续执行指令;N,指定装入文件名或写入文件名;

L,装入N指定的文件;W,将指定内容写入N指定的文件;

Q,退出DEBUG程序,返回操作系统状态。

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

当前位置:首页 > 总结汇报 > 其它

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

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