汇编上机实验二.docx
《汇编上机实验二.docx》由会员分享,可在线阅读,更多相关《汇编上机实验二.docx(16页珍藏版)》请在冰豆网上搜索。
汇编上机实验二
昆明理工大学信息工程与自动化学院学生实验报告
(201—201学年第一学期)
课程名称:
汇编与微机接口实验开课实验室:
年月日
年级
学号
姓名
成绩
实验项目名称
实验二循环及分支程序设计
指导教师
教师评语
教师签名:
年月日
一、实验目的:
1、熟悉并且掌握汇编语言的基本指令;
2、熟练地掌握循环与分支程序的设计过程;
3、掌握带符号数的比较转移指令:
JL、JLE、JG、JGE;
4、伪指令EQU及操作符'$'的使用。
5、熟悉并且掌握BIOS和DOS中断的调用方法。
二、实验要求:
A、设计要求
1、编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符,则结束程序,若为其它字符则不显示,继续等待新的字符输入。
2、提示编程:
①回车字符的ASCII码为0DH
②显示字符用INT21H的2号调用
B、设计要求
已知DATA单元开始存放三个带符号数
1、判断三个数是否同号,若同时为正,显示“+”,若同时为负,则显示“—”,否则显不“*”。
2、显示三个数中的最小值。
c、设计要求
编写7c号中断的处理程序,使得在除法溢出发生时,在屏幕上输出字符串”2LiLongzhi”,然后返回DOS。
d、设计要求
编写一个程序,接收从键盘输入的10个十进制数字,输入回车符则停止输入,然后将这些数字加密后存入内存缓冲区BUFFER。
加密表为:
输入数字:
0、1、2、3、4、5、6、7、8、9
密码数字:
7,5,9,1,3,6,8,0,2,4
提示:
加密可通过XLAT指令完成。
要求:
键盘输入通过BIOS和DOS中断分别实现。
三、实验环境
汇编程序:
MASM6.15,链接程序:
LINK.EXE,调试环境:
DEBUG.EXE,对操作系统和计算机五特殊要求,如果是WIN7以上操作系统,需要安装DOSBOX虚拟平台。
四、实验内容(算法及运行结果的截图)
先模拟c盘和设置好默认路径,后面程序则可以在该路径下直接编译、链接和运行。
后面文件分别为a.asm、b.asm、c.asm和test.asm、d.asm。
a.程序代码:
datasegment;定义数据段
DB0
dataends
codesegment
assumecs:
code,ds:
data
mainprocfar;定义main函数
pushds;对ds寄存器进栈保护
subax,ax;对ax清零
pushax;对ax寄存器进栈保护
movax,data
movds,ax;将data段地址赋值给ds
next:
movah,07h;调用int21键盘输入(无回显)功能
int21h
cmpal,0dh;回车ascall码为0dh
jEend_d
cmpal,'0';对数字处理
JGEDY0;>=0
JMPNEXT;<'0'...30H
DY0:
;数字处理函数
CMPAL,'9';因为int2107号功能字符信息存于AL中。
JLEIS_09
CMPAL,'A'
JGEDY_A;DAYUA
JMPNEXT;<'A'...41H
DY_A:
CMPAL,'Z'
JLEIS_AZ
CMPAL,'a'
JGEDY_xA;DAYUxA
JMPNEXT;<'a'...61H
DY_xA:
CMPAL,'z'
JLEIS_AZ
JMPNEXT
IS_AZ:
MOVAH,02
MOVDL,'c'
INT21H
JMPNEXT
IS_09:
MOVAH,2
MOVDL,AL
INT21H
JMPNEXT
end_d:
ret;用于调用返回
mainendp
codeends
endmain
程序运行截图:
b.程序代码:
data_Csegment
DATADB5,6,7;编程所用3个数,该处3数值可任意设定
A1DB0
A2DB0
A3DB0
DISP_MESSDB0DH,0AH,'MINIS:
';输出字符串
D1DB0
D2DB0,'H$'
data_Cends
codesegment
assumecs:
code,ds:
data_C
mainprocfar
pushds;寄存器进栈保护
subax,ax;ax寄存器清零
pushax;寄存器进栈保护
movax,data_C
movds,ax;将数据段地址赋值给ds
MOVBX,OFFSETDATA;将数据段首地址赋值给bx
MOVAL,[BX]
INCBX
MOVAH,[BX]
CMPAL,AH;将bx值取出并进行判断是否已取完
JLALAL1;ALXCHGAH,AL
ALAL1:
INCBX
MOVDL,[BX]
CMPAL,DL
JLALAL
XCHGAL,DL
ALAL:
CMPAH,DL
JLAL_SMALL
XCHGAH,DL
AL_SMALL:
MOVA1,DL
MOVA2,AH
MOVA3,AL
XORDL,AL;最大和最小数异或
ANDDL,80H
NOTDL
TESTDL,80H;高位为1表示一正一负,否则为全负或全正
JEYZYF
ANDAL,80H
NOTAL
TESTAL,80H;高位为1表示全负
JEQF
MOVAH,02
MOVDL,'+'
INT21H
JMPDISP_SMALL
QF:
MOVAH,02
MOVDL,'-'
INT21H
JMPDISP_SMALL
YZYF:
MOVAH,02
MOVDL,'*'
INT21H
DISP_SMALL:
MOVAL,A3
MOVAH,AL
ANDAX,0F00FH
MOVCL,4
SHRAH,CL
CMPAH,0AH
JGEIS_AZ
ADDAH,30H
MOVD1,AH
JMPNN_1
IS_AZ:
ADDAH,40H-0AH+1
MOVD1,AH
NN_1:
CMPAL,0AH
JGEIS_AZ1
ADDAL,30H
MOVD2,AL
JMPNN_2
IS_AZ1:
ADDAL,40H-0AH+1
MOVD2,AL
NN_2:
MOVAH,09
MOVDX,OFFSETDISP_MESS
INT21H
ret
mainendp
codeends
endmain
程序运行截图:
c.程序代码:
c.asm:
assumecs:
code
codesegment
start:
movax,cs
movds,ax;将代码段地址交给ds
movsi,offsetdo0
movax,0
moves,ax
movdi,200h
movcx,offsetdo0end-offsetdo0;计算输出字符串长度
cld
repmovsb
;设置中断向量表
movax,0
moves,ax
movwordptres:
[7ch*4],200h
movwordptres:
[7ch*4+2],0
movax,4c00h
int21h
do0:
jmpshortdo0start
db"2LiLongzhi",0;设置输出字符串
do0start:
pushcx
movax,cs
movds,ax
movsi,202h
movax,0b800h;指向显存
moves,ax
movdi,12*160+30*2;使其显示于屏幕中央
show:
movcl,[si]
movch,0
jcxzreturn
moves:
[di],cl
movch,2
moves:
[di+1],ch
incsi
adddi,2
jmpshow
return:
popcx
movax,4c00h
int21h
do0end:
nop
codeends
endstart
test.asm:
assumecs:
code
codesegment
start:
int7ch
movax,4c00h
int21h
codeends
endstart
程序运行截图:
d.程序代码:
datasegment
msgdb'pleaseinputtennumber:
',0dh,0ah,'$'
buferdb10dup(?
)
mimadb7,5,9,1,3,6,8,0,2,4
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movsi,offsetbufer
movbx,offsetmima
movdx,offsetmsg
movah,09
int21h
movcx,10
input:
movah,01
int21h
movah,0
andal,0fh
movdi,ax
moval,[bx][di]
mov[si],al
incsi
loopinput
movah,4ch
int21h
codeends
endstart
程序运行截图:
五、实验总结(程序的优缺点,不足和改进的过程)
这次实验的内容是循环和分支程序设计,我们之前学过了一些转移指令,如jmp指令可以修改CS,IP的值;jcxz指令为有条件转移指令,当cx=0时转移到标号处执行;loop指令为循环指令,每循环一次cx=cx-1,cx不为0转移到标号处执行,当cx=0时结束循环。