汇编语言实验题目及测试截图456.docx
《汇编语言实验题目及测试截图456.docx》由会员分享,可在线阅读,更多相关《汇编语言实验题目及测试截图456.docx(13页珍藏版)》请在冰豆网上搜索。
汇编语言实验题目及测试截图456
实验五分支结构程序设计
实验目的
1、掌握利用无条件转移指令JMP和有条件转移指令实现多分支程序的设计方法。
2、掌握用DOS的中断调用,实现再程序执行过程中从键盘动态输入字符串的方法。
3、掌握程序中标号的定义和使用。
实验内容
实现从键盘输入一个月份数值(1-12),根据输入的月份数值显示相应的月份英文单词缩写,如输入5则显示May。
实验步骤
1、编辑下列程序:
.modelsmall
.stack
.data
mondb'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'
msg1db'Pleaseinputamonth(1-12):
',13,10,'$'
msg2db'Inputerror!
Nowtryagain...',13,10,'$'
bufferlabelbyte;定义输入月份的输入缓冲区
maxlendb3;最多2个数字,包括一个回车
actlendb?
;保存实际输入的字符个数
stringdb3dup(?
);保存输入的月份数字内容(ASCII码)
.code
.startup
shuru:
;开始输入月份编号
leadx,msg1
movah,09h
int21h;显示提示信息
leadx,buffer
movah,0ah
int21h;输入月份数值
cmpactlen,0;若没有输入月份则转出错处理
jeshuruerr
;以下判断输入月份是否合法
leadi,string
cmpactlen,2
jeda10;若输入的是2位数月份值则转到da10标号处执行
moval,string;若只输入1位数字月份值,则读出该值
andal,0fh;把ASCII码转换为对应数字
jmpjisuan
da10:
moval,string
andal,0fh;把月份数值十位的ASCII码转换为对应数字(如12月的1字)
movbl,10
mulbl
andstring[1],0fh;把月份数值个位的ASCII码转换为对应数字
addal,string[1];十位加上个位(如12月)
jisuan:
;以下计算偏移地址
cmpal,1;比1小是非法月份
jbshuruerr;若月份值小于1则转出错处理
cmpal,12
jashuruerr;比12大也是非法月份
subal,1;月份值减1
shlal,1
shlal,1;月份再乘4对应了MON字符串中从首地址开始的字符相对位置
xorah,ah;1月份从0位置开始即JAN,...5月份从位置16开始即MAY
leasi,mon;找到被显示月份字符的位置
addsi,ax
movcx,3
output:
movdl,[si];输出对应月份英文缩写
movah,2
int21h
incsi
loopoutput
.exit0
shuruerr:
leadx,msg2;输入出错时提示出错,并转到程序起始处重新执行
movah,09h
int21h
jmpshuru
end
2、程序汇编通过后,运行程序察看输出结果。
3、程序运行中不输入月份值(直接回车),或输入非法月份值,观察程序执行的情况。
实验六分支与循环混合结构程序设计
实验目的
1、掌握利用.IF语句实现分支程序的设计方法;
2、掌握利用.REPEAT语句实现循环程序的设计方法;
3、掌握DIV指令的使用特点;
4、掌握地址表的定义和使用方法。
实验内容
实现成绩单的分等级统计功能,在数据段中有成绩单的定义,并包含有若干个分数,程序根据成绩单数据的个数循环分别统计个分数段成绩的个数,最后输出个等级段的分数个数。
要求:
成绩单数据少于100字节,输出的每个档次统计值按两位数显示。
实验步骤
1、编辑下列程序:
.modelsmall
.stack
.data
HANDB42,62,68,70,79,82,85,90,95,99,66,88,78,90,98,200;成绩单
countequ$-han;记录数据个数
MEMDB6dup(0);分别用于存放各分数段成绩的个数
scoreedb10,13,'Score"E"countis:
$';定义各分数段的提示信息
scoreddb10,13,'Score"D"countis:
$'
scorecdb10,13,'Score"C"countis:
$'
scorebdb10,13,'Score"B"countis:
$'
scoreadb10,13,'Score"A"countis:
$'
scoreodb10,13,'Score"Other"countis:
$'
tabledwscoreo,scoree,scored,scorec,scoreb,scorea;定义地址表
.code
.startup
MOVCX,count
movsi,0
begin:
;统计各个分数段的成绩个数
.ifhan[si]<60
addmem[1],1
.elseifhan[si]>=60&&han[si]<=69
addmem[2],1
.elseifhan[si]>=70&&han[si]<=79
addmem[3],1
.elseifhan[si]>=80&&han[si]<=89
addmem[4],1
.elseifhan[si]>=90&&han[si]<=99
addmem[5],1
.else
addmem[0],1
.endif
incsi
loopbegin
movcx,6
.repeat;开始循环
movsi,cx
decsi
addsi,si;计算地址表中对应地址项与提示信息的对应关系
movdx,table[si]
movah,9
int21h;显示提示信息
xorah,ah
movsi,cx
MOVal,mem[si-1];读出统计好的一个数值(此处只能处理99以下的)
movbl,10
divbl;ax/10
movmem[si-1],ah;AH为余数是个位,暂时存放回该内存单元
movdl,AL;al为商是十位
adddl,30h;转换为ASCII码
MOVAH,2
INT21H;以十进制形式显示十位
MOVAH,2
movdl,mem[si-1]
adddl,30h
INT21H;再显示个位
.untilcxz;CX自动减1,减到0结束循环
.exit0
END
2、程序汇编通过后,运行程序察看输出结果。
3、修改成绩单的内容再重新汇编和运行程序,观察程序的结果变化情况。
把数据修改为22,32,48,50,69,72,85,40,75,89,66,58,48,70,78,200
4、利用DEBUG工具的U命令反汇编可执行程序,观察.IF语句及.REPEAT语句所对应的汇编指令情况。
5、利用MASM的命令行,汇编源文件并生成.LST列表文件,查看列表文件内容。
由:
masm/l+文件名生成lst
注:
实际上高级程序结构控制语句在汇编时,都转换成相应的比较指令和条件转移指令了。
高级程序结构控制语句使得程序设计、理解都变得非常方便。
生成list文件为
Microsoft(R)MacroAssemblerVersion6.15.880306/07/1119:
36:
33
6.asmPage1-1
.modelsmall
.stack
0000.data
0000162030324548HANDB22,32,48,50,69,72,85,40,75,89,66,58,48,70,78,200;成绩单
55284B59423A
30464EC8
0010=0010countequ$-han;记录数据个数
00100006[MEMDB6dup(0);分别用于存放各分数段成绩的个数
00
]
00160A0D53636F72scoreedb10,13,'Score"E"countis:
$';定义各分数段的提示信息
652022452220
636F756E7420
69733A24
002C0A0D53636F72scoreddb10,13,'Score"D"countis:
$'
652022442220
636F756E7420
69733A24
00420A0D53636F72scorecdb10,13,'Score"C"countis:
$'
652022432220
636F756E7420
69733A24
00580A0D53636F72scorebdb10,13,'Score"B"countis:
$'
652022422220
636F756E7420
69733A24
006E0A0D53636F72scoreadb10,13,'Score"A"countis:
$'
652022412220
636F756E7420
69733A24
00840A0D53636F72scoreodb10,13,'Score"Other"countis:
$'
6520224F7468
65722220636F
756E74206973
3A24
009E0084R0016R002CRtabledwscoreo,scoree,scored,scorec,scoreb,scorea;定义地址表
0042R0058R006ER
0000.code
.startup
0017B90010MOVCX,count
001ABE0000movsi,0
001Dbegin:
;统计各个分数段的成绩个数
.ifhan[si]<60
002480060011R01addmem[1],1
.elseifhan[si]>=60&&han[si]<=69
003980060012R01addmem[2],1
.elseifhan[si]>=70&&han[si]<=79
004E80060013R01addmem[3],1
.elseifhan[si]>=80&&han[si]<=89
006380060014R01addmem[4],1
.elseifhan[si]>=90&&han[si]<=99
007880060015R01addmem[5],1
.else
007F80060010R01addmem[0],1
.endif
008446incsi
0085E296loopbegin
0087B90006movcx,6
.repeat;开始循环
008A8BF1movsi,cx
008C4Edecsi
008D03F6addsi,si;计算地址表中对应地址项与提示信息的对应关系
008F8B94009ERmovdx,table[si]
0093B409movah,9
0095CD21int21h;显示提示信息
009732E4xorah,ah
00998BF1movsi,cx
009B8A84000FRMOVal,mem[si-1];读出统计好的一个数值(此处只能处理99以下的)
009FB30Amovbl,10
00A1F6F3divbl;ax/10
00A388A4000FRmovmem[si-1],ah;AH为余数是个位,暂时存放回该内存单元
00A78AD0movdl,AL;al为商是十位
00A980C230adddl,30h;转换为ASCII码
00ACB402MOVAH,2
00AECD21INT21H;以十进制形式显示十位
00B0B402MOVAH,2
00B28A94000FRmovdl,mem[si-1]
00B680C230adddl,30h
00B9CD21INT21H;再显示个位
.untilcxz;CX自动减1,减到0结束循环
.exit0
END
Microsoft(R)MacroAssemblerVersion6.15.880306/07/1119:
36:
33
6.asmSymbols2-1
SegmentsandGroups:
NameSizeLengthAlignCombineClass
DGROUP.............GROUP
_DATA.............16Bit00AAWordPublic'DATA'
STACK.............16Bit0400ParaStack'STACK'
_TEXT.............16Bit00C2WordPublic'CODE'
Symbols:
NameTypeValueAttr
@CodeSize...........Number0000h
@DataSize...........Number0000h
@Interface...........Number0000h
@Model.............Number0002h
@Startup............LNear0000_TEXT
@code.............Text_TEXT
@data.............TextDGROUP
@fardata?
...........TextFAR_BSS
@fardata............TextFAR_DATA
@stack.............TextDGROUP
HAN..............Byte0000_DATA
MEM..............Byte0010_DATA
begin.............LNear001D_TEXT
count.............Number0010h
scorea.............Byte006E_DATA
scoreb.............Byte0058_DATA
scorec.............Byte0042_DATA
scored.............Byte002C_DATA
scoree.............Byte0016_DATA
scoreo.............Byte0084_DATA
table.............Word009E_DATA
0Warnings
0Errors
4-6.确定自变量wordX中的1的最低位数(0~15),并将结果存于变量byteY中;若wordX中没有1的位,则将-1存入byteY。
实验源程序:
.modelsmall
.stack
.data
wordXdw56
byteYdb?
.code
.startup
movax,wordX
movcx,16
movdl,-1
again:
incdl
testax,1
rorax,1
loopeagain
jenotfound
movbyteY,dl
jmpdone
notfound:
movbyteY,-1
done:
movah,02h
movbl,byteY
int21h
.exit0
End
运行结果: