中南大学汇编实验报告.docx
- 文档编号:24897520
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:24
- 大小:197.75KB
中南大学汇编实验报告.docx
《中南大学汇编实验报告.docx》由会员分享,可在线阅读,更多相关《中南大学汇编实验报告.docx(24页珍藏版)》请在冰豆网上搜索。
中南大学汇编实验报告
计算机汇编语言
实验报告
学院:
信息科学与工程学院
专业班级:
指导老师:
学号:
姓名:
目录
汇编语言实验一4
一、实验目的4
二、实验要求4
三、实验编程5
四、DEBUG命令:
6
五、运行界面7
六、心得体会9
汇编语言实验二9
一、实验目的9
二、二进制到十六进制转换程序9
1、思路方法9
2、程序代码10
3、程序截图11
三、起泡排序算法的程序实现12
1、方法思路12
2、程序代码12
3、程序截图14
汇编语言实验三15
一、实验目的15
二、实验要求15
三、实验内容求(Fibonacci递归数)15
四、程序代码16
五、实验心得18
汇编语言实验四19
一、实验目的19
二、实验要求19
三、实验内容(分类统计字符个数)19
四、程序代码20
五、实验心得23
汇编语言实验一
一、实验目的
学习程序设计的基本方法和技能,熟练掌握用汇编语言设计、编写、调试和运行程序的方法,熟悉DEBUG调试程序和DOS功能表的查看,为后续实验打下坚实基础。
二、实验要求
通过实验掌握下列知识:
1、8086指令:
MOV,ADD,ADC,SUB,SBB,DAA,XCHG
2、DEBUG命令:
A,D,E,F,H,R,T,U。
3、ASCII码及用16进制数表示二进制码的方法。
4、8086寄存器:
AX,BX,CX,DX,F,IP。
三、实验编程
'HelloWorld'程序:
DATASSEGMENT
STRINGDB13,10,'HelloWorld!
',13,10,'$'
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
LEADX,STRING
MOVAH,9
INT21H
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
四、DEBUG命令:
1、打DEBUG进入DEBUG,显示提示苻'_'。
2、退出DEBUG命令:
Q
3、显示内存命令:
D起始地址结束地址
4、修改内存命令:
E起始地址,连续修改打空格键。
打回车键退出E命令。
5、检查寄存器命令:
R
6、修改寄存器命令:
R寄存器名
7、小汇编命令:
A起始地址,不输入指令打回车键退出A命令。
8、反汇编命令:
U起始地址结束地址
9、文件命名命令:
N盘号:
文件名
10、读文件命令:
L内存地址
11、写文件命令:
W内存地址
10、读扇区命令:
L内存地址盘号(0--A:
1--B:
)扇区号扇区数
11、写扇区命令:
W内存地址盘号扇区号扇区数
12、运行命令:
G=起始地址结束(断点)地址
13、单步命令:
T=起始地址运行指令数,进入子程序内部。
14、单步命令:
P=起始地址运行指令数,不进入子程序内部。
15、内存搬家命令:
M起始地址结束地址目的地址
五、运行界面
六、心得体会
Masm的debug功能使我对程序在寄存器内如何处理更加了解,使我明白了汇编的本质,能够加速我们学习和掌握这一门课程,所以我们应该好好利用程序的调试功能。
汇编语言实验二
一、实验目的
(1) 掌握循环程序的设计方法
(2)掌握汇编语言源程序的编辑、汇编、连接及调试过程。
(3)进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。
(4) 学会针对不同的问题,选用不同的组织循环的方法。
二、二进制到十六进制转换程序
1、思路方法
根据题意把bx的内容从左到右每4位一组在屏幕上显示出来显然这可以用循环结构来完成,每次循环显示一个十六进制数位,因而循环次数是已知的计数值为4.循环体体中则应包括从二进制到所显示字符的ASCII之间的转换,以及每个字符的实现,后者可以使用DOS功能调用来实现。
这里采用了循环移位的方法吧所要显示的4位二进制数移到最右边,以便做数字到字符的转化工作,另外,由于数字0~9的ASCII为30~39H,而字母A~F的ASCII为41~46H,所以在把4位二进制数加上30H后还需做一次判断,如果字符为A~F,则还应加上7才能显示正确的十六进制数。
2、程序代码
DATASEGMENT
BUFADW0001001000110100B;1234H
BUFBDB4dup(?
)
DB'H',0DH,0AH,'$';输出缓冲区
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,BUFA
MOVSI,OFFSETBUFB
MOVCH,4;循环控制十六进制数显示位数
MOVCL,4
ROTATE:
ROLDX,CL;循环左移4位,将高位十六进制数移到低位
MOVBX,DX;保护移动后的数
ANDDX,0FH;屏蔽掉高位保留该低位数
CMPDL,9
JGL
ADDDL,30H
MOV[SI],DL
INCSI
JMPNEXT
L:
ADDDL,37H
MOV[SI],DL
INCSI
NEXT:
DECCH
MOVDX,BX
JNZROTATE
MOVAH,9
LEADX,BUFB
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
3、程序截图
该段用于输入需转化的二进制数
程序输出:
三、起泡排序算法的程序实现
1、方法思路
采用起泡排序算法,从第一个数开始依次对相邻两个数比较,如次序对,则不做任何操作,如次序不对,则使两个数交换位置。
在做了第一遍的n-1次比较后,最大的数已经被放在了最后面,所以第二遍只需考虑n-1个数,即只需比较n-2次…总共最多n-1遍就可完成排序。
2、程序代码
DATASSEGMENT
ADW12,17,9,3,28,97,54,20,20,67;此处进行数据的初始化
NEQU10
MDW10D
BUF1DB'SequenceBeforeSort:
','$'
BUF2DB0DH,0AH,'SequenceAfterSort:
','$'
DATASENDS
STACKSSEGMENT
DW100DUP(?
)
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS,ES:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
MOVDX,OFFSETBUF1;显示未排序的提示符
MOVAH,09H
INT21H
MOVCX,N
LEASI,A
LOOP1:
CALLDISPLAY;进行未排序的数据显示
LOOPLOOP1
;开始排序
CLD
MOVCX,N-1
LOOP2:
PUSHCX
LEASI,A;取数据区的第一个数的偏移量
LODSW;取第1个数存入AX
LP1:
MOVBX,AX;开始内部排序第5-CX次
LODSW;取第6-CX个数
CMPBX,AX;比较两个数大小
JLL1;前面数小的话符合要求跳转,大的话换位
MOV[SI-2],BX;大的数到后面
MOV[SI-4],AX;小的数到前面
MOVAX,[SI-2];改变AX的值
L1:
LOOPLP1;小循环CX减1
POPCX;弹出外部循环计数
LOOPLOOP2
;输出排序后的结果
MOVDX,OFFSETBUF2
MOVAH,09H
INT21H
MOVCX,N;因为有十个数,所以计数寄存器CX置十
LEASI,A
LOOP3:
CALLDISPLAY;排序后结果显示
LOOPLOOP3
MOVAH,4CH
INT21H
DISPLAYPROC;转换子程序(SI指针由外部提供,方便选择要显示的东西)
LODSW
MOVBX,3;数据在十进制时的是三位数所以计数部分BX置三
Z1:
CWD
DIVM;采用除以10的方法不断得到每一位数
PUSHDX;将每一位压入栈
DECBX
JNZZ1
MOVBX,3
Z2:
POPDX;压完一个数后立即出栈进行显示
ADDDL,30H
DECBX
MOVAH,2
INT21H
JNZZ2
MOVDL,20H;每个数据间由空格隔开
MOVAH,2
INT21H
RET;子程序结束
DISPLAYENDP
CODESENDS
ENDSTART
3、程序截图
汇编语言实验三
一、实验目的
掌握子程序的设计方法,熟悉递归程序的设计
二、实验要求
掌握递归程序的调用、返回及入口、出口的传递方法
三、实验内容求(Fibonacci递归数)
程序接受由用户键入的数N,根据给定的N值,计算Fibonacci数
Fibonacci数的公式如下:
Fib
(1)=1;当n=1
Fib
(2)=1;当n=2
Fib(n)=Fib(n-1)+Fib(n-2)
四、程序代码
DATASSEGMENT
M1DB13,10,'Pleaseinputn=$'
M2DB13,10,'FibonacciSequenceis:
$'
NDW?
F1DW0
F2DW1
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
LEADX,M1
MOVAH,9
INT21H
CALLINPUT
CMPCX,1
JBEXIT
MOVN,CX
LEADX,M2
MOVAH,9
INT21H
MOVDL,'1'
MOVAH,2
INT21H
MOVDL,''
INT21H
DECN
JZEXIT
LP:
MOVAX,F1
ADDAX,F2
JCEXIT
MOVBX,F2
MOVF1,BX
MOVF2,AX
CALLOUTPUT
MOVDL,''
MOVAH,2
INT21H
DECN
JNZLP
EXIT:
MOVAH,4CH
INT21H;返回DOS
;
INPUT:
MOVBL,10
MOVCX,0
IN_X:
MOVAH,7
INT21H
CMPAL,13
JEIN_END
CMPAL,'0'
JBIN_X
CMPAL,'9'
JAIN_X
MOVDL,AL
MOVAH,2
INT21H
MOVAL,DL
SUBAL,30H
MOVAH,0
XCHGAX,CX
MULBL
ADDCX,AX
CMPCH,0
JNZIN_END
JMPIN_X
IN_END:
RET
;
OUTPUT:
MOVBX,10
MOVCX,0
OL1:
MOVDX,0
DIVBX
ADDDL,'0'
PUSHDX
INCCX
CMPAX,0
JNZOL1
MOVAH,2
OL2:
POPDX
INT21H
LOOPOL2
RET
;
CODESENDS
ENDSTART
五、实验心得
子程序是模块化程序设计的基础。
在程序的不同部分用到类似的程序段,其功能和结构形式都相同,只是某些变量的赋值不同,就可以将这些程序段写成子程序形式,在需要时就能进行调用。
并且过程的正确执行由子程序的正确调用和正确返回来保证。
因此对于子程序的设计调用有利于我们更好地进行模块化编程。
在设计过程中,应注意子程序的入口、出口及返回,一旦有误,整个程序的执行结果都不会如意。
斐波那契程序的实现要考虑到对输入进行判断,如是否是字母或其他字符,当输入符合要求时,才开始向下进行,重复调用递归程序,直到达到相应次数,将结果进行返回输出。
汇编语言实验四
一、实验目的
掌握分支程序设计的原理与方法,重点掌握各种程序中形成和判断条件而产生的程序段的设计方法和技巧
二、实验要求
掌握分支程序的调用及基本子程序的编写,判断程序运行的顺序
三、实验内容(分类统计字符个数)
程序接受用户输入一行字符,并按照字符串中字符所属的类型分类,将结果输出(例如:
aaabb1234&中,字母5,数字4,其他字符1)
四、程序代码
DATASSEGMENT
STRING1DB'Pleaseinputastring:
$';输入提示信息
STRING2DB'Numberofletters:
$';各类字符提示信息
STRING3DB'Numberofdigits:
$'
STRING4DB'Numberofothers:
$'
CHARSDB0;字母
DIGITDB0;数字
OTHERSDB0;其他
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
LEADX,STRING1;显示输入提示信息Pleaseinputastring
MOVAH,09H
INT21H
MOVCX,100;设置循环次数足够大
L1:
MOVAH,01H;中断调用,单字符输入
INT21H;输入符号的ASCII代码在AL寄存器中
CMPAL,0DH;若输入回车符则结束
JZOVER2
CMPAL,30H;若<30H(0),OTHERS++
JBOTHER
CMPAL,39H;若>39H(9),跳转进一步比较
JAHIGHER1
JMPDIGITAL;DIGIT++
HIGHER1:
CMPAL,41H;若IF<41H(A),OTHERS++
JBOTHER
CMPAL,5AH;若IF>5AH(Z),跳转继续比较
JAHIGHER2
JMPCHAR;ALPHAU++
HIGHER2:
CMPAL,61H;若IF<61H(a),OTHERS++
JBOTHER
CMPAL,7AH;若IF>7AH(z),OTHERS++
JAOTHER
JMPCHAR;ALPHAU++
JMPOVER;比较结束
OTHER:
INCOTHERS;OTHERS++
JMPOVER;比较结束
CHAR:
INCCHARS;ALPHAL++
JMPOVER;比较结束
DIGITAL:
INCDIGIT;DIGIT++
JMPOVER;比较结束
JMPOVER;比较结束
OVER:
NOP
LOOPL1;循环,输入下一字符
OVER2:
CALLENDLINE;回车换行
LEADX,STRING2;字符串的输出Numberofletters
MOVAH,09H
INT21H
XORAX,AX
MOVAL,CHARS;将统计的数字送AX
CALLDISPLAY;调用输出两位数字的子程序
CALLENDLINE
LEADX,STRING3;字符串的输出Numberofdigits
MOVAH,09H
INT21H
XORAX,AX
MOVAL,DIGIT;将统计的数字送AX
CALLDISPLAY;调用输出两位数字的子程序
CALLENDLINE
LEADX,STRING4;字符串的输出Numberofothers
MOVAH,09H
INT21H
XORAX,AX
MOVAL,OTHERS;将统计的数字送AX
CALLDISPLAY;调用输出两位数字的子程序
MOVAH,4CH
INT21H
ENDLINEPROCNEAR;控制输出格式,输出回车换行子程序
MOVAH,02H
MOVDL,0AH
INT21H;输出换行符
MOVAH,02H
MOVDL,0DH
INT21H;输出回车符
RET
ENDLINEENDP
DISPLAYPROCNEAR;输出两位数字的子程序(输出两位数字为十进制)
MOVBL,10
DIVBL;AX/BL,AL=商,AH=余数
PUSHAX;保存AX中的信息
MOVDL,AL
ADDDL,30H
MOVAH,02H
INT21H;输出十位数
POPAX;出栈送AX
MOVDL,AH
ADDDL,30H
MOVAH,02H
INT21H;输出个位数
RET
DISPLAYENDP
CODESENDS
ENDSTART
五、实验心得
程序的分支一般由条件转移指令来产生,因此设计分支程序的前提之一是对转移指令的熟练掌握以及正确运用。
这次程序设计的过程就做到了这一点。
转移指令种类较多,有的情况下可以有多种选择,但有的情况下则最好使用其中的一个。
如程序中用到的JG是对带符号数的比较,若是比较两个无符号数,相对应的指令应使用JB。
在今后的程序设计过程中,诸如此类的情况我们应加以判别,进行正确的处理。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中南 大学 汇编 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)