汇编语言程序设计报告.docx

上传人:b****5 文档编号:6826383 上传时间:2023-01-10 格式:DOCX 页数:35 大小:145.87KB
下载 相关 举报
汇编语言程序设计报告.docx_第1页
第1页 / 共35页
汇编语言程序设计报告.docx_第2页
第2页 / 共35页
汇编语言程序设计报告.docx_第3页
第3页 / 共35页
汇编语言程序设计报告.docx_第4页
第4页 / 共35页
汇编语言程序设计报告.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

汇编语言程序设计报告.docx

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

汇编语言程序设计报告.docx

汇编语言程序设计报告

 

 

综合实验报告

(2014--2015年度第一学期)

 

名称:

《汇编语言程序设计》综合实验

题目:

汇编语言程序设计

院系:

控制与计算机工程学院

班级:

计科1203

学号:

201209010324

学生姓名:

张毅民

指导教师:

王保义王蓝婧

设计周数:

一周

成绩:

日期:

2015年1月

实验一用表格形式显示字符

一、实验要求

按15*16列的表格形式显示ASCⅡ码为10H—100H的所有字符,即以行为主的顺序及ASCⅡ码递增的次序依次显示对应的字符。

每16个字符为一行,每行中的相邻两个字符之间用空白符隔开。

二、设计思路

1.设两个计数值,行和列,分别为15、16,输出一个字符,输出一个空格,字符加1,判断是否输完一行,未输出完继续输出字符。

每行输完后,输出回车换行符,判断是否输玩15行,未输出完,从新输出新的一行。

2.流程图

三、设计要点、细节

(1)显示每个字符可使用功能号为02的显示输出功能调用:

Movah,02h

Movdl,输出字符的ASCⅡ码

Int21h

将dl初始化为10H,然后使用其加1以取得下一个字符的ASCⅡ码。

(2)显示空白符是,用其ASCⅡ码置0入dl寄存器。

每行结束时,用回车和换行来结束本行并开始下一行。

(3)由于逐个显示相继的ASCⅡ码字符是,需要不断修改dl寄存器的内容,而显示空白、回车、换行也需要使用dl寄存器,为此可使用堆栈保存dx。

(即pushpop指令)

四、实验程序及调试结果

CODESSEGMENT

;**********************************************

ASSUMECS:

CODES

START:

Movbx,15

movdl,10h

loop:

movcx,16

next:

movah,02h

int21h

incdl

;-----------------输出空格

pushdx

movdl,0

int21h

popdx

loopnext;未输完一行继续输出

;--------------每行输完,输出换行回车

pushdx

movdl,0dh

int21h

movdl,0ah

int21h

popdx

decbx

jneloop;未输完15行从新输入下一行

exit:

ret

CODESENDS

ENDSTART

五、实验结果

六、实验心得

本次实验是我初次实际上机编写汇编实验,实验很简单,但在编写中出现大大下小不少问题,在修改程序的过程中也渐渐熟悉了MASM软件,并且也简单了解了调试功能。

本次实验我具体地了解到了如何输出单个字符(及2号功能调用DOS),也熟悉了用堆栈保存信息,并简单了解了循环程序设计。

 

实验二查找匹配字符串

一、实验要求

程序接受用户键入的一个关键字以及一个句子,如果句子中不包含关键字则显示“Nomatch!

”;如果句子中包含关键字则显示“match!

”,且把该字在句子中的位置用十六进制数显示出来。

要求程序的执行过程如下:

Enterkeyword:

abc

Entersentence:

wearestudyingabc

Matchatlocation:

11Hofthesentence

Entersentence:

xyz

Nomatch!

Entersentence:

二、设计思路

1.输入关键字和一个句子,分别存入相应的缓冲区中(用功能调用2ah)。

在句子中查找关键字用串比较命令cmpsb并加前缀repnz,SI为寄存器为关键字的指针,DI为寄存器为句子中正相比较的字段的指针,CX为寄存器存放关键字的字母个数(长度),整个句子和关键字的比较过程可以用一个循环结构来完成,循环次数为:

(句子长度-关键字长度)+1;在计算循环次数时,如遇到句子长度小于关键字长度的情况则应转向显示“nomatch”,循环中还需要用到BX寄存器,它用来保存句子中当前正在比较字段的首地址。

比较完成有两种情况一种为句子比较完成,一种为在句子中找到与关键字相同的段,两种区别就是cx是否为零,为零则match。

最后再用二进制转换十六进制将bx的数显示出来,即为关键字在句子中的位置。

2.流程图

 

三、设计细节、要点

(1)输入关键字和一个句子,分别存入相应的缓冲区中。

可用功能调用0AH。

(2)在句子中查找关键字:

关键字和句子中相应字段的比较可使用串比较指令。

为此必须定义附加段,但附加段和数据段可以定义为同一段,以便于串指令的使用,相应的寄存器内容也有了确定的含义,即如下:

SI寄存器为关键字的指针

DI寄存器为句子中正相比较的字段的指针

CX寄存器存放关键字的字母个数(长度)

整个句子和关键字的比较过程可以用一个循环结构来完成,循环次数为:

(句子长度-关键字长度)+1

在计算循环次数时,如遇到句子长度小于关键字长度的情况则应转向显示“nomatch”,循环中还需要用到BX寄存器,它用来保存句子中当前正在比较字段的首地址。

输出信息:

用功能调用09h分“找到”或“找不到”两种情况分别显示不同的信息。

在“找到”时,还要求显示出匹配字符串在句子中的位置,在“找到”时BX寄存器的内容为匹配字符串的首地址,将此值减到句子的首地址,再将差值加1即是所要的匹配字符串在句子中的位置,可将位置转换为十六进制。

三、实验程序

DATASSEGMENTpara'data'

mess1db'match!

',13,10,'$'

mess2db'nomatch!

',13,10,'$'

mess3db'enterkeyword:

','$'

mess4db'entersentence:

','$'

mess5db'matchatlocation:

','$'

mess6db'Hofthesentence','$'

stoknimlabelbyte

maxdb10

actdb?

stokndb10dup(?

sentencelabelbyte

madb100

acdb?

stodb100dup(?

DATASENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,es:

datas

START:

pushds

subax,ax

pushax

MOVAX,DATAS

MOVDS,AX

moves,ax

;*****************输入关键字和一个句子***********

k:

leadx,mess3

movah,09

int21h;显示字符串‘enterword’

leadx,stoknim

movah,0ah

int21h;输入关键字到缓冲区Word

pushdx

movdl,0dh

movah,02h

int21h

movdl,0ah

movah,02h

int21h;回车换行

popdx

d:

leadx,mess4

movah,09

int21h;显示字符串‘entersentence’

leadx,sentence

movah,0ah

int21h;输入句子到缓冲区sentence

pushdx

movdl,0dh

movah,02h

int21h

movdl,0ah

movah,02h

int21h;回车换行

popdx

;****************比较查找信息********************

leasi,stoknim;si指向关键字

leadi,sentence;di指向句子

movax,0

movbl,1;初始化bx

movcl,0;初始化外循环计数单元

moval,act

movah,ac

subah,al

addah,1

movcl,ah;cl中循环次数

cmpcl,0

jenomatch

a:

pushcx

movcl,al

repnzcmpsb

jzmatch

subdi,1

subsi,2

addbl,1

popcx

deccl

cmpcl,0

jnea

jenomatch

;***************输出信息*************************

match:

leadx,mess1

movah,09h

int21h;显示match

pushdx

movdl,0dh

movah,02h

int21h

movdl,0ah

movah,02h

int21h;回车换行

popdx

leadx,mess5

movah,09h

int21h;显示matchatlocation

moval,bl

andal,0fh

addal,30h

cmpal,3ah

jlp

addal,7h

p:

movdl,al

movah,02h

int21h

leadx,mess6

movah,09h

int21h

pushdx

movdl,0dh

movah,02h

int21h

movdl,0ah

movah,02h

int21h;回车换行

popdx

jmpwer

nomatch:

leadx,mess2

movah,09h

int21h;显示nomatch

pushdx

movdl,0dh

movah,02h

int21h

movdl,0ah

movah,02h

int21h;回车换行

popdx

wer:

jmpd

mainendp

CODESENDS

ENDSTART

五、实验结果

 

六、实验心得

本次是汇编第二个实验,相比第一个实验有更大难度,但是实验内容也有一定实际意义,这次编写代码比较费时费力但也收益良多。

具体地在实验中学习使用了带前缀地串比较,学会了如何在一段字符中查找目标字符。

更熟练地使用了循环程序设计,在句子位置显示部分也参照课本使用了二进制到十六进制转换,这方面知识掌握的更深入了。

这次由于时间所限,所写代码并不是十分完善,关于后续的改进,我有以下想法,上述程序,只能查找到句子中的首个关键字,即当出现关键字为a,句子为abca时,只能找到第一个a。

是由于程序设计中,当串比较match后,程序退出。

所以我的改进为在显示match及在句子中位置后,继续从上述位置继续比较,一直把句子比较完才退出程序。

这样会找到句子中所有关键字位置,更有实用价值。

 

实验三分类统计字符个数

一、实验要求

程序接受用户键入一行字符(字符个数不超过80个,该字符串用回车符结束),并按字母、数字、其它字符分类计数,然后将结果存入以letter、digit和other为名的存储单元中。

二、设计思路

1.先用01H功能调用接收一个字符,对照ASCⅡ码一步一步分类将各字符分入不同种类中并计数,最后用十进制数将各类字符数显示出来

2.流程图

三、实验程序

DATASSEGMENT

string1DB'InputYourString:

$';输入提示信息

string2DB'Digit:

$';各类字符提示信息

string3DB'ALetter:

$'

string5DB'bLetter:

$'

string4DB'Others:

$'

digitDB0;数字

letterDB0;字母

othersDB0;其他

DATASENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS

START:

movax,datas

movds,ax

leadx,string1;显示输入提示信息

movah,9

int21h

movcx,80;设置循环次数

L1:

movah,01h;中断调用,单字符输入

int21h

cmpal,0dh;若输入回车符则结束

jzover

cmpal,30h

jbOTHER;若<30H(0),others++

cmpal,39h;若>39H(9),跳转进一步比较

jaHIGHER1

jmpDIGITAL;digit++

HIGHER1:

cmpal,41h;if<41H(A),others++

jbOTHER

cmpal,5ah;if>5ah(Z),跳转继续比较

jaHIGHER2

jmpLETTER1HIGHER2:

cmpal,61h;if<61H(a),others++

jbOTHER

cmpal,7ah;if>7AH(z),others++

jaOTHER

jmpLETTER1;etter++

OTHER:

;others++

incothers

loopL1

DIGITAL:

;digit++

incdigit

loopL1

ALETTER1:

;letter++

incAletter

loopL1

OVER:

callENDLINE;回车换行

leadx,string2;输出数字个数

movah,9

int21h

xorax,ax

moval,digit;将统计的数字送AL,为输出做准备

callDISPLAY;调用输出两位数字的子程序

callENDLINE

leadx,string5;输出字母个数

movah,9

int21h

xorax,ax

moval,bletter

callDISPLAY

callENDLINE

leadx,string4;输出其他字符个数

movah,9

int21h

xorax,ax

moval,others

callDISPLAY

movah,4ch

int21h

ENDLINEPROCNEAR;控制输出格式,输出回车换行子程序

movah,2

movdl,0ah;换行

int21h

movah,2

movdl,0dh;回车

int21h

ret

ENDLINEENDP

DISPLAYPROCNEAR;输出两位数字的子程序

movbl,10;10送BL

divbl;AX/BL,AL=商,AH=余数

pushax;保存AX中的信息

movdl,al

adddl,30h

movah,2

int21h;输出十位数

popax;出栈送AX

movdl,ah

adddl,30h

movah,2

int21h;输出个位数

ret

DISPLAYENDP

CODESENDS

 

四、实验结果

 

五.实验心得

这次实验目的主要是学会分支程序设计,虽然分类繁琐,可是我感觉本次实验并不是太难

在实验中定义了letter,digit,others三个存储单元用于记录每种符号个数。

在内循环中,找出字符串属于哪类,通过与相应的ASCII码进行比较来确定相应的类别,通过比较和跳转来对不同类别的符号计数。

通过改变跳转条件可以获得更加详细的分类结果。

本次实验成功实现了题目的要求,可以统计输入字符类别的个数。

本次试验中得到的结果仍需调用相应程序将二进制数转换为十六进制并显示出来。

本实验的重点在分类,通过分支程序的角度来解决问题使问题得到简化。

实验四查找电话号码

一、实验要求

(1)要求程序建立一个可存放50项的电话号码表,每项包括人名及电话号码两部分;

(2)程序可接受输入人名及相应的电话号码,并把它们加入电话号码表中;

(3)凡有新的输入后,程序可按人名对电话号码表重新排序;

(4)程序可接受需要查询电话号码的人名,并从电话号码表中查出其电话号码,再在屏幕上以如下格式显示出来。

Nametel

××××××××

二、设计说明

(1)显示提示符’Inputname:

’;

(2)调用子程序input_name接收人名;

(3)调用子程序stor_name把人名存入电话号码表tel_tab中:

(4)显示提示符’Inputatelephonenumber:

’;

(5)调用子程序inphone接收电话号码,并把它存入电话号码表tel_tab中;

(6)如输入已结束则调用name_sort子程序对电话号码表接人名排序;

(7)显示提示符’Doyouwantatelephonenumber?

(Y/N)’;

(8)回答N收退出程序;

(9)回答Y则再显示提示符’name?

’;

(10)调用子程序input_name接收人名;

(11)调用子程序name_search在电话号码表中查找所要的电话号码;

(12)调用子程序printline按要求格式显示人名及电话号码;

(13)重复查号提示符直至用户不要求查号为止。

三、设计思路

1.模块图

 

2.主要模块流程图

 

四、模块说明

模块名

输入

输出

功能

main总控制模块

用户的各种操作选择

如选择是否继续插入,继续查询等

各种提示信息,如提示输入姓名、号码、提示是否继续操作

建立联系人号码表,对号码表人名排序,提供查询、显示功能

input_name

联系人的姓名到tname缓冲区

读入姓名到tname缓冲区并把不满20位部分补空格

name_search

tname缓冲区的姓名

查找结果放在bx寄存器

在号码表查找tname缓冲区的姓名,找到则bx存放该记录的地址,否则(bx)=-1

crlf

回车换行

输出回车换行

stor_name

tname缓冲区的姓名

把tname缓冲区的姓名移动到号码表,对应记录数tab_len增1,endaddr增28

把姓名从缓冲区移动到号码表

inphone

电话号码

把inphone缓冲区的号码移动到号码表中

读入电话号码并转存到号码表中

name_sort

从tab_len取出记录数,从endaddr取出最后一个记录地址。

号码表中只有最后一个记录无序,前面记录有序

排序

对号码表进行排序(用插入排序,每次输入一个联系人后进行排序)

print_all

号码表的地址

显示号码表中的所有电话号码

printline

要显示的联系人地址存放在bx

显示单个联系人的信息

五、实验程序

datasegsegment

nameparlabelbyte

maxnlendb21

actnlendb?

_namedb21dup(?

phoneparlabelbyte

maxplendb9

actplendb?

phonedb9dup(?

crlfdb13,10,'$'

endaddrdw?

mess1db'entername:

','$'

mess2db'enteratelephonenumber:

','$'

mess3db'Doyouwantatelephonenumber?

(Y/N)','$'

mess4db'name?

','$'

mess5db'name',16dup(''),'tel',0dh,0ah,'$'

mess6db'Notinthetable.',0dh,0ah,'$'

mess7db'Invalidinput!

',0dh,0ah,'$'

countdb0

tel_tabdb50dup(20dup(''),8dup(''))

tempdb20dup(''),8dup(''),0dh,0ah,'$'

swappeddb0

datasegends

;**********************************************************************

codesegsegment

mainprocfar

assumecs:

codeseg,ds:

dataseg,es:

dataseg

start:

pushds

subax,ax

pushax

movax,dataseg

movds,ax

moves,ax;

cld

leadi,tel_tab;di中存放表首地址

inputloop:

movah,09h

leadx,mess1

int21h

callinput_name

cmpactnlen,0;没有输入人名时

jza1;直接跳到提示是否查找的地方

cmpcount,50;输入上限

jea1

callstor_name;保存人名到tel_tab

movah,09h

leadx,mess2

int21h

callinput_stor_phone;输入并保存电话号码

jmpinputloop

a1:

cmpcount,1

jbesearchloop;如果没有输入或者输入一个

callname_sort;排序

calldisp_all;显示所有

searchloop:

leadx,mess3

movah,09h

int21h

movah,01h

int21h

cmpal,'N'

jeexit

cmpal,'n'

jeexit

cmpal,'Y'

jeshowname

cmpal,'y'

jeshowname

movah,09

leadx,crlf

int21h

leadx,mess7;非法输入

movah,09h

int21h

jmpsearchloop

showname:

movah,09

leadx,crlf

int21h

leadx,mess4;当输入

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

当前位置:首页 > 法律文书 > 调解书

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

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