4360111汇编语言实验报告.docx
《4360111汇编语言实验报告.docx》由会员分享,可在线阅读,更多相关《4360111汇编语言实验报告.docx(28页珍藏版)》请在冰豆网上搜索。
4360111汇编语言实验报告
南华大学
计算机科学与技术学院
实验报告
(2012—2013学年度第二学期)
课程名称:
汇编语言程序设计
实验名称:
汇编程序上机编写
姓名:
xxx
学号:
201140360111
专业班级:
网络工程01班
实验教室:
8—209
指导教师:
xxx
实验一用表格形式显示字符
一、实验目的:
用表格形式显示ASCII字符SMACII
二、实验内容:
按15*16列的表格形式显示ASCII码为10H-100H的所有字符,即以行为主的顺序及ASCII码递增的次序依次显示对应的字符。
每16个字符为一行,每行中的相邻两个字符之间用空白符隔开。
三、流程图:
N,计数器增一推入下一个值
四、程序设计和编码
;***************************************************
;作者xx
;功能:
用表格形式现实字符
;日期:
2013-5-13
;***************************************************
prognamsegment;prognam为段名,段始
assumecs:
prognam;定义代码段
start:
movah,02h;显示字符
movdl,10h;设置初始输出为ASCII的10h
movbl,15;输出显示为15行
e:
movcx,16;设置循环次数,16,表示输出显示为16列
l:
;标号,表明转移目标位置
int21h;显示输出
pushdx;推入堆栈
movah,02h;表示要进行显示
movdl,0
int21h;显示空白符
movah,02h;表示要进行显示
movdl,0
int21h;显示空白符
popdx;将栈顶元素推出,准备输出
incdl;设置下一个元素,加1指令
loopl;循环输出每行的16个ASCII元素
pushdx;将下一行的首元素推入堆栈
movah,02h
movdl,0dh;回车
int21h
movah,02h
movdl,0ah
int21h;输出换行
popdx;将栈顶元素推出
decbl;将bl寄存器减1
cmpbl,0;比较确定是否已经输出15行元素
jnee;若还未完成输出,则跳转至e,继续进行下一行元素的输出
jeexit;否则退出程序
exit:
movax,4c00h;清零
int21h
prognamends;段末
end
运行结果:
五、实验小结
通过这个小程序对汇编的思想有了一定的了解,其思想主要和寻址挂钩,本程序也用到了汇编中的循环结构,相信在不断的学习过程中,会对汇编有更深的了解。
实验二查找匹配字符串
一、目的:
查找匹配字符串SEARCH
二、实验内容
程序接收用户键入的一个关键字以及一个句子。
如果句子中不包含关键字则显示‘NOmatch!
’;如果句子中包含关键字则显示‘MATCH’,且把该字在句子中的位置用十六进制数显示出来。
三、流程图:
四、设计和编码
;***************************************************
;作者:
xx
;功能:
查找匹配字符串search
;日期:
2013-5-20
;***************************************************
DATASEGMENT
mess1DB'Enterkeyword:
','$'
mess2DB'EnterSentence:
','$'
mess3DB'Matchatlocation:
','$'
mess4DB'NOTMATCH.',13,10,'$'
mess5DB'Hifthesentence',13,10,'$'
changeDB13,10,'$'
stoknin1labelbyte
max1db10
act1db?
stokn1db10dup(?
)
stoknin2labelbyte
max2db50
act2db?
stokn2db50dup(?
)
DATAENDS
CODESEGMENT
;****************************************************
mainprocfar
assumecs:
code,ds:
data,es:
data
START:
pushds
subAX,AX
subBX,BX
subDI,DI
subSI,SI
pushAX;为返回dos并清空后面要用到的寄存器
MOVAX,DATA
MOVDS,AX
LEADX,mess1
MOVah,09
INT21h;输出Enterkeyword
LEADX,stoknin1
MOVah,0ah;用21号中段的0ah号功能获取关键字
INT21h
cmpact1,0
jeexit;如果为空直接退出程序
a10:
;********************************输入Sentence并判断
LEADX,change
MOVah,09
INT21h;输出回程,换行
LEADX,mess2
MOVah,09
INT21h;输出EnterSentence:
LEADX,stoknin2
MOVah,0ah
INT21h;用21号中段的0ah号功能获取句子
MOVAL,act1
CBW
MOVCX,AX;保存关键字长度到cx
PUSHCX;cx入栈
MOVAL,act2
cmpAL,0
jea50;保存句子长度到al,若句子为空则跳转显示notmatch
SUBAL,act1
jsa50;若句子长度小于关键字长度,则跳转显示notmatch
INCAL
CBW
LEABX,stokn2;将句子的首地址放进BX
MOVDI,0
MOVSI,0
a20:
;****************************************比较,内循环
MOVAH,[BX+DI]
CMPAH,stokn1[SI];遇见字符不相等就跳转到a30
jnea30
INCDI
INCSI
DECCX;没遇到一个相等的字符,cx-1,cx不为0则比较下一个字符,当cx为0是说明关键字比较完
CMPCX,0
jea40
jmpa20
a30:
;*****************************************外循环,BX+1,清空si,di继续内循环比较
INCBX
DECAL
cmpAL,0
jea50
MOVDI,0
MOVSI,0
POPCX
pushCX
jmpa20
a40:
;*****************************************match,将bx减去句子的首地址加一得到关键字所在位置,调用二进制转十六进制子函数将位置输出
SUBBX,offsetstokn2
INCBX
LEADX,change
MOVah,09
INT21h
LEADX,mess3
MOVah,09
INT21h
CALLbtoh
LEADX,mess5
MOVah,09
INT21h
jmpa10
;****************************************二进制转换十六进制
btohPROCNEAR
MOVCH,4
rotate:
MOVCL,4
ROLBX,CL
MOVAL,BL
andAL,0fh
addAL,30h
cmpal,3ah
jlprintit
addal,7h
printit:
MOVdl,al
MOVah,2
int21h
decch
jnzrotate
ret
btohendp
a50:
;*****************************************显示notmatch
LEADX,change
MOVah,09
INT21h
LEADX,mess4
MOVah,09
INT21h
jmpa10
exit:
ret
mainendp
CODEENDS
END
运行结果:
实验三
一、实验目的:
分类统计字符个数COUNT_CHAR
二、实验要求:
程序接收用户键入的一行字符(字数不超过80个,该字符串用回车符结束),并按字母、数字及其它字符分类计数,然后将结果存入以letter、digth和other为名的存数单元中。
三、实验提示
(1)程序可0AH功能调用把键入字符直接送到缓冲区中,然后再逐个取出分类计数。
也可01H功能调用在接收字符后先分类计数再存入缓冲区中。
(2)程序需要进入debug运行并查看计数结果。
四、设计和编码:
datasegment
stringdb80
db?
db80dup(?
);定义字符串string,长度为80
letterdb0;定义存储单元letter
digitdb0;定义存储单元digit
otherdb0;定义存储单元other
dataends
codesegment
mainprocfar
assumecs:
code,ds:
data
start:
movax,data
movds,ax
leadx,string
movah,0ah
int21h
leadi,string+2;输入一行字符,依次将每个字符存入字符串string中
subch,ch
movcl,string+1
adddx,2
check:
;将每个字符进行分类
moval,[di]
cmpal,0dh
jeexit;字符串以回车符结束,若进行分类的字符是回车符,则跳转至exit,退出程序
cmpal,30h;与ASCII码中的0,即30h比较
jbo;小于30h的,为其他类型字符,则跳转至o,在other块进行操作
cmpal,39h;与ASCII码中的9,即39h比较
jnad;不大于39h的,结合不小于30h的,则跳转至d,在digit块进行操作
jaloro;剩下的为字母或者其他类型
loro:
cmpal,41h;与ASCII码中的A,即41h比较
jbo;小于41h的,结合大于39h的,则跳转至o,在other块进行操作
cmpal,7ah;与ASCII码中的z,即7ah比较
jao;大于7ah的,则跳转至o,在other块进行操作
cmpal,5ah;与ASCII码中的Z,即5ah比较
jnal;不大于5ah的,结合大于41h的,则跳转至l,在letter块进行操作
cmpal,61h;与ASCII码中的a,即61h比较
jnbl;不小于61h的,结合不大于7ah的,则跳转至l,在letter块进行操作
jbo;小于61h的,结合大于5ah的,则跳转至o,在other块进行操作
l:
incletter;属于letter类型,则letter增1
incdi
jmpcheck;返回继续比较下一个字符
d:
incdigit;属于digit类型,则digit增1
incdi
jmpcheck
o:
incother;属于other类型,则other增1
incdi
jmpcheck
exit:
;输出letter,digit,other类型的计数结果
movah,02
movdl,0dh
int21h
movdl,0ah
int21h
movdl,4ch;输出L
int21h
movdl,3ah
int21h;输出:
movdl,0
int21h
xorax,ax
moval,letter
calldisplay;调用子程序display,输出
movah,02
movdl,0dh
int21h
movdl,0ah
int21h
movdl,44h;输出D
int21h
movdl,3ah
int21h;输出:
movdl,0
int21h
xorax,ax
moval,digit
calldisplay
movah,02
movdl,0dh
int21h
movdl,0ah
int21h
movdl,4fh;输出O
int21h
movdl,3ah
int21h;输出:
movdl,0
int21h
xorax,ax
moval,other
calldisplay
movax,4c00h
int21h
mainendp
displayprocnear;子程序display,用于将二进制数转换成十进制数
movbl,10
divbl
pushax
movdl,al
adddl,30h
movah,2
int21h
popax
movdl,ah
adddl,30h
movah,2
int21h
ret
displayendp
codeends
end
运行结果:
实验四统计学生各分数段成绩人数
一、实验目的:
统计各分数段的人数。
二、实验要求:
设有10个学生的成绩分别是76,69,84,90,73,88,99,63,100和80分。
试编制一个子程序统计60~69分,70~79分,80~89分,90~99分和100分的人数,分别存放到S6,S7,S8,S9和S10单元中。
三、流程图:
否
是
是
否
是
否
四、设计和编码
;*********************************************************
;作者xx
;功能:
统计各成绩段人数
;日期:
2013-5-13
;programtitlegoeshere--renshu
;*********************************************************
DATASSEGMENT
gradedb76,69,84,90,73,88,99,63,100,80
s6db1dup(30h)
s7db1dup(30h)
s8db1dup(30h)
s9db1dup(30h)
s10db1dup(30h)
mess6db'60-69:
$'
mess7db'70-79:
$'
mess8db'80-89:
$'
mess9db'90-99:
$'
mess10db'100:
$'
mess1db13,10,'$'
DATASENDS
stackssegment
;定义堆栈段
stacksends
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
movcx,10
;movbx,offsetgrade
xorsi,si
compare:
;movax,[bx]
cmpgrade[si],0046h
jlsix
cmpgrade[si],0050h
jlseven
cmpgrade[si],005ah
jleight
cmpgrade[si],0064h
jnenine
incs10
jmpchange_addr
six:
incs6
jmpchange_addr
seven:
incs7
jmpchange_addr
eight:
incs8
jmpchange_addr
nine:
incs9
jmpchange_addr
change_addr:
cmpcx,0
jeshow
incsi
loopcompare
show:
leadx,mess6
movah,09h
int21h
movah,02h
movdl,s6
int21h
leadx,mess1
movah,09h
int21h;输出成绩在60~69的数量
leadx,mess7
movah,09h
int21h
movdl,s7
movah,02h
int21h
leadx,mess1
movah,09h
int21h
leadx,mess8
movah,09h
int21h
movdl,s8
movah,02h
int21h
leadx,mess1
movah,09h
int21h
leadx,mess9
movah,09h
int21h
movdl,s9
movah,02h
int21h
leadx,mess1
movah,09h
int21h
leadx,mess10
movah,09h
int21h
movdl,s10
movah,02h
int21h
leadx,mess1
movah,09h
int21h
movah,4ch
int21h
CODESENDS
ENDSTART
运行结果:
实验五四分之一字节显示
一、实验目的:
四分之一字节显示
二、实验内容:
把AX中存放的16位二进制数K看作是8个二进制的"四分之一字节"。
试编写一程序片段,要求数一下值为3(即11B)的四分之一字节数,并将该数在终端上显示出来。
三、实验步骤
(1)初始化计数器count,测试K的高两位是否为11;
(2)若为11,则count加1,再逻辑左移两位;
(3)若不为11,则直接逻辑左移两位;
(4)直到数K全部逻辑左移完,将count输出在屏幕上。
三、实验流程图:
四、设计和编码:
;***************************************************
;作者:
xx
;功能:
;日期:
2013-6-05
;***************************************************
DATASSEGMENT
countdb1dup(30h);此处输入数据段代码
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
movcx,8
movbx,0ffffh
compare:
moval,bl
andal,3
cmpal,3
jeL1
jmpL2
L1:
inccount
L2:
shrbx,1
shrbx,1
loopcompare
movdl,count
movah,02h
int21h
MOVAH,4CH
INT21H
CODESENDS
ENDSTART