最新版汇编实验报告88112359.docx
《最新版汇编实验报告88112359.docx》由会员分享,可在线阅读,更多相关《最新版汇编实验报告88112359.docx(40页珍藏版)》请在冰豆网上搜索。
![最新版汇编实验报告88112359.docx](https://file1.bdocx.com/fileroot1/2023-5/15/22fead02-a282-4df2-bd40-5b93ae73f4c5/22fead02-a282-4df2-bd40-5b93ae73f4c51.gif)
最新版汇编实验报告88112359
汇编实验报告
姓名:
管仕敏
班级:
软件124
学号:
指导老师:
陆勤
实验一汇编运行环境及方法、简单程序设计
1.程序说明:
本程序用来比较两个字符串string1和string2所含的字符是否相同。
若相同则显示‘Match’,否则显示‘Nomatch’。
在程序的数据段先定义两个字符串string1和string2,再定义两个字符串mess1和mess2,分别代表‘Match’和‘Nomatch’。
再代码段比较字符串string1和string2,通过比较判断是否相同。
若相同则显示‘Match’,否则显示‘Nomatch’。
2.程序代码(比较两字符串):
datareasegment
string1db'Movethecursorbackward.'
string2db'Movetheecursorbackward.'
mess1db'Match.''$'
mess2db'Nomatch!
''$'
datareaends
prognamsegment
mainprocfar
assumecs:
prognam,ds:
datarea,es:
datarea
start:
pushds
subax,ax
pushax
movax,datarea
movds,ax
moves,ax
leasi,string1
leadi,string2
cld
movcx,25
repzcmpsb
jzmatch
leadx,mess2
jmpshortdisp
match:
leadx,mess1
disp:
movah,09
int21h
ret
mainendp
prognamends
endstart
3.截图:
该程序是用来判断两字符串string1和string2是否相同,相同则显示match。
实验二用DEBUG编程:
使用堆栈段将AX和BX的内容进行交换等
1.程序说明:
(1)设堆栈指针SP=2000H,AX=3000H,BX=5000H;编一程序段将AX和BX的内容进行交换。
请用堆栈作为两寄存器交换内容的中间存储单元,用DEBUG调试程序进行汇编与调试。
(2)设DS=当前段地址,BX=0300H,SI=0002H;请用DEBUG的命令将存储器偏移地址300H~304H连续单元顺序装入0AH,0BH,0CH,0DH,0EH。
在DEBUG状态下送入下面程序,并用单步执行的方法,分析每条指令源地址的形成过程,当数据传送完毕时,AX中的内容是什么。
2.程序代码:
MOVAX,BX
MOVAX,0304H
MOVAX,[0304H]
MOVAX,[BX]
MOVAX,0001[BX]
MOVAX,[BX][SI]
MOVAX,0001[BX][SI]
HLT
3.截图:
先使用-r设置sp,ax,bx,在使用-a输入指令然后再-t单步调试
刚开始ax3000,bx5000debug调试后ax,5000bx3000
首先用-r设置bx,si然后再用-e将a,b,c,d,e分配到指定的内存中,-a输入指令最后-t单步调试
执行单步调试后ax的值一直变化从000E,0B0A,0C0B,0D0C,0E0D
实验三存储器块清零和内存块移动
1.程序说明:
第一个程序是存储块清零。
程序流程大概为首先设置起始地址,然后设置块长度,然后将当前地址内容清零,地址加1,然后查看是否清除完全,若没有则回到当前地址清零,然后再查看,直到地址内容清除完,结束程序。
第二个程序是内存块移动。
程序流程框图为:
首先设置块的源地址,然后设置筷的目的地址,然后再设置移动长度,然后按长度重复传送数据,然后结束。
2.调试及截图:
第一个程序进入debug先用-u指令查看程序代码然后-d查看内存的情况再执行-g讲程序执行完在用-d查看内存
第二个程序进入debug后先用-u查看程序然后-g运行到指令repmovsd之前再用–d查看内存的内容
-g前
-g后
实验四将键盘输入的小写字母用大写字母显示出来
1.程序说明:
本程序用来将小写字母转变为大写,并在屏幕上显示出来。
先利用DOS功能调用INT21H的1号功能从键盘输入字符,然后判断输入的是否是小写字母,若不是小写字母,则显示输入出错,重新输入。
若输入的是小写字母,则通过将其减去20h,从而变为大写字母。
在通过DOS功能调用INT21H的2号功能显示出来。
若输入的是Enter键,则结束程序。
2.程序代码:
TITLESHIYAN
CODESEGMENT
ASSUMECS:
CODE
START:
MOVAH,01H
INT21H
CMPAL,61H
JLSTART
SUBAL,20H
MOVDL,AL
MOVAH,02H
INT21H
CODEENDS
ENDSTART
3.截图:
实验五循环程序设计
1.程序说明:
第一个程序是用来显示AL寄存器中的两位十六进位制数,通过DOS功能调用INT21H的2号功能显示出来。
第二个程序是用来判别键盘上输入的字符:
若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符,z则结束程序,若为其他字符则不显示,继续等待新的字符输入。
首先输入一个字符,将其和回车字符比较,若是回车字符,则结束程序。
1-9字符,则显示之。
若是若小于0,则重新等待输入。
若大于9,则跳转到和‘A’、Z’比较,若小于’A’,则重新等待输入,若大于’Z’,则跳转到和’a’、’z’比较处,若小于a或大于z,则重新等待输入,否则输出‘c’。
2.程序代码:
CODESEGMENT
ASSUMECS:
CODE
START:
MOVAL,3EH
PUSHAX
MOVDL,AL
MOVCL,4
SHRDL,CL
CMPDL,9
JBENEXT1
ADDDL,7
NEXT1:
ADDDL,30H
MOVAH,2
INT21H
POPAX
MOVDL,AL
ANDDL,0FH
CMPDL,9
JBENEXT2
ADDDL,7
NEXT2:
ADDDL,30H
MOVAH,2
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
3.截图:
4.程序代码:
codesegment
assumecs:
code
start:
movah,1
int21h
cmpal,0dh
jzdone
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
codeends
endstart
5.截图:
实验六分支程序设计
1.程序说明:
第一个程序是用来显示AL寄存器中的两位十六进位制数,通过DOS功能调用INT21H的2号功能显示出来。
第二个程序是用来判别键盘上输入的字符:
若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符,z则结束程序,若为其他字符则不显示,继续等待新的字符输入。
首先输入一个字符,将其和回车字符比较,若是回车字符,则结束程序。
1-9字符,则显示之。
若是若小于0,则重新等待输入。
若大于9,则跳转到和‘A’、Z’比较,若小于’A’,则重新等待输入,若大于’Z’,则跳转到和’a’、’z’比较处,若小于a或大于z,则重新等待输入,否则输出‘c’
2.程序代码:
CODESEGMENT
ASSUMECS:
CODE
START:
MOVAL,3EH
PUSHAX
MOVDL,AL
MOVCL,4
SHRDL,CL
CMPDL,9
JBENEXT1
ADDDL,7
NEXT1:
ADDDL,30H
MOVAH,2
INT21H
POPAX
MOVDL,AL
ANDDL,0FH
CMPDL,9
JBENEXT2
ADDDL,7
NEXT2:
ADDDL,30H
MOVAH,2
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
3.截图:
可以对ax的值进行修改为00ad
4.程序代码
codesegment
assumecs:
code
start:
movah,1
int21h
cmpal,0dh
jzdone
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
codeends
endstart
5.截图:
实验七统计不同成绩段学生的人数
1.程序说明:
本程序用来统计在不同分数段的学生人数并显示出来。
有三个子程序,分别用来统计各分数段的学生人数、输出相关内容、换行回车。
子程序一中,先将每个学生的分数从100、90、80、70、60逐个比较,在哪一分数段,则将其个数加一。
直到所有分数都完成比较。
子程序二则利用DOS功能调用INT21H的9号功能在显示器上显示一个字符串和2号功能在显示器上显示一个字符来实现输出相关内容。
子程序三通过DOS功能调用INT21H的2号功能在显示器上显示一个字符实现换行和回车的。
2.程序框图:
3.程序代码:
datasegment
gradedb63,100
adb'<60renshu','$'
bdb0ah,0dh,'60~70renshu:
','$'
cdb0ah,0dh,'70~80renshu:
','$'
ddb0ah,0dh,'80~90renshu:
','$'
edb0ah,0dh,'90~100renshu:
','$'
fdb0ah,0dh,'100renshu:
','$'
countdb10
dataends
stackssegment
stacksends
codesegment
assumecs:
code,ds:
data,ss:
stacks
mainprocfar
start:
movax,data
movds,ax
xorax,ax
xorbx,bx
xorcx,cx
xordh,dh
callcountgrade
calloutput
movah,4ch
int21h
mainendp
countgradeprocnear
movdi,0
io:
cmpgrade[di],60
jbl1
cmpgrade[di],70
jbl2
cmpgrade[di],80
jbl3
cmpgrade[di],90
jbl4
cmpgrade[di],100
jbl5
incal
jmpcontinue
l1:
incbh
jmpcontinue
l2:
incbl
jmpcontinue
l3:
incch
jmpcontinue
l4:
inccl
jmpcontinue
l5:
incdh
jmpcontinue
continue:
incdi
deccount
jnzio
ret
countgradeendp
outputprocnear
movah,0
pushax
pushdx
pushcx
pushbx
leadx,a;分数小于60的人数
movah,9
int21h
popbx
movdl,bh
adddl,30h
movah,2
int21h
leadx,b;分数60至69的人数
movah,9
int21h
movdl,bl
adddl,30h
movah,2
int21h
leadx,c;分数70至79的人数
movah,9
int21h
popbx
movdl,bh
adddl,30h
movah,2
int21h
leadx,d;分数80至89的人数
movah,9
int21h
movdl,bl
adddl,30h
movah,2
int21h
leadx,e;分数90至99的人数
movah,9
int21h
popbx
movdl,bh
adddl,30h
movah,2
int21h
leadx,f;分数100的人数
movah,9
int21h
popbx
movdl,bl
adddl,30h
movah,2
int21h
ret
outputendp
codeends
endstart
4.截图:
附加实验:
练习题
3.编写程序,将DATA_NUM起的一个压缩BCD码转换成十六进制数,并存放在DATA_NUM下面的相邻字节中。
DATASEGMENT
DATA_NUMDB59h
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVBX,OFFSETDATA_NUM
XORAX,AX
MOVAL,[BX];将原数保存到AL中
MOVCL,10H
MOVCH,0AH
DIVCL;除16,商为AL,余数为AH
MOVDL,AH
XORAH,AH;将AH保存到DL,并清零AH
MULCH
ADDAL,DL;将AL乘10,再加上个位
MOV[DATA_NUM+1],AL
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
结果如下图:
4.试着编写一程序,用查表法将一位十六进制数转换成与之对应的ASCII码,程序的数据段如下:
DATASEGMENT
TABDB30H,31H,32H,33H,34H,35H,36H,37H
DB38H,39H,41H,42H,43H,44H,45H,46H
HEXDB6;0BH
ASCDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVBX,OFFSETTAB
XORAH,AH
MOVAL,HEX;DECAL
ADDBX,AX
MOVAL,[BX];查表得到结果保存到AL
MOVASC,AL
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
结果如下图:
查找到6的ASCII码为36,保存到AX以及ASC中。
5.试编程求解表达式S=(2300-(X*Y+Z))/Z,其中X=600,Y=25,Z=-2000.
datasegment
Xdw600
Ydw25
Zdw-2000
Sdw?
;S=(2300-(X*Y+Z))/Z
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax;初始化ds
movax,X
mulY;ax<-X*Y
addax,Z;ax<-X*Y+Z
movbx,23000d
subbx,ax;bx<(X*Y+Z)
movax,bx
idivZ;ax=(23000-(X*Y+Z))/Z
movS,ax
movah,4ch
int21h
codeends
endstart
结果如下图:
最终结果ax=-5(FFFB),保存到S中
补充实验:
1.试编制一程序,要求从键盘上接收一个4位的16进制数,并在屏幕上显示与它等值的二进制数。
源程序代码如下:
datasegment
CRdb0ah,0dh,'$'
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
xorbx,bx
movch,4
lab1:
;循环输入四次,字符放在AL中
movah,1
int21h
cmpal,'0'
jblab1
cmpah,'9'
jbelab3;小于等于9,直接取出
cmpal,'A'
jblab1
cmpal,'F'
jbelab22
cmpal,'a'
jblab1
cmpal,'f'
jalab1
lab2:
subal,20h
lab22:
subal,37h;转换为10--15
jmplab4
lab3:
;取al低四位,正好为一位十六进制数
andal,0fh
lab4:
movcl,4
shlbx,cl
addbl,al;将低四位移到高位,加上低四位
decch
jnzlab1;循环输入
leadx,CR;换行
movah,9
int21h
movcx,16
lab5:
xordl,dl
rolbx,1;循环左移,将高位放入cf
rcldl,1;带进位循环左移,取cf到dl中
adddl,30h;转换为0或1的ASCII码
movah,2
int21h
looplab5
movah,4ch
int21h
codeends
endstart
程序运行结果如下:
2.从键盘上输入一系列字符串(以回车符结束),按字母、数字和其他字符分类计数,最后显示这三类的计数结果。
源程序代码如下:
(只能输出小于10的个数)
datasegment
adb0ah,0dh,"zimugeshu:
$"
bdb0ah,0dh,"shuzigeshu:
$"
cdb0ah,0dh,"qitazifugeshu:
$"
dataends
codesegment
assumecs:
code,ds:
data
start:
subax,ax
pushax
movax,data
movds,ax
subcx,cx
subbl,bl
lab0:
movah,1
int21h
cmpal,0dh
jzlab4;输入回车结束,否则循环输入
cmpal,'0'
jblab3
cmpal,'9'
jalab1
incch;数字计数
jmplab0
lab1:
cmpal,'A'
jblab3
cmpal,'Z'
jalab2
inccl;字母计数
jmplab0
lab2:
cmpal,'a'
jblab3
cmpal,'z'
jalab3
inccl;字母计数
jmplab0
lab3:
incbl;其他字符计数
jmplab0
lab4:
leadx,a;输出字母个数
movah,9
int21h
movdl,cl
ordl,30h;转换为数的ASCII码显示
movah,2
int21h
leadx,b;输出数字个数
movah,9
int21h
movdl,ch
ordl,30h
movah,2
int21h
leadx,c;输出其他字符个数
movah,9
int21h
movdl,bl
ordl,30h
movah,2
int21h
codeends
endstart
3.根据键盘输入的字符A-E(或a-e),分别显示ONE,TWO,THREE,FOUR,FIVE,当输入其他字符时,显示ERROR,然后重新输入。
程序源代码如下:
datasegment
messagedb0ah,0dh,'ONE','$'
db0ah,0dh,'TWO','$'
db0ah,0dh,'THREE','$'
db0ah,0dh,'FOUR','$'
db0ah,0dh,'FIVE','$'
errordb0ah,0dh,'ERROR',0ah,0dh,'$'
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movah,1
int21h;输入字符
cmpal,'A'
jberr
cmpal,'E'
jaupchar
subal,65
jmpdisp
upchar:
cmpal,'a'
jberr
cmpal,'e'
jaerr
subal,97;转换为对应的数字0-4
jmpdisp
err:
leadx,error
movah,9
int21h
jmpstart;错误字符,重新输入
disp:
movbx,8
mulb