汇编实验报告.docx
《汇编实验报告.docx》由会员分享,可在线阅读,更多相关《汇编实验报告.docx(35页珍藏版)》请在冰豆网上搜索。
汇编实验报告
汇编实验报告
实验一
(1)熟悉汇编语言程序调试环境及顺序程序设计
一、实验目的及要求:
1.学习及掌握汇编语言源程序的书写格式和要求,明确程序中各段的功能和相互之间的关系。
2.学会使用EDIT、MASM、LINK、DEBUG等软件工具。
3.熟练掌握在计算机上建立、汇编、连接、调试及运行程序的方法。
二、熟悉汇编语言程序调试环境
1.汇编语言源程序的建立
本例中给出的程序是要求从内存中存放的10个无符号字节整数数组中找出最小数,将其值保存在AL寄存器中。
设定源程序的文件名为ABC。
DATASEGMENT
BUFDB23H,16H,08H,20H,64H,8AH,91H,35H,2BH,7FH
CNEQU$-BUF
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
PUSHDS
XORAX,AX
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVBX,OFFSETBUF
MOVCX,CN
DECCX
MOVAL,[BX]
INCBX
LP:
CMPAL,[BX]
JBENEXT
MOVAL,[BX]
NEXT:
INCBX
DECCX
JNZLP
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
键入以下命令:
C:
\>EDITABC.ASM
此时屏幕的显示状态如图1所示。
图1用EDIT编辑ABC.ASM程序窗口
程序输入完毕后一定要将源程序文件存入盘中,以便进行汇编及连接,也可以再次调出源程序进行修改。
2.将源程序文件汇编成目标程序文件
一般情况下,MASM汇编程序的主要功能有以下3点:
(1)检查源程序中存在的语法错误,并给出错误信息。
(2)源程序经汇编后没有错误,则产生目标程序文件,扩展名为.OBJ。
(3)若程序中使用了宏指令,则汇编程序将展开宏指令。
源程序建立以后,在DOS状态下,采用宏汇编程序MASM对源程序文件进行汇编,其操作过程如图2所示。
图2MASM宏汇编程序工作窗口
汇编过程的错误分警告错误(WarningErrors)和严重错误(SevereErrors)两种。
其中警告错误是指汇编程序认为的一般性错误;严重错误是指汇编程序认为无法进行正确汇编的错误,并给出错误的个数、错误的性质。
这时,就要对错误进行分析,找出原因和问题,然后再调用屏幕编辑程序加以修改,修改以后再重新汇编,一直到汇编无错误为止。
3.用连接程序生成可执行程序文件
经汇编以后产生的目标程序文件(.OBJ文件)并不是可执行程序文件,必须经过连接以后,才能成为可执行文件(即扩展名为.EXE)。
连接过程如图3所示。
图3LINK连接程序工作窗口
上述提示行回答以后,连接程序开始连接,如果连接过程中出现错误,则显示出错误信息,根据提示的错误原因,要重新调入编辑程序加以修改,然后重新汇编,再经过连接,直到没有错误为止。
连接以后,便可以产生可执行程序文件(.EXE文件)。
4.程序的执行
当我们建立了正确的可执行文件以后,就可以直接在DOS状态下执行该程序。
如:
C:
\>ABC
本程序当中没有用到DOS中断调用指令,所以在屏幕上看不到程序执行的结果。
实验二
(2)分支及循环程序设计
一、实验目的及要求
熟练掌握转移指令,掌握分支程序设计的原理和方法,重点掌握各种分支程序中形成条件和判断条件的方法和技巧。
掌握循环程序设计的方法(单重循环结构和两重循环结构),正确分配与使用寄存器,根据实际问题选择控制循环的方法(循环次数已知和循环次数未知)。
二、实验内容
编写下列程序并调试通过。
1.通过键盘输入一个小写字母,找出对应的前导字母和后续字母,再按顺序显示这三个字母。
2.编写一个程序,要求比较数组ARRAY中的三个16位补码,并根据比较结果在终端上显示如下信息:
1)如果三个数都不相等,显示0;
2)如果三个数都两个相等,显示1;
3)如果三个数都相当,显示2。
3.编写一个程序,要求通过键盘接收一个个位数N,然后显示N个字母‘$’。
4.从键盘上输入一个8位二进制数,在显示器上显示其相应的十六进制数。
(教材P170习题5)
5.要求从键盘上接收一个4位十六进制数,然后再显示器上显示其对应的16位二进制数。
6.用15行*16列的表格形式显示ASCII码为10H-FFH的所有字符。
三、实验设计方案说明
实验1
流程图:
实验完整代码:
DATASSEGMENT
;此处输入数据段代码
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
;告诉汇编程序哪个是代码段,哪个是数据段,哪个是堆栈段
START:
MOVAX,DATAS
MOVDS,AX;初始化数据段的段地址
MOVCL,3
L:
MOVAH,01H;输入一个小写字母,常用DOS功能调用,入口参数为AH
INT21H
CMPAL,61H;对输入进行判断,确保输入的字符为a~z
JBL
CMPAL,7AH
JAL
MOVBL,AL
MOVDL,0DH;回车
MOVAH,02H;常用DOS功能调用,入口参数为AH
INT21H
MOVDL,0AH;换行
MOVAH,02H
INT21H
SUBBL,01H;按顺序输出三个字母
CMPBL,61H;判断前导字母是否合法
JNBL1
ADDBL,1AH
MOVDL,BL
MOVAH,02H
INT21H
SUBBL,19H
JMPL2
L1:
MOVDL,BL;输出录入字母的前导字母
MOVAH,02H
INT21H
INCBL
L2:
MOVDL,BL;输出录入字母本身
MOVAH,02H
INT21H
INCBL
CMPBL,7AH;判断后续字母是否合法
JNAL3
SUBBL,1AH
L3:
MOVDL,BL;输出录入字母的后续字母
MOVAH,02H;常用DOS功能调用,入口参数为AH
INT21H
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
实验2
实验流程图:
实验完整代码:
DATA SEGMENT
ARRAYDW 1,2,3 ;为数组中的三个元素各分配一个字的存储空间并初始化
DATAENDS
CODE SEGMENT
ASSUME CS:
CODE, DS:
DATA ;告诉汇编程序哪个是代码段,哪个是数据段,哪个是堆栈段
START:
MOV AX,DATA
MOV DS,AX ;初始化数据段的段地址
MOV AX,ARRAY
MOV BX,ARRAY+2
MOV CX,ARRAY+4
CMPAX,BX ;
JEL
CMP BX,CX
JEL1
CMP AX,CX
JE L1
MOVDL,30H
JMP EXIT
L:
CMP BX,CX
JNE L1
MOV DL,32H
JMP EXIT
L1:
MOV DL,31H
EXIT:
MOV AH,02 H
INT 21H
MOVAH,4CH
INT 21H
CODE ENDS
END START
实验3
流程图:
实验完整代码:
DATASSEGMENT
;此处输入数据段代码
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS;告诉汇编程序哪个是代码段,哪个是数据段,哪个是堆栈段
START:
MOVAX,DATAS
MOVDS,AX;初始化数据段的段地址
L:
MOVAH,01H;输入一位数字
INT21H
CMPAL,30H;对输入进行判断
JBL
CMPAL,39H
JAL
MOVCL,AL
MOVDL,0DH;回车
MOVAH,02H
INT21H
MOVDL,0AH;换行
MOVAH,02H
INT21H
SUBCL,30H
JZL2
L1:
MOVDL,24H;输出相应个数的$
MOVAH,02H
INT21H
SUBCL,01H
JNZL1
L2:
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
实验4
流程图:
实验完整代码:
DATASSEGMENT
;此处输入数据段代码
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVBL,0
MOVCL,8
L:
SHLBL,1;输入8位二进制数,并保存在BL中
MOVAH,01H
INT21H
CMPAL,30H
JZL1
ORBL,1
L1:
DECCL
JNZL
MOVDL,0DH;回车
MOVAH,02H
INT21H
MOVDL,0AH;换行
MOVAH,02H
INT21H
MOVDH,0
MOVCX,0204H
L2:
SHLBL,1;输出2位十六进制数
JCL3
SHLDH,1
JMPL4
L3:
SHLDH,1
ADDDH,1
L4:
DECCL
JNZL2
ADDDH,30H
CMPDH,39H
JBEL5
ADDDH,07H
L5:
MOVDL,DH
MOVAH,02H
INT21H
MOVDH,0
MOVCL,4
DECCH
JNZL2
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
实验5
实验完整代码:
DATASSEGMENT
;此处输入数据段代码
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVBX,0
MOVCX,0404H
L1:
MOVAH,01H;输入4位十六进制数
INT21H
SUBAL,30H
CMPAL,0AH
JBL2
SUBAL,07H
L2:
SHLBX,CL
ORBL,AL
DECCH
JNZL1
MOVDL,0DH;回车
MOVAH,02H
INT21H
MOVDL,0AH;换行
MOVAH,02H
INT21H
MOVCX,16
L3:
SHLBX,1;输出16位二进制数
JCL4
MOVDL,30H
MOVAH,02H
INT21H
DECCX
JNZL3
JMPEXIT
L4:
MOVDL,31H
MOVAH,02H
INT21H
DECCX
JNZL3
EXIT:
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
实验6
实验完整代码:
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV DL,10H
MOV CX,0FH
L1:
MOV BX,10H
L2:
MOV AH,02H
INT 21H
INC DL
PUSH DX
MOV DL,' '
MOV AH,02H
INT 21H
POP DX
DEC BX
CMP BX,00H
JNZ L2
PUSH DX
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
POP DX
DEC CX
CMP CX,00H
JNZ L1
MOV AH,4CH
INT 21H
CODES ENDS
END START
四、测试及评估
实验1运行结果
实验2运行结果
实验3运行结果
实验4运行结果
实验5运行结果
实验6运行结果
五、设计心得
这次试验过程中出现的问题很多,最开始是对过程的不熟悉以及第一次使用这个asm软件导致编译运行老是出错,最后是代码上的错误。
所以通过这次试验不仅让我懂得对汇编操作的基本过程熟悉了,更多的是对整个编写代码的流程熟悉了。
中间总是出现错误时感觉不知道该怎么办了,但是觉得这种代码也并不是很难,应该可以实现,所以通过请教同学、翻阅资料、经过不断地改动之后最终让正确的实验结果出现。
所以这次试验还让我对做实验增加了耐心,因而这次收获很多。
实验二子程序设计
一、实验目的及要求
理解CALL和RET指令,以及子程序的调用与返回过程;掌握子程序的结构,及相关的设计方法;能合理地分解程序功能,有效地支持功能的重用。
二、实验内容
编写下列程序并调试通过。
从键盘输入一系列字符(以回车符结束),并按字母、数字及其他字符分类计数,最后显示这三类字符的计数结果(采用子程序BINIDEC)
(子程序BINIDEC输入:
16位二进制数
输出:
十进制数,
功能:
将16位二进制数转换成十进制数)
三、实验设计方案说明
实验完整代码:
DATAS SEGMENT
ALPHA DB 'The total of alpha is:
','$'
NUMBER DB 'The total of number is:
','$'
OTHER DB 'The total of other is:
','$'
BUF DB 7 DUP(0),'$'
CRLF DB 0DH,0AH,'$'
DATAS ENDS
CODES SEGMENT
MAIN PROC FAR
ASSUME CS:
CODES,DS:
DATAS
START:
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATAS
MOV DS,AX
MOV BX,0
MOV SI,0
MOV DI,0
INPUT:
MOV AH,01H
INT 21H
CMP AL,0DH
JE DISP
CMP AL,30H
JAE L1
OTHERS:
INC DI
JMP SHORT INPUT
L1:
CMP AL,39H
JA L2
INC SI
JMP SHORT INPUT
L2:
CMP AL,41H
JAE L3
JMP SHORT OTHERS
L3:
CMP AL,5AH
JA L4
INC BX
JMP SHORT INPUT
L4:
CMP AL,61H
JAE L5
JMP SHORT OTHERS
L5:
CMP AL,7AH
JA SHORT OTHERS
INC BX
JMP SHORT INPUT
DISP:
LEA DX,CRLF
MOV AH,09H
INT 21H
LEA DX,ALPHA
CALL DISPLAY
LEA DX,NUMBER
MOV BX,SI
CALL DISPLAY
LEA DX,OTHER
MOV BX,DI
CALL DISPLAY
RET
MAIN ENDP
DISPLAY PROC NEAR
MOV AH,09H
INT 21H
CALL BINIDEC
LEA DX,CRLF
MOV AH,09H
INT 21H
RET
DISPLAY ENDP
BINIDEC PROC NEAR
PUSH AX
PUSH SI
PUSH DX
MOV AX,BX
MOV CX,10
LEA SI,BUF+6
EXCHANGE:
MOV DX,0
DIV CX
ADD DL,30H
MOV [SI],DL
DEC SI
OR AX,AX
JNZ EXCHANGE
LEA DX,BUF
MOV AH,09H
INT 21H
POP DX
POP SI
POP AX
RET
BINIDEC ENDP
CODES ENDS
END MAIN
四、测试及评估
五、设计心得
通过本次实验,我对子程序结构的设计方法有了一定的认识,子程序相当于高级语言中的过程和函数。
在一个程序的不同部分,往往要用到类似的程序段,这些程序段的功能和结构形式都相同,只是某些变量的赋值不同,此时就可以把这些程序段写成子程序的形式,一边需要时可以调用它。
实验三
(1)熟悉接口技术实验环境
一、学习和熟悉实验平台相关资料:
附件1TD-PITE用户手册。
二、完成下列实验内容
对实验平台提供的时钟脉冲信号(1MHZ)进行分频,分频后产生的脉冲信号(1HZ)输出到一个发光二极管上(发光二极管的点亮、熄灭交替进行)。
1)画出硬件线路图。
在TD-PITE实验平台上,计数器0的GATE0已连接+5V,计数器2用于支持串行通讯(用户不能使用)。
IOY0*地址范围:
0600H–063FH
*实验平台上每个I/O端口地址均为偶数。
2)写出初始化程序。
CODESEGMENT
ASSUMECS:
CODE
START:
MOVDX,0606H
MOVAL,36H;计数器0工作方式控制字
OUTDX,AL
MOVDX,0600H
MOVAX,1000;计数器0计数初值
OUTDX,AL
MOVAL,AH
OUTDX,AL
MOVDX,0606H
MOVAL,76H;计数器1工作方式控制字
OUTDX,AL
MOVDX,0602H
MOVAX,1000;计数器1计数初值
OUTDX,AL
MOVAL,AH
OUTDX,AL
AA:
JMPAA
CODEENDS
ENDSTART
2)在实验平台上连线,调试,演示。
实验三
(2)定时计数器的应用
一、实验基本内容及要求
1.在上述实验方案中,采用8254计数器0控制声音频率,采用软件延时的方法控制声音的节拍(声音长度)。
2.修改上述实验方案,采用8254计数器1控制声音节拍。
画出实验方案的硬件连接图,并设计相关的控制程序;在实验平台上调试通过。
二、实验设计方案说明
流程图:
实验参考例程(SOUND.ASM)
IOY0 EQU 06C0H
MY8254_COUNT0 EQU IOY0+00H ;8254计数器0端口地址
MY8254_COUNT1 EQU IOY0+02H ;8254计数器1端口地址
MY8254_COUNT2 EQU IOY0+04H ;8254计数器2端口地址
MY8254_MODE EQU IOY0+06H ;8254控制寄存器端口地址
STACK1 SEGMENT STACK
DW 256 DUP(?
)
STACK1 ENDS
DATA SEGMENT
FREQ_LIST DW 371,495,495,495,624,556,495,556,624 ;频率表
DW 495,495,624,742,833,833,833,742,624
DW 624,495,556,495,556,624,495,416,416,371
DW 495,833,742,624,624,495,556,495,556,833
DW 742,624,624,742,833,990,742,624,624,495
DW 556,495,556,624,495,416,416,371,495,0
TIME_LIST DB 4, 6, 2, 4, 4, 6, 2, 4, 4 ;时间表
DB 6, 2, 4, 4, 12, 1, 3, 6, 2
DB 4, 4, 6, 2, 4, 4, 6, 2, 4, 4
DB 12, 4, 6, 2, 4, 4, 6, 2, 4, 4
DB 6, 2, 4, 4, 12, 4, 6, 2, 4, 4