广工汇编语言程序设计实验报告.docx
- 文档编号:9691215
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:26
- 大小:805.57KB
广工汇编语言程序设计实验报告.docx
《广工汇编语言程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《广工汇编语言程序设计实验报告.docx(26页珍藏版)》请在冰豆网上搜索。
广工汇编语言程序设计实验报告
汇编语言实验报告
题目:
1、实验方法
2、用表格形式显示字符
3、分类统计字符个数
4、查找电话号码
学生学院计算机学院
专业班级06
学号31
学生姓名_______________
指导教师
2008年6月1日
计算机学院06专业2班__组、学号3姓名协作者_________教师评定
实验题目实验方法
实验一
一、实验目的与要求
掌握用汇编语言设计、编写、调试和运行程序的方法。
掌握debug程序的各种操作命令,熟悉程序的调试及其技巧。
二、实验内容
比较字符串sample.asm(文件名)
试编写一程序:
比较两个字符串stringl和string2所含的字符是否相同。
若相同则显示‘Match’,否则,显示‘Nomatch’。
三、实验步骤
1.调用字处理程序wordstar或记事本建立asm文件
建立sample.asm源文件如图1.1所示:
;*********************************************
datareasegment;definedatasegment
string1db'Movethecursorbackward.'
string2db'Movethecursorbackward.'
;
mess1db'Match.',13,10,'$'
mess2db'Nomatch!
',13,10,'$'
datareaends
;*********************************************
prognamsegment;definecodesegment
;-------------------------------------------------------------------
mainprocfar
assumecs:
prognam,ds:
datarea,es:
datarea
start:
;startexecutionaddress
;setupstackforreturn
pushds;saveolddatasegment
subax,ax;pushzeroinAX
pushax;saveitonstack
;setDSregistertocurrentdatasegment
movax,datarea;datareasegmentaddr
movds,ax;intoDSregister
moves,ax;intoESregister
;MAINPARTOFPROGRAMGOESHERE
leasi,string1
leadi,string2
cld
movcx,25
repzcmpsb
jzmatch
leadx,mess2
jmpshortdisp
match:
leadx,mess1
disp:
movah,09
int21h
ret;returntoDOS
mainendp;endofmainpartofprogram
;-----------------------------------------------------------------------
prognamends;endofcodesegment
;************************************************
endstart;endassembly
图1.1源文件sample.asm
2.用汇编程序masm(或asm)对源文件汇编产生目标文件obj
C:
>masmsample;
3.用连接程序link产生执行文件exe
C:
>linksample
4.执行程序
可直接从DOS执行程序如下:
C:
>sample
Match.
终端上已显示出程序的运行结果。
为了调试程序的另一部分,可重新进编辑程序修改两个字符串的内容,使他们互不相同。
如修改后的数据区为:
;*********************************************
datareasegment;definedatasegment
string1db'Movethecursorbackward.'
string2db'Movethecursorforward.'
;
mess1db'Match.',13,10,'$'
mess2db'Nomatch!
',13,10,'$'
datareaends
;*********************************************
然后,重新汇编、连接、执行,结果为:
C:
>sample
Nomatch!
至此,程序已经调试完毕,运行结果正确。
另一种调试程序的方法是使用debug程序。
可调用如下:
C:
>debugsample.exe
可先用u命令显示程序,以便了解指令地址。
显示结果如图1.2所示:
图1.2用debug调试时,u命令的显示情况
将断点设置在程序的主要部分运行以前,同时根据其中指示的DS寄存器内容查看数据段的情况如下:
可用e命令修改数据区的字符串,操作如下图所示,再次用d命令查看修改结果。
用g命令运行程序,结果为:
-g
Nomatch!
用q命令退出debug
-q
至此程序已调试完毕。
四、心得体会
通过这次实验主要是学习使用debug调试程序,掌握对程序的调试方法。
虽然在调试过程中有遇到一定的难处,但是通过反复实验和同学的帮助还是能够比较顺利的完成的。
个人觉得这个调试方法比较不直接点,不过相信应该有它的独到之处吧。
计算机学院0专业2班__组、学号31姓名协作者_________教师评定
实验题目用表格形式显示字符
实验二
一、实验目的与要求
学习用汇编语言设计与编写循环程序。
题目:
用表格形式显示ASCII字符SMASCII
二、实验内容
按15行×16列的表格形式显示ASCII码为10H---100H的所有字符,即以行为主的顺序及ASCII码递增的次序一次显示对应的字符。
每16个字符为一行,每行中的相邻两个字符之间用空白符(ASCII为0)隔开。
三、实验步骤
1.输入的源文件为print.asm,以下为源代码:
.modelsmall
.stack200h
.data
.code
start:
movcl,16;初始化列数计数为16
movch,15;初始化行数计数为15
movdh,10h;初始化dh为10h
po:
deccl;列数计数减1
movah,02h;输出该字符
movdl,dh
int21h
incdh;令dh为下一个字符的ASCⅡ值
movah,02h;输出空格
movdl,0
int21h
cmpcl,0;若列数计数cl为0
jzmo;即已输出了16个字符则跳转换行
jmppo;否则继续执行输出下一个字符的操作
mo:
movcl,16;换行,重新置列数计数为16
movah,02h;输出回车符
movdl,0dh
int21h
movah,02h
movdl,0ah;输出换行符
int21h
decch;换行,则使行数计数ch减1
cmpch,0;若ch为0
jzno;则跳转至结束程序
jmppo;否则继续执行输出下一行字符的操作
no:
movax,4c00h
int21h
endstart
2.汇编并连接文件后,生成exe文件,运行结果如下:
四、心得体会
编写中使用了功能号为02的输出功能调用,同时由于逐个显示相继的ASCII字符,需要保存并不断修改dl寄存器的内容,而显示空白、回车、换行符时也需要使用dl寄存器,故要使用堆栈来保存相继的ASCII字符。
同样的,在实验过程中遇到了一些难点和想不通的地方,幸运的是,有老师的指点和同学的帮助,使我能够完成这个实验。
同时也让我感受到细心,谨慎对我们学汇编语言的重要性,有一点点失误就使整个程序不能运行了。
计算机学院专业2班__组、学号
姓名协作者_________教师评定
实验题目分类统计字符个数
实验三
一、实验目的与要求
学习用汇编语言编写与设计分支循环程序。
题目:
分类统计字符个数COUNT_CHAR
二、实验内容
程序接收用户键入的一行字符(字符个数不超过80个,该字符串用回车符结束),并按字母、数字及其他字符分类计数,然后将结果存入以letter、digit和other为名的存储单元中。
三、实验步骤
1输入的源文件为count_c.asm的源代码:
datasgsegment
stringlabelbyte
maxdb80
actdb?
stokndb80dup(?
)
digitdb0
Letterdb0
otherdb0
mess1db'Pleaseinputchars:
','$'
mess2db0dh,0ah,'$'
mess3db'digit:
','$'
mess4db'letter:
','$'
mess5db'other:
','$'
mess6db'h','$'
ndb3
datasgends
;
codesgsegment
assumecs:
codesg,ds:
datasg
COUNT_CHARprocfar
pushds
subax,ax
pushax
movax,datasg
movds,ax
leadx,mess1;输出字符串
movah,09
int21h
leadx,string
movah,0ah;换行
int21h
leadx,mess2
movah,09h;输出字符串
int21h
leasi,stokn
subch,ch
movcl,act
again:
;判断ASCLL
moval,[si]
cmpal,30h
jlother1
cmpal,3ah
jldigit1
cmpal,41h
jlother1
cmpal,5bh
jlletter1
cmpal,61h
jlother1
cmpal,7bh
jlletter1
other1:
;处理其他字符,计数加一
incother
incsi
loopagain
jmpprint
digit1:
;处理数字,计数加一
incdigit
incsi
loopagain
jmpprint
letter1:
;处理字母,计数加一
incletter
incsi
loopagain
print:
movch,2
movbl,digit
leadx,mess3
movah,09
int21h
rotate:
;转换16进制
movcl,4
rolbl,cl
moval,bl
andal,0fh
addal,30h
cmpal,3ah
jlprint1
addal,7h
print1:
movdl,al
movah,2
int21h
decch
jnzrotate
leadx,mess6
movah,09
int21h
decn
cmpn,2
jzletter2
cmpn,1
jzother2
jmpexit
letter2:
leadx,mess4
movah,09
int21h
movch,2
movbl,letter
jmprotate
other2:
leadx,mess5
movah,09
int21h
movch,2
movbl,other
jmprotate
exit:
;结束退出
ret
COUNT_CHARendp
codesgends
endCOUNT_CHAR
2编并连接文件后,生成exe文件,debug调试程序:
输入字符为1234[%$#@]abcd^_^.结果如下:
四、心得体会
编写程序主要用0a号功能输入字符串,同时练习设计分支结构的程序,为以后的编程打下基础.次实验程序分支较多,刚开始不懂得如何用DEBUG查询,后来在老师的帮助下终于知道原来通过查看寄存器内容得到结果的。
计算机学院专业2班__组、学号姓名王楚青协作者_________教师评定
实验题目查找电话号码
实验四
一、实验目的与要求
学习用汇编语言设计与编写子程序。
题目:
查找电话号码phone
二、实验内容
(1)要求程序建立一个可存放50项的电话号码表,每项包括人名(20个字符)及电话号码(8个字符)两部分;
(2)程序可接受输入人名及相应的电话号码,并把它们加入电话号码表中;
(3)凡有新的输入后,程序应按人名对电话号码表重新排序;
(4)程序可接受需要查找电话号码的人名,并从电话号码表中查出其电话号码,再在屏幕上以如下格式显示出来。
nametel.
××××××××
三、实验步骤
1.输入的源文件为phone.asm,以下为源代码:
OUTPUTMACROMESS;定义输出字符串宏操作
MOVAH,9
LEADX,MESS
INT21H
ENDM
;----------------------------------
DATASEGMENT
NAMEPARLABELBYTE
MAXNLENDB21
NAMELENDB?
NAMEFLDDB21DUP(?
)
;
PHONEPARLABELBYTE
MAXPLENDB9
PHONELENDB?
PHONEFLDDB9DUP(?
)
;
NAMECTRDB0
PHONECTRDB0
ENDADDRDW?
;
TEL_TABDB50DUP(28DUP('')),'$';电话号码表
TELSAVDB28DUP(?
),'$'
SWAPPEDDB0
;;提示信息
MESS1DB'Inputname:
$'
MESS2DB'Inputatelephonenumber:
$'
MESS3DB'Doyouwantatelephonenumber?
(Y/N)$'
MESS4DB'NAME$'
MESS5DB'TEL.$'
MESS6DB16DUP(''),'$'
MESS7DB'NAME?
$'
DATAENDS
CODESEGMENT
MAINPROCFAR
ASSUMECS:
CODE,DS:
DATA
START:
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVES,AX
;-----------------------------------------------
LEADI,TEL_TAB
LOOP1:
OUTPUTMESS1
CALLINPUT_NAME;输入名字
CALLCRLF
CMPNAMELEN,0;当输入字符为回车符结束输入记录
JZLOOP2
CALLSTOR_NAME;保存名字
OUTPUTMESS2
CALLINPHONE;输入并保存个人电话号码
CALLCRLF
JMPLOOP1
LOOP2:
CALLNAME_SORT;按人名对电话号码表重新排序
LOOP3:
OUTPUTMESS3
MOVAH,1;接收单个字符
INT21H
CMPAL,'n';若为’n’退出程序
JZQUIT
CMPAL,'N';若为’N’退出程序
JZQUIT
CALLCRLF
OUTPUTMESS7
CALLINPUT_NAME;输入要查找人名
CALLCRLF
CALLNAME_SEARCH;按人名查找记录
OUTPUTMESS4
OUTPUTMESS6
OUTPUTMESS5
CALLCRLF
CALLPRINTLINE;按要求输出信息
CALLCRLF
JMPLOOP3
QUIT:
MOVAH,4CH
INT21H
MAINENDP
;----------------------------------------
INPUT_NAMEPROCNEAR;接受人名
MOVAH,0AH;0A号功能调用接收人名
LEADX,NAMEPAR
INT21H
;
CMPNAMELEN,0
JZEXIT
MOVBH,0
MOVBL,NAMELEN
MOVCX,21
SUBCX,BX
INPUT_XH:
MOVNAMEFLD[BX],20H
INCBX
LOOPINPUT_XH
EXIT:
RET
INPUT_NAMEENDP
;-----------------------------------
STOR_NAMEPROCNEAR;把人名存入电话号码表tel_tab中
INCNAMECTR
CLD
LEASI,NAMEFLD
MOVCX,10
REPMOVSW;人名从缓冲区传送到tel_tab
RET
STOR_NAMEENDP
;------------------------------------
INPHONEPROCNEAR;接受电话号码,并存入电话号码表tel_tab中
MOVAH,0AH;0A号功能调用接受电话号码
LEADX,PHONEPAR
INT21H
MOVBH,0
MOVBL,PHONELEN
MOVCX,9
SUBCX,BX
INPHONE_XH:
MOVPHONEFLD[BX],20H
INCBX
LOOPINPHONE_XH
INCPHONECTR
CLD
LEASI,PHONEFLD
MOVCX,4
REPMOVSW;电话号码从缓冲区送到tel_tab
RET
INPHONEENDP
;----------------------------------
NAME_SORTPROCNEAR;对电话号码表按人名排序(冒泡法)
SUBDI,56
MOVENDADDR,DI
XH1:
MOVSWAPPED,0;SWAPPED为记录转换次数
LEASI,TEL_TAB
XH2:
MOVCX,28
MOVDI,SI
ADDDI,28
MOVAX,DI
MOVBX,SI
REPECMPSB
JBEXH3
CALLEXCHANGE
XH3:
MOVSI,AX
CMPSI,ENDADDR
JBEXH2
CMPSWAPPED,0
JNZXH1
RET
NAME_SORTENDP
;----------------------------------
EXCHANGEPROCNEAR;冒泡法中交换记录
MOVCX,14
LEADI,TELSAV
MOVSI,BX
REPMOVSW
;
MOVCX,14
MOVDI,BX
REPMOVSW
;
MOVCX,14
LEASI,TELSAV
REPMOVSW
;
MOVSWAPPED,1
RET
EXCHANGEENDP
;--------------------------------------
NAME_SEARCHPROCNEAR;在电话号码表中查找所要的电话号码
LEASI,NAMEFLD
LEADI,TEL_TAB
SEARCH_XH1:
MOVCX,20
REPCMPSB;缓冲区字符串与tel_tab记录比较
JESEARCH_XH2
ADDDI,8
LEASI,NAMEFLD
JMPSEARCH_XH1
SEARCH_XH2:
MOVSI,DI
SUBSI,20
LEADI,TELSAV
MOVCX,14
REPMOVSW;比对正确,传送记录到缓冲区以便输出
RET
NAME_SEARCHENDP
;-----------------------------------
PRINTLINEPROCNEAR;按要求格式显示人名及电话号码
MOVAH,9
LEADX,TELSAV
INT21H
RET
PRINTLINEENDP
;-----------------------------------
CRLFPROCNEAR;输出回车换行符
MOVDL,0DH
MOVAH,2
INT21H
MOVDL,0AH
INT21H
RET
CRLFENDP
;----------------------------------
CODEENDS
ENDSTART
2.各个模块说明:
由于各个模块基本上是并行方式共存,故模块层次为main模块之下有以下模块并行,这些模块分别是INPUT_NAME、STOR_NAME、INPHONE、NAME_SORT、EXCHANGE、NAME_SEARCH和PRINTLINE。
各模块说明:
(1)模块名:
main为总控模块
输入:
接受从键盘输入的人名及其电话号码,存入tel_tab中。
输出:
接受从键盘输入的欲查找记录的人名,再按要求格式输出记录。
功能:
显示提示符’Inputname:
’,调用子程序INPUT_NAME接收人名,调用子程序STOR_NAME把人名存入电话号码表tel_tab中,显示提示符’Inputatelep
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)