计算机汇编语言实验报告.docx
- 文档编号:5830669
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:27
- 大小:196.71KB
计算机汇编语言实验报告.docx
《计算机汇编语言实验报告.docx》由会员分享,可在线阅读,更多相关《计算机汇编语言实验报告.docx(27页珍藏版)》请在冰豆网上搜索。
计算机汇编语言实验报告
汇编语言实验报告
姓名:
组长:
张亚昊(11072107)
组员:
安然(11072109)
完成日期:
2013年4月
题目1:
分支程序设计
【题目要求】
编写程序,键入学生成绩(百分制),按A、B、C、D显示在屏幕上。
【编程思路】
输入并存储一个INT的赋值,比较一个数值在其中的哪个分支,并现实成绩的显示(ABCDE)
【程序流程图】
【源代码】
一、dsegsegment
MsgInputdb0ah,0dh,'Inputascore:
','$'
MsgErrordb'InvalidInput!
','$'
BufInputdb5,?
5dup(?
)
Gradedb'EDCBA','$'
dsegends
csegsegment
assumeds:
dseg,cs:
cseg
BEGIN:
movax,dseg
movds,ax
Init:
leadx,MsgInput
movah,9
int21h
leadx,BufInput
movah,0ah
int21h
movdl,0ah
movah,2
int21h
movax,0
leabx,BufInput+2
LoopCalc:
cmpbyteptr[bx],0dh
jeCompare
cmpbyteptr[bx],'0'
jbError
cmpbyteptr[bx],'9'
jaError
subbyteptr[bx],'0'
movcx,10
mulcx
movcx,0
movcl,[bx]
addax,cx
incbx
jmpLoopCalc
Compare:
cmpax,100
jaError
movcl,10
divcl
cmpal,9
jbeNext1
moval,9
Next1:
cmpal,5
jaeNext2
moval,5
Next2:
subal,5
leabx,Grade
xlat
movdl,al
movah,2
int21h
jmpInit
Error:
leadx,MsgError
movah,9
int21h
jmpInit
movah,04ch
int21h
csegends
endBEGIN
【程序测试与实现】
题目2:
循环程序设计
【题目要求】
设有一段文字,编写一段程序查找字母a出现的次数,并显示在屏幕上。
【编程思路】
输入并存储一个字符串,将字符串长度存入CL。
设置计数器AX并清零,顺序遍历字符串,如果字符与A相同,计数器+1,循环遍历CL次。
显示AX中内容,就可以显示A出现的次数。
【程序流程图】
N
不是'A'
是'A'
Y
Y
【源代码】
STACKSSEGMENTSTACK;堆栈段
DW128DUP(?
);注意这里只有128个字节
STACKSENDS
DATASEGMENT
BUFDB30H
DB?
DB20HDUP(0)
COUNTEQUBUF+1
STRING1DB'CountthenumofA$'
STRING2DB'Pleaseinputastring:
$'
DATAENDS
ENTMACRO;宏汇编定义换行
MOVDL,0DH
MOVAH,2
INT21H
MOVDL,0AH
INT21H
ENDM
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETSTRING1;显示标题
MOVAH,09H
INT21H
ENT
MOVAH,09H;显示‘*’
MOVAL,'*'
MOVBL,0C1H
MOVCX,20
INT10H
ENT
START2:
MOVDX,OFFSETSTRING2;显示“PLEASEINPUTASTRING”
MOVAH,09H
INT21H
ENT
MOVDX,OFFSETBUF;存储输入字符串
MOVAH,0AH
INT21H
CMPBUF+2,'0'
JEEXIT
CMPBUF+1,20
JGERROR
ENT
XORAX,AX;AX作为A的计数器,清零
MOVCH,0
MOVCL,COUNT;循环次数存入CL,表示字符串长度
MOVSI,2
AGAIN:
MOVBL,BUF[SI]
CMPBL,'a'
JESAME
JNENOTSAME
MOVAH,4CH
INT21H
NOTSAME:
INCSI
LOOPAGAIN
JMPPRINT
SAME:
INCAX;A计数器+1,表示A出现次数
INCSI;指针+1
LOOPAGAIN
JMPPRINT
PRINT:
MOVDL,10;10给除数
DIVDL;AX内容除10
ADDAL,30H;将存储在主存单元中的商数值转换为ASCII
ADDAH,30H;将存储在主存单元中的余数数值转换为ASCII
MOVBH,AH
MOVDL,AL;屏幕输出商
MOVAH,02H
INT21H
MOVDL,BH;屏幕输出余数
MOVAH,02H
INT21H
ENT
ENT
JMPSTART2;跳转重新运行程序
MOVAH,4CH
INT21H
EXIT:
ENT
MOVAH,4CH
INT21H
ERROR:
ENT
ENT
MOVDL,'E';字符串过长越界,显示E
MOVAH,02H
INT21H
ENT
JMPSTART2
MOVAH,4CH
INT21H
CODEENDS;代码段结束
ENDSTART;汇编完成,跳START运行程序
【程序测试与实现】
题目3:
子程序设计
【题目要求】
给定一个数组存放5个小写字母,用地址表传递方法编写子程序,将其转换成大写字母,并显示在屏幕上。
【编程思路】
分别将每个字符的ascii码值减32,然后显示在屏幕上。
【程序流程图】
【源代码】
STACKSSEGMENTSTACK;堆栈段
DW128DUP(?
);注意这里只有128个字节
STACKSENDS
DATASEGMENT;数据段
ARRAYDW5DUP(0)
COUNTDW5
RESULTDW5DUP(0)
ADDRESSDW3DUP(0);定义地址表
STRING1DB'Transportletters$'
STRING2DB'Pleaseinput5smallletters,(0)toexit:
$'
STRING3DB'Resultis:
$'
ATTENTION1DB'Cannotinputthisletter$'
DATAENDS
ENTMACRO;宏定义定义换行
MOVDL,0DH
MOVAH,2
INT21H
MOVDL,0AH
INT21H
ENDM
STACK1SEGMENTPARASTACK;堆栈段
DW40HDUP(0)
STACK1ENDS
CODESEGMENT;代码段
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETSTRING1
MOVAH,09H
INT21H
ENT
MOVAH,09H;显示‘*’
MOVAL,'*'
MOVBL,0C1H
MOVCX,20
INT10H
ENT
START2:
MOVDX,OFFSETSTRING2;显示‘请输入5个字符’
MOVAH,09H
INT21H
XORDX,DX
MOVSI,0
LP:
MOVAH,1;输入一个字符
INT21H
CMPAL,'0'
JEEXIT
CMPAL,'a';判断输入字符的大小写,如果是大写,跳转到ATTENTION
JBATTENTION
CMPAL,'z'
JAATTENTION
MOVBYTEPTRARRAY[SI],AL
INCSI
CMPSI,5;比较SI,5
JNELP;如果不相等,表明未输入满5个数,继续输入
MOVADDRESS,OFFSETARRAY;ARRAY地址存入地址表
MOVADDRESS+2,OFFSETCOUNT;COUNT地址存入地址表
MOVADDRESS+4,OFFSETRESULT;RESULT地址存入地址表
MOVBX,OFFSETADDRESS;地址表装入BX
CALLTRANSPORT;调用子程序(大小写转换)
ENT
ENT
JMPSTART2
MOVAH,4CH
INT21H
EXIT:
ENT
MOVAH,4CH
INT21H
ATTENTION:
ENT;异常输入,提示用户
LEADX,ATTENTION1
MOVAH,9
INT21H
ENT
ENT
JMPSTART2
TRANSPORTPROC
MOVSI,[BX];ARRAY地址存入SI
MOVDI,[BX+2];COUNT地址存入DI
MOVCX,[DI];COUNT内容取出,存入cx作为计数器
MOVDI,[BX+4];RESULT地址存入DI
XORAX,AX;初始化AX
LOP:
MOVAX,[SI];小写字母变大写
SUBAX,20H
MOV[DI],AX;结果存入RESULT中
ADDSI,1
ADDDI,1;指向数组下一单元
LOOPLOP
ENT
;MOV[DI],'$'
ENT
MOVDX,OFFSETSTRING3;显示STRING3
MOVAH,09H
INT21H
MOVDX,OFFSETRESULT;显示result的内容
MOVAH,9
INT21H
RET
TRANSPORTENDP
CODEENDS
ENDSTART;汇编完成,跳START运行程序
【程序测试与实现】
题目4:
DOS功能调用
【题目要求】
在图形方式下,在屏幕中央绘制一个用“*”表示的矩形。
【编程思路】
使用指针的定位,考虑到指针初始化在最右的最上面,于是输出回车和换行可以将指针换行到中间左右,然后输出空格顶到正中间.
先输入两条变长(上下)
再输入左右两条变长
【程序流程图】
【源代码】
;;这是自动生成的代码模板
STACKSSEGMENTSTACK;堆栈段
DW128DUP(?
);注意这里只有128个字节
STACKSENDS
DATASSEGMENT;数据段
;请在这里定义您的数据
DATASENDS
CODESSEGMENT;代码段
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS;初始化
MOVDS,AX
PUSHCS
POPDS
MOVAX,12H
INT10H
MOVSI,OFFSETSTRING0
CALLSHOW
MOVSI,OFFSETSTRING1
CALLSHOW
MOVSI,OFFSETSTRING2
MOVCX,5
NEXT:
CALLSHOW
LOOPNEXT
MOVSI,OFFSETSTRING1
CALLSHOW
MOVAH,7
INT21H
MOVAX,3
INT10H
MOVAH,4CH
INT21H
SHOW:
MOVDX,SI
MOVAH,9
INT21H
RET
STRING0DB10DUP(13,10),'$'
STRING1DB13,10,4DUP(9,20H),'****************$'
STRING2DB13,10,4DUP(9,20H),'*',14DUP(20H),'*$'
CODESENDS
ENDSTART
MOVAX,4C00H;退出程序
INT21H
CODESENDS
ENDSTART
题目5
【题目要求】
编写一个生成ASCII码表的程序,并显示在屏幕上。
【编程思路】
在内层循环写ascII码,内层从20H加至7EH,满16个换行,显示全部的ascII码
【程序流程图】
【源代码】
STACKSSEGMENTSTACK;堆栈段
DW128DUP(?
);注意这里只有128个字节
STACKSENDS
DATASEGMENT
HEADDB'0123456789ABCDEF$'
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
ENTMACRO;宏定义换行
MOVDL,0DH
MOVAH,2
INT21H
MOVDL,0AH
INT21H
ENDM
START:
MOVAX,DATA
MOVDS,AX
LEADX,HEAD
MOVAH,09H
INT21H
XORDX,DX
ENT
MOVDI,2;列标号
MOVBL,'';由空格开始
LOOP1:
MOVSI,DI
ADDSI,30H
MOVDX,SI;显示列标号
MOVAH,02H
INT21H
MOVDL,20H;空格
INT21H
MOVBH,0;BH为列控制器
LOOP2:
MOVDL,BL;BL存储ASCII码
MOVAH,02H;输出当前ASCII码
INT21H
MOVDL,20H
INT21H
INCBL;ASCII码+1
CMPBL,7FH
JEEXIT
INCBH;列控制计数器,达到16换行
CMPBH,16
JNELOOP2
ENT
INCDI
CMPDI,8
JNELOOP1
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
【程序测试与实现】
题目6
【题目要求】
根据提示输入任意年份,编写判断闰年的程序,如果是闰年,则在屏幕上显示“thisisleapyear”,否则显示“thisisnotaleapyear”。
【编程思路】
首先判断位数,按位读取,错误就报错,否则转换为数字年,然后判断是否为100倍数,如果是100倍数则判断是否为400倍数,是则为闰年;若不是100倍数,就判断是否为4的倍数,是则为闰年。
【程序流程图】
【源代码】
DATASEGMENT
TITLDB'Determineleapyear$'
STRING1DB'Pleaseinputayear:
(1-9999)',0AH,0DH,'$'
STRINGYDB0DH,0AH,'Itisaleapyear','$'
STRINGNDB0DH,0AH,'Itisnotaleapyear','$'
BUFDB5;缓冲区长度
DB0
DB5DUP(0);存储空间
YEARDW0
DATAENDS
ENTER1MACRO;宏汇编定义换行
MOVDL,0DH
MOVAH,2
INT21H
MOVDL,0AH
INT21H
ENDM
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETTITL;显示标题
MOVAH,09H
INT21H
ENTER1
START2:
MOVDX,OFFSETSTRING1
MOVAH,09H
INT21H;提示输入
MOVDX,OFFSETBUF
MOVAH,0AH
INT21H;输入字符串
MOVSI,OFFSETBUF+2;第一个输入的字符的地址给SI
XORCX,CX
MOVCL,BUF+1;CX存放输入字符的个数
;判断输入了几位数字
CMPCX,4
JEQian
CMPCX,3
JEBai
CMPCX,2
JEShi
CMPCX,1
JEGe1
Qian:
XORAX,AX;处理千位数
MOVAL,[SI];把千位数字给AL
SUBAL,30H;ASC转数字
MOVBX,1000
MULBX;各位数字乘以位权,结果存放在AX
ADDYEAR,AX;YEAR以数字形式存放用户输入的年份
INCSI
Bai:
XORAX,AX;处理百位数
MOVAL,[SI]
SUBAL,30H
MOVBX,100
MULBX
ADDYEAR,AX
INCSI
Shi:
XORAX,AX;处理十位数
MOVAL,[SI]
SUBAL,30H
MOVBX,10
MULBX
ADDYEAR,AX
INCSI
Ge1:
XORAX,AX;处理个位数
MOVAL,[SI]
SUBAL,30H
ADDYEAR,AX
;到此,实现了把年份从ASCⅡ格式转成数字格式
;判断是否是闰年
MOVAX,YEAR
MOVBL,100
DIVBL;年份除以100
CMPAH,0;余数是0
JENEXT;继续判断是否是400的倍数
MOVAX,YEAR;当year中存放的年份不是100的倍数时
XORDX,DX
MOVBX,4
DIVBX
CMPDX,0;year是4的倍数且不是100的倍数
JEYES;显示是闰年
NEXT:
MOVAX,YEAR
MOVBX,400
DIVBX
CMPDX,0;DX中放余数
JEYES
;显示不是闰年
NO:
LEADX,STRINGN
MOVAH,09H
INT21H
ENTER1
ENTER1
JMPSTART2
JMPEXIT
;显示是闰年
YES:
LEADX,STRINGY
MOVAH,09H
INT21H
ENTER1
ENTER1
JMPSTART2
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART;汇编完成,跳START运行程序
【程序测试与实现】
【实验心得】
汇编语言是一门非常重要的学科,他本质是机器语言,并且是各种高级语言的基础。
虽然我看来真的是很麻烦,C++两行的事可能得写个好几十行才行。
但是这毕竟是直接利用计算机物理资源的一种语言,在执行速度、程序的简洁以及计算机资源利用效率上都有不可忽视的优势,因此学习也是必要的。
我通过这次实验,实践了上课时所讲的语言,更深刻地理解了汇编的意义,其实尽管汇编需要大量的编写,但每一句还是很好理解的,如果你真正沉浸在编写中,一定会获益匪浅吧。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 汇编语言 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)