计算机汇编语言实验报告-.pdf

上传人:索**** 文档编号:77986729 上传时间:2023-03-16 格式:PDF 页数:21 大小:300.69KB
返回 下载 相关 举报
计算机汇编语言实验报告-.pdf_第1页
第1页 / 共21页
计算机汇编语言实验报告-.pdf_第2页
第2页 / 共21页
点击查看更多>>
资源描述

《计算机汇编语言实验报告-.pdf》由会员分享,可在线阅读,更多相关《计算机汇编语言实验报告-.pdf(21页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、汇编语言实验报告姓名:组长:张亚昊(11072107)组员:安然(11072109)完成日期:2013 年 4 月题目 1:分支程序设计【题目要求】编写程序,键入学生成绩(百分制),按 A、B、C、D 显示在屏幕上。【编程思路】输入并存储一个INT 的赋值,比较一个数值在其中的哪个分支,并现实成绩的显示(ABCDE)【程序流程图】【源代码】一、dseg segment MsgInput db 0ah,0dh,Input a score:,$MsgError db Invalid Input!,$BufInput db 5,?,5 dup(?)Grade db EDCBA,$dseg ends

2、cseg segment assume ds:dseg,cs:cseg BEGIN:开始一个 INT 的赋值比较成绩属于哪一个档数 值 在1-60 数值在60-70 数值在70-80 数值在80-90 数值在90-100 输出结果mov ax,dseg mov ds,ax Init:lea dx,MsgInput mov ah,9 int 21h lea dx,BufInput mov ah,0ah int 21h mov dl,0ah mov ah,2 int 21h mov ax,0 lea bx,BufInput+2 LoopCalc:cmp byte ptrbx,0dh je Comp

3、are cmp byte ptrbx,0 jb Error cmp byte ptrbx,9 ja Error sub byte ptrbx,0 mov cx,10 mul cx mov cx,0 mov cl,bx add ax,cx inc bx jmp LoopCalc Compare:cmp ax,100 ja Error mov cl,10 div cl cmp al,9 jbe Next1 mov al,9 Next1:cmp al,5 jae Next2 mov al,5 Next2:sub al,5 lea bx,Grade xlat mov dl,al mov ah,2 in

4、t 21h jmp Init Error:lea dx,MsgError mov ah,9 int 21h jmp Init mov ah,04ch int 21h cseg ends end BEGIN【程序测试与实现】题目 2:循环程序设计【题目要求】设有一段文字,编写一段程序查找字母a 出现的次数,并显示在屏幕上。【编程思路】输入并存储一个字符串,将字符串长度存入CL。设置计数器AX并清零,顺序遍历字符串,如果字符与A 相同,计数器+1,循环遍历CL次。显示AX中内容,就可以显示A出现的次数。【程序流程图】N 不是 A 是A Y Y 计数器 AX=0 长度存入CL 指针初始化首址比较指针

5、指向字符AX=AX+1 指针 SI+1 CL=CL-1 指针 SI+1 CL=CL-1 CL=0 CL=0?计数器 AX/10,AL=AL+30H AH=AH+30H 输出个数输入字符串存储字符串开始【源代码】STACKS SEGMENT STACK ;堆栈段 DW 128 DUP(?);注意这里只有128 个字节 STACKS ENDS DATA SEGMENT BUF DB 30H DB?DB 20H DUP(0)COUNT EQU BUF+1 STRING1 DB Count the num of A$STRING2 DB Please input a string:$DATA ENDS

6、 ENT MACRO ;宏汇编定义换行 MOV DL,0DH MOV AH,2 INT 21H MOV DL,0AH INT 21H ENDM CODE SEGMENT ASSUME DS:DATA,CS:CODE START:MOV AX,DATA MOV DS,AX MOV DX,OFFSET STRING1 ;显示标题 MOV AH,09H INT 21H ENT MOV AH,09H ;显示 *MOV AL,*MOV BL,0C1H MOV CX,20 INT 10H ENT 结束 START2:MOV DX,OFFSET STRING2 ;显示“PLEASE INPUT A STRI

7、NG”MOV AH,09H INT 21H ENT MOV DX,OFFSET BUF ;存储输入字符串 MOV AH,0AH INT 21H CMP BUF+2,0 JE EXIT CMP BUF+1,20 JG ERROR ENT XOR AX,AX ;AX作为 A的计数器,清零 MOV CH,0 MOV CL,COUNT ;循环次数存入CL,表示字符串长度 MOV SI,2 AGAIN:MOV BL,BUFSI CMP BL,a JE SAME JNE NOTSAME MOV AH,4CH INT 21H NOTSAME:INC SI LOOP AGAIN JMP PRINT SAME:

8、INC AX ;A计数器+1,表示 A出现次数 INC SI ;指针+1 LOOP AGAIN JMP PRINT PRINT:MOV DL,10 ;10给除数 DIV DL ;AX内容除 10 ADD AL,30H ;将存储在主存单元中的商数值转换为ASCII ADD AH,30H ;将存储在主存单元中的余数数值转换为ASCII MOV BH,AH MOV DL,AL ;屏幕输出商 MOV AH,02H INT 21H MOV DL,BH ;屏幕输出余数 MOV AH,02H INT 21H ENT ENT JMP START2 ;跳转重新运行程序 MOV AH,4CH INT 21H EX

9、IT:ENT MOV AH,4CH INT 21H ERROR:ENT ENT MOV DL,E ;字符串过长越界,显示E MOV AH,02H INT 21H ENT JMP START2 MOV AH,4CH INT 21H CODE ENDS ;代码段结束 END START ;汇编完成,跳START 运行程序【程序测试与实现】题目 3:子程序设计【题目要求】给定一个数组存放5 个小写字母,用地址表传递方法编写子程序,将其转换成大写字母,并显示在屏幕上。【编程思路】分别将每个字符的ascii码值减 32,然后显示在屏幕上。【程序流程图】输入子程序调用读取数据并储存将每个字母的ascii

10、码值减 32 输出【源代码】STACKS SEGMENT STACK;堆栈段DW 128 DUP(?);注意这里只有128 个字节STACKS ENDS DATA SEGMENT;数据段ARRAY DW 5 DUP(0)COUNT DW 5 RESULT DW 5 DUP(0)ADDRESS DW 3 DUP(0);定义地址表STRING1 DB Transport letters$STRING2 DB Please input 5 small letters,(0)to exit:$STRING3 DB Result is:$ATTENTION1 DB Can not input this

11、letter$DATA ENDS ENT MACRO;宏定义定义换行MOV DL,0DH MOV AH,2 INT 21H MOV DL,0AH INT 21H ENDM STACK1 SEGMENT PARA STACK;堆栈段DW 40H DUP(0)STACK1 ENDS CODE SEGMENT;代码段ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV DX,OFFSET STRING1 MOV AH,09H INT 21H ENT MOV AH,09H;显示*MOV AL,*MOV BL,0C1H MOV CX,20 INT

12、10H ENT START2:MOV DX,OFFSET STRING2;显示请输入5 个字符MOV AH,09H INT 21H XOR DX,DX MOV SI,0 LP:MOV AH,1;输入一个字符INT 21H CMP AL,0 JE EXIT CMP AL,a;判断输入字符的大小写,如果是大写,跳转到ATTENTION JB ATTENTION CMP AL,z JA ATTENTION MOV BYTE PTR ARRAYSI,AL INC SI CMP SI,5;比较 SI,5 JNE LP;如果不相等,表明未输入满5 个数,继续输入MOV ADDRESS,OFFSET ARR

13、AY;ARRAY地址存入地址表MOV ADDRESS+2,OFFSET COUNT;COUNT地址存入地址表MOV ADDRESS+4,OFFSET RESULT;RESULT地址存入地址表MOV BX,OFFSET ADDRESS;地址表装入 BX CALL TRANSPORT;调用子程序(大小写转换)ENT ENT JMP START2 MOV AH,4CH INT 21H EXIT:ENT MOV AH,4CH INT 21H ATTENTION:ENT;异常输入,提示用户LEA DX,ATTENTION1 MOV AH,9 INT 21H ENT ENT JMP START2 TRAN

14、SPORT PROC MOV SI,BX;ARRAY地址存入SI MOV DI,BX+2;COUNT地址存入DI MOV CX,DI;COUNT 内容取出,存入cx 作为计数器MOV DI,BX+4;RESULT 地址存入DI XOR AX,AX;初始化 AX LOP:MOV AX,SI;小写字母变大写SUB AX,20H MOV DI,AX;结果存入RESULT 中ADD SI,1 ADD DI,1;指向数组下一单元LOOP LOP ENT;MOV DI,$ENT MOV DX,OFFSET STRING3;显示 STRING3 MOV AH,09H INT 21H MOV DX,OFFSE

15、T RESULT;显示 result 的内容MOV AH,9 INT 21H RET TRANSPORT ENDP CODE ENDS END START;汇编完成,跳START 运行程序【程序测试与实现】题目 4:DOS功能调用【题目要求】在图形方式下,在屏幕中央绘制一个用“*”表示的矩形。【编程思路】使用指针的定位,考虑到指针初始化在最右的最上面,于是输出回车和换行可以将指针换行到中间左右,然后输出空格顶到正中间.先输入两条变长(上下)再输入左右两条变长【程序流程图】【源代码】;这是自动生成的代码模板STACKS SEGMENT STACK;堆栈段DW 128 DUP(?);注意这里只有1

16、28 个字节STACKS ENDS DATAS SEGMENT;数据段;请在这里定义您的数据DATAS ENDS CODES SEGMENT;代码段ASSUME CS:CODES,DS:DATAS START:MOV AX,DATAS;初始化MOV DS,AX PUSH CS POP DS MOV AX,12H INT 10H MOV SI,OFFSET STRING0 CALL SHOW MOV SI,OFFSET STRING1 CALL SHOW MOV SI,OFFSET STRING2 MOV CX,5 NEXT:CALL SHOW LOOP NEXT MOV SI,OFFSET S

17、TRING1 CALL SHOW MOV AH,7 将矩形的位置定位到中间输出一排星号字符串输出星号的边长INT 21H MOV AX,3 INT 10H MOV AH,4CH INT 21H SHOW:MOV DX,SI MOV AH,9 INT 21H RET STRING0 DB 10 DUP(13,10),$STRING1 DB 13,10,4 DUP(9,20H),*$STRING2 DB 13,10,4 DUP(9,20H),*,14 DUP(20H),*$CODES ENDS END START MOV AX,4C00H;退出程序INT 21H CODES ENDS END ST

18、ART 题目 5【题目要求】编写一个生成ASCII码表的程序,并显示在屏幕上。【编程思路】在内层循环写ascII 码,内层从20H 加至 7EH,满 16 个换行,显示全部的ascII码【程序流程图】【源代码】STACKS SEGMENT STACK;堆栈段DW 128 DUP(?);注意这里只有128 个字节STACKS ENDS DATA SEGMENT HEAD DB 0 1 2 3 4 5 6 7 8 9 A B C D E F$DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE ENT MACRO;宏定义换行MOV DL,0DH MOV AH,

19、2 INT 21H MOV DL,0AH INT 21H ENDM START:MOV AX,DATA MOV DS,AX LEA DX,HEAD 输出两位十六进制码低位的字符串为表头输出两位十六进制码高位,初始为2,然后递增输出 20H 的 ascII 码,依次递增,到7EH 结束程序,每 16 个换行判断十六进制码高位是将到到 8,没有返回上面的循环MOV AH,09H INT 21H XOR DX,DX ENT MOV DI,2;列标号MOV BL,;由空格开始LOOP1:MOV SI,DI ADD SI,30H MOV DX,SI;显示列标号MOV AH,02H INT 21H MOV

20、 DL,20H;空格INT 21H MOV BH,0;BH为列控制器LOOP2:MOV DL,BL;BL 存储 ASCII码MOV AH,02H;输出当前ASCII码INT 21H MOV DL,20H INT 21H INC BL;ASCII码+1 CMP BL,7FH JE EXIT INC BH;列控制计数器,达到16 换行CMP BH,16 JNE LOOP2 ENT INC DI CMP DI,8 JNE LOOP1 EXIT:MOV AH,4CH INT 21H CODE ENDS END START【程序测试与实现】题目 6【题目要求】根据提示输入任意年份,编写判断闰年的程序,如

21、果是闰年,则在屏幕上显示“this is leap year”,否则显示“this is not a leap year”。【编程思路】首先判断位数,按位读取,错误就报错,否则转换为数字年,然后判断是否为100 倍数,如果是 100 倍数则判断是否为400 倍数,是则为闰年;若不是100 倍数,就判断是否为4 的倍数,是则为闰年。【程序流程图】【源代码】DATA SEGMENT TITL DB Determine leap year$STRING1 DB Please input a year:(1-9999),0AH,0DH,$STRINGY DB 0DH,0AH,It is a leap

22、year,$STRINGN DB 0DH,0AH,It is not a leap year,$BUF DB 5;缓冲区长度 DB 0 DB 5 DUP(0);存储空间 YEAR DW 0 DATA ENDS ENTER1 MACRO ;宏汇编定义换行 MOV DL,0DH MOV AH,2 INT 21H MOV DL,0AH INT 21H ENDM CODE SEGMENT 按位读取,直接判断位数,转换为数字年,若年数不合规范报错判断是否为100 倍数判断是否为400 倍判断是否为4 倍数是则为闰年,不是不为闰年。ASSUME CS:CODE,DS:DATA START:MOV AX,D

23、ATA MOV DS,AX MOV DX,OFFSET TITL ;显示标题 MOV AH,09H INT 21H ENTER1 START2:MOV DX,OFFSET STRING1 MOV AH,09H INT 21H ;提示输入 MOV DX,OFFSET BUF MOV AH,0AH INT 21H ;输入字符串 MOV SI,OFFSET BUF+2 ;第一个输入的字符的地址给SI XOR CX,CX MOV CL,BUF+1 ;CX 存放输入字符的个数;判断输入了几位数字 CMP CX,4 JE Qian CMP CX,3 JE Bai CMP CX,2 JE Shi CMP C

24、X,1 JE Ge1 Qian:XOR AX,AX ;处理千位数 MOV AL,SI ;把千位数字给AL SUB AL,30H ;ASC转数字 MOV BX,1000 MUL BX ;各位数字乘以位权,结果存放在AX ADD YEAR,AX ;YEAR以数字形式存放用户输入的年份 INC SI Bai:XOR AX,AX ;处理百位数 MOV AL,SI SUB AL,30H MOV BX,100 MUL BX ADD YEAR,AX INC SI Shi:XOR AX,AX ;处理十位数 MOV AL,SI SUB AL,30H MOV BX,10 MUL BX ADD YEAR,AX IN

25、C SI Ge1:XOR AX,AX ;处理个位数 MOV AL,SI SUB AL,30H ADD YEAR,AX;到此,实现了把年份从ASC 格式转成数字格式;判断是否是闰年 MOV AX,YEAR MOV BL,100 DIV BL ;年份除以100 CMP AH,0 ;余数是 0 JE NEXT ;继续判断是否是400 的倍数 MOV AX,YEAR ;当 year 中存放的年份不是100 的倍数时 XOR DX,DX MOV BX,4 DIV BX CMP DX,0 ;year是 4 的倍数且不是100 的倍数 JE YES ;显示是闰年 NEXT:MOV AX,YEAR MOV B

26、X,400 DIV BX CMP DX,0 ;DX 中放余数 JE YES;显示不是闰年 NO:LEA DX,STRINGN MOV AH,09H INT 21H ENTER1 ENTER1 JMP START2 JMP EXIT;显示是闰年 YES:LEA DX,STRINGY MOV AH,09H INT 21H ENTER1 ENTER1 JMP START2 EXIT:MOV AH,4CH INT 21H CODE ENDS END START;汇编完成,跳START运行程序【程序测试与实现】【实验心得】汇编语言是一门非常重要的学科,他本质是机器语言,并且是各种高级语言的基础。虽然我看来真的是很麻烦,C+两行的事可能得写个好几十行才行。但是这毕竟是直接利用计算机物理资源的一种语言,在执行速度、程序的简洁以及计算机资源利用效率上都有不可忽视的优势,因此学习也是必要的。我通过这次实验,实践了上课时所讲的语言,更深刻地理解了汇编的意义,其实尽管汇编需要大量的编写,但每一句还是很好理解的,如果你真正沉浸在编写中,一定会获益匪浅吧。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 工作报告

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com