汇编语言实验.docx

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

汇编语言实验.docx

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

汇编语言实验.docx

汇编语言实验

一、实验项目名称

汇编语言程序上机过程

二、实验目的

熟练掌握汇编语言程序的编辑、调试和运行的过程和方法。

了解汇编语言程序的汇编、运行环境。

三、实验基本原理

1.掌握常用的编辑工具软件(如WORD、EDIT)、MASM和LINK的使用;

2.伪指令:

SEGMENT,ENDS,ASSUME,END,OFFSET,DUP;

3.利用的INT21H的1号功能实现键盘输入的方法;

四、主要仪器设备及耗材

PC微机

DOS操作系统或Windows操作系统

MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境

五、实验步骤

1.用用文字编辑工具(记事本或EDIT)将源程序输入,其扩展名为.ASM。

2.用MASM对源文件进行汇编,产生.OBJ文件和.LST文件。

若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。

3.用TYPE命令显示1产生的.LST文件。

4.用LINK将.OBJ文件连接成可执行的.EXE文件。

5.在DOS状态下运行LINK产生的.EXE文件。

即在屏幕上显示标题并提示你按键。

每按一键在屏幕上显示二个相同的字符,但小写字母被改成大写。

按ESC键可返回DOS。

若未出现预期结果,用DEBUG检查程序。

实验源程序:

datasegment

messagedb'Thisisasampleprogramofkeyboardanddisply'

db0dh,0ah,'Pleasestrikethekey!

',0dh,0ah,'$'

dataends

stacksegmentparastack'stack'

db50dup(?

stackends

codesegment

assumecs:

code,ds:

data,ss:

stack

start:

movax,data

movds,ax

movdx,offsetmessage

movah,9

int21h

again:

movah,1

int21h

cmpal,1bh

jeexit

cmpal,61h

jcnd

cmpal,7ah

jand

andal,11011111b

nd:

movdl,al

movah,2

int21h

jmpagain

exit:

movah,4ch

int21h

codeends

endstart

六、实验数据及处理结果

(1)程序运行结果:

(2)在DEBUG下调试:

反汇编操作:

分步调试:

七、实验总结

通过这次实验我在电脑上的实际操作和观看,以及问老师同学我了解汇编语言程序的编辑、调试和运行的过程方法和汇编语言程序的汇编、运行环境,掌握了简单的汇编语言程序编写与调试,以及在DOS状态下通过D命令、E命令、R命令、T命令、A命令、G命令,U命令、观察记个通用寄存器和标志寄存器具体结果和有关内存单元的内容。

这也是我明白了应该多上机实践,才能熟练的掌握个指令的作用,通过观察各寄存器的变化,了解程序的运行情况,这样才能很好的掌握书上的知识,不会有纸上谈兵的感觉。

 

一、实验项目名称

分支程序实验

二、实验目的

1、掌握分支程序的设计方法;

2、掌握利用DEBUG修改参数、检查结果的方法;

3、熟悉汇编语言源程序的编辑、汇编、连接及调试过程。

三.实验要求

1.编写一个程序,显示AL寄存器中的两位十六进制数

2.编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。

四、主要仪器设备及耗材

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、显示AL寄存器中的两位十六进制数:

;DISPHEX.ASM

CODESEGMENT

ASSUMECS:

CODE

START:

MOVAL,3EH

MOVBL,AL

MOVDL,AL

MOVCL,4

SHRDL,CL

CMPDL,9

JBENEXT1

ADDDL,7

NEXT1:

ADDDL,30H

MOVAH,2

INT21H;显示高位ASCII码

MOVDL,BL

ANDDL,0FH

CMPDL,9

JBENEXT2

ADDDL,7

NEXT2:

ADDDL,30H

MOVAH,2

INT21H;显示低位ASCII码

MOVAH,4CH

INT21H

CODEENDS;返回DOS

ENDSTART

2、判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“C”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入:

;DISPKEY.ASM

CODESEGEMENT

ASSUMECS:

CODE

START:

MOVAH,1

INT21H;等待键入字符,送AL

CMPAL,0DH;是否是回车符?

JZDONE;是则转DONE退出程序

CMPAL,’0’

JBNEXT

CMPAL,’9’

JACHARUP

MOVDL,AL

MOVAH,2

INT21H

JMPSTART

CHARUP:

CMPAL,41H

JBNEXT

CMPAL,5AH

JACHRDN

DISPC:

MOVDL,’C’

MOVAH,2

INT21H

NEXT:

JMPSTART

CHRDN:

CMPAL,61H

JBNEXT

CMPAL,7AH

JANEXT

JMPDISPC

DONE:

MOVAH,4CH

INT21H

CODE:

ENDS

ENDSTART

程序1的流程图:

程序2流程图:

六、实验数据及处理结果

程序1的运行结果:

程序2的运行结果:

程序1在DEBUG下的反汇编:

程序2在DEBUG下的反汇编:

七、实验总结

通过这次实验我了解了分支程序的设计方法,以及他的各种特点和作用,我下面总结一下他的特点如下:

1)顺序执行的程序称为顺序程序,其特点是每一条指令在执行过程中只被执行一次,可以在DOC中利用DEBUG修改参数、检查结果的方法;

2)分支程序的特点是运行方向是向前的,在某一种确定条件下,只能执行多个分支中的一个分支程序设计方法:

3)程序的分支一般用条件转移指令来实现,实现分支程序的设计方法是分析题意,确定算法,根据算法,画出程序框图。

根据框图编写程序。

上机调试程序。

4)分支程序设计中经常会遇到判断“相等”和“不相等”、“负”和“正”、“大于”和“小于”、“满足条件”和“不满足条件”等等。

这种判断使程序的流程不再是一条顺序执行的直线,而变为由两个或多个分支所组成的倒树型结构,其中每一个分支只有在满足条件时才被执行。

这次试验也加深了对汇编语言源程序的编辑、汇编、连接及调试过程的了解。

在以后的试验中我会更加的注重实际的操作。

 

一、实验项目名称

循环程序实验

二、实验目的

1.掌握循环程序的设计方法;

2.学会针对不同的问题,选用不同的组织循环的方法;

3.进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。

三.实验要求:

1.编写实验内容要求的两个程序;

2.写出调试以上程序,即修改程序参数,检查结果的操作方法;

3.熟悉源程序汇编、连接命令的使用方法即要回答的内容。

1.编写一个程序,显示BX寄存器中的两位十六进制数;

2.编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。

四、主要仪器设备及耗材

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源程序:

编写一个程序,显示BX寄存器中的四位十六进制数:

;DISPHEX.ASM

CODESEGMENT

ASSUMECS:

CODE

START:

MOVBX,2B3EH

MOVCX,2

TO:

MOVAL,BH

MOVDL,BH

PUSHCX

MOVCL,4

SHRDL,CL

POPCX

CMPDL,9

JBENEXT1

ADDDL,7

NEXT1:

ADDDL,30H

pushax

MOVAH,2

INT21h;显示高位ASCII码

popax

MOVDL,AL

ANDDL,0FH

CMPDl,9

JBENEXT2

ADDDL,7

NEXT2:

ADDDL,30H

pushax

MOVAH,2

INT21H;显示低位ASCII码

popax

PUSHCX

movcl,8

SHLBX,CL

POPCX

LOOPTO

MOVAH,4CH

INT21H

CODEENDS;返回DOS

ENDSTART

程序2源程序:

判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“C”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入:

;DISPKEY.ASM

CODESEGEMENT

ASSUMECS:

CODE

START:

MOVAH,1

INT21H;等待键入字符,送AL

CMPAL,0DH;是否是回车符?

JZDONE;是则转DONE退出程序

CMPAL,’0’

JBNEXT

CMPAL,’9’

JACHARUP

MOVDL,AL

MOVAH,2

INT21H

JMPSTART

CHARUP:

CMPAL,41H

JBNEXT

CMPAL,5AH

JACHRDN

DISPC:

MOVDL,’C’

MOVAH,2

INT21H

NEXT:

JMPSTART

CHRDN:

CMPAL,61H

JBNEXT

CMPAL,7AH

JANEXT

JMPDISPC

DONE:

MOVAH,4CH

INT21H

CODE:

ENDS

ENDSTART

程序1流程图:

程序2流程图:

六、实验数据及处理结果

程序1运行结果:

程序2运行结果:

程序1在DEBUG下的反汇编:

程序2在DEBUG下的反汇编:

七、实验总结

通过这次试验使我了解了什么是循环程序,从而也更加了解汇编语言的编程原理,我对循环结构有了以下的特点。

1)循环程序是由循环初始部分,循环体,环结束部分组成,其中循环初始部分是为进入循环做必要的准备工作,循环体是程序中重复执行的程序段,由两部分组成:

2)循环工作部分:

用于执行程序的实际任务;循环参数修改及循环控制部分,控制循环次数的方法有计数控制循环,用条件控制循环和用逻辑变量控制循环,为进入下一次循环,修改地址指针、计数器内容等项参数;

3)检测循环是否已执行了规定的次数,从而确定继续循环还是结束循环。

循环结束部分是进行循环之后的处理。

从实验中可以了解根据循环的类型的不同,选用不同的组织循环的方法;循环体的结构依照问题的不同,可以选择 是先判断后处理还是先处理后判断,通过实验进一步熟悉利用DEBUG程序修改参数的方法,通过doc能检查和验证结果的正确性,

这次的实验是我更发现自己的不足也更加发现了汇编语言的难学,不过在以后的学习中我会更加努力学习的。

 

一、实验项目名称

子程序实验

二、实验目的

1.掌握主程序与子程序之间的调用关系及调用方法;

2.掌握子程序调用过程中近程调用与远程调用的区别;

3.掌握通过堆栈转送参数的方法。

三.实验要求:

1.第一个实验程序用子程序的近程调用实现。

由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。

实验过程中可以从堆栈的内容看到两个子程序的返回地址值。

由于是近调用,地址值只包括返回地址的段内偏移量。

在每个子程序的执行中,检查CS值是不变的。

2.第二个程序是利用远调用的方法调用子程序的。

在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。

子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。

3.第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。

一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。

有关该方法的原理此处不再介绍。

4.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图;熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。

1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。

要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。

2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。

四、主要仪器设备及耗材

PC微机

DOS操作系统或Windows操作系统

MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境

五、实验步骤

1.编辑、汇编两个源程序,生成相应的可执行文件(.EXE)

2.用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。

特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。

3.检查程序执行的结果是否正确。

实验要求:

1.第一个实验程序用子程序的近程调用实现。

由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。

实验过程中可以从堆栈的内容看到两个子程序的返回地址值。

由于是近调用,地址值只包括返回地址的段内偏移量。

在每个子程序的执行中,检查CS值是不变的。

2.第二个程序是利用远调用的方法调用子程序的。

在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。

子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。

3.第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。

一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。

有关该方法的原理此处不再介绍。

4.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图;熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。

程序1源程序:

 

;CONV.ASN

DATASEGMENT

BUFDB0ABH,0CDH,0DEH,01H,02H,03H

DB3AH,4BH,5CH,6FH

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVCX,10

LEABX,BUF

AGAIN:

MOVAL,[BX]

CALLHEXASC

INCBX

LOOPAGAIN

MOVAH,4CH

INT21H

HEXASCPROCNEAR

MOVDL,AL

PUSHCX

MOVCL,4

SHRDL,CL

POPCX

ALLDISP;显示高位HEX数

MOVDL,AL

ANDDL,0FH

CALLDISP

RET

HEXASCENDP

DISPPROC

PUSHAX

CMPDL,9

JBENEXT

ADDDL,7

NEXT:

ADDDL,30H

MOVAH,2

INT21H;显示

POPAX

RET

DISPENDP

CODEENDS

ENDSTART

程序2源程序:

;COUNTER.ASM

DATASEGMENT

chardb'b'

CHADB0dh,0ah,'b','$'

BUFDB50H,?

50HDUP(?

DATAENDS

STACKSEGMENTSTACK

DB200DUP(?

STACKENDS

MCODESEGMENT

ASSUMECS:

MCODE,DS:

DATA,SS:

STACK

START:

MOVAX,DATA

MOVDS,AX

LEADX,BUF

MOVAH,0AH

INT21H

LEASI,BUF

MOVCL,[SI+1]

MOVCH,0;CX中为字符串长度

INCSI

INCSI;SI指向串首址TABLE

MOVAl,CHAR

MOVAH,0;AX中为待查字符

PUSHSI

PUSHCX

PUSHAX;参数送堆栈

CALLCHECK

POPAX;统计个数在AL中

MOVDx,offsetCHA

pushax

MOVAH,9

INT21H

popax

MOVDL,AL

ANDDL,0FH

CMPDL,9

JBENEXT

ADDDL,7

NEXT:

ADDDL,30H

MOVAH,2

INT21H;显示统计个数

MOVAH,4CH

INT21H

MCODEENDS

SCODESEGMENT

ASSUMECS:

SCODE

CHECKPROCFAR

PUSHBP

MOVBP,SP

MOVSI,[BP+10]

MOVCX,[BP+8]

MOVAX,[BP+6]

XORAH,AH

AGAIN:

CMPAL,[SI]

JNENEXT1

INCAH

NEXT1:

INCSI

LOOPAGAIN

MOVAL,AH

MOV[BP+10],AX

POPBP

RET4

CHECKENDP

SCODEENDS

ENDSTART

六、实验数据及处理结果

程序1运行结果:

程序2运行结果:

七、实验总结

通过实验中我主要了解了子程序的作用用法以及怎样编写程序。

以下是对它的总结:

1)子程序是在实际编程中,常常回遇到功能完全相同的程序段,不在同一程序模块,或虽在同一模块而需重复执行,但又不是连续重复执行。

2)子程序是为了避免重复编制同一段程序,节省存储空间,把程序段独立开来,附加少量额外语句,将其编制成公用子程序,供程序其他地方需要时调用,子程序是由保护现场(一些将在子程序运行时将要被破坏的寄存器的内容)依入口参数从指定位置取要加工处理的信息,加工处理,依出口参数向指定位置送经加工处理后的结果信息,返回调用程序。

3)调用子程序时一般应增加如下功能语句,想指定位置送要加工处理的信息;调用子程序。

通过实验了解主程序与子程序之间的调用关系及调用方法和子程序调用过程中近程调用与远程调用的区别和通过堆栈转送参数的方法。

 

一、实验项目名称

排序程序设计

二、实验目的

掌握数据排序的一些常用算法,了解数列的有序、无序、升序和降序的概念。

三.实验要求:

1.复习排序的几个基本算法;

2.准备数据,按选择好的算法编写源程序。

数据以DW定义和键盘输入两种方法提供。

使用“冒泡排序”法,将内存中10个数据由小到大排序(每个数为16位二进制);

四、主要仪器设备及耗材

PC微机

DOS操作系统或Windows操作系统

MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境

五、实验步骤

内容:

使用“冒泡排序”法,将内存中10个数据由小到大排序(每个数为16位二进制)

1.将编写好的源程序输入,建立源程序文件且存盘;

2.汇编、连接和运行此程序;

3.运行成功后,将程序的数据区建立方式改为键盘输入,由小到大排序改为由大到小排序,修改后重新调试、运行;

4.记录并分析排序的效率。

实验源程序:

codesegment

org100h

assumecs:

code,ds:

code

main:

jmpstart

entdb0dh,0ah,'$'

arraydw1234h,5673h,7fffh,8000h,0dffh

dw0ab5h,0369h,005fh,5634h,9069h,'$'

countequ$-array

start:

movax,code

movds,ax

movcx,count

shrcx,1

deccx

movbl,-1

again:

movdx,cx

andbl,bl

jeexit

xorbl,bl

xorsi,si

again1:

movax,array[si]

cmpax,array[si+2]

jlenchg

xchgarray[si+2],ax

movarray[si],ax

movbl,-1

nchg:

incsi

incsi

decdx

jnzagain1

loopagain

exit:

movah,1

int21h

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

当前位置:首页 > 表格模板 > 书信模板

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

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