汇编语言实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、实验项目名称
汇编语言程序上机过程
二、实验目的
熟练掌握汇编语言程序的编辑、调试和运行的过程和方法。

了解汇编语言程序的汇编、运行环境。

三、实验基本原理
1.掌握常用的编辑工具软件(如WORD、EDIT)、MASM和LINK的使用;
2.伪指令:SEGMENT,ENDS,ASSUME,END,OFFSET,DUP;
3.利用的INT 21H的1号功能实现键盘输入的方法;
四、主要仪器设备及耗材
PC微机
DOS操作系统或 Windows 操作系统
MASM.EXE,LINK.EXE,或宏汇编集成环境
五、实验步骤
1.用用文字编辑工具(记事本或EDIT)将源程序输入,其扩展名为.ASM。

2.用MASM对源文件进行汇编,产生.OBJ文件和.LST文件。

若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。

3.用TYPE命令显示1产生的.LST文件。

4.用LINK将.OBJ文件连接成可执行的.EXE文件。

5.在DOS状态下运行LINK产生的.EXE文件。

即在屏幕上显示标题并提示你按键。

每按一键在屏幕上显示二个相同的字符,但小写字母被改成大写。

按ESC键可返回DOS。

若未出现预期结果,用DEBUG检查程序。

实验源程序:
data segment
message db 'This is a sample program of keyboard and disply'
db 0dh,0ah,'Please strike the key!',0dh,0ah,'$'
data ends
stack segment para stack 'stack'
db 50 dup(?)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start: mov ax,data
mov ds,ax
mov dx,offset message
mov ah,9
int 21h
again: mov ah,1
int 21h
cmp al,1bh
je exit
cmp al,61h
jc nd
cmp al,7ah
ja nd
and al,11011111b nd: mov dl,al
mov ah,2
int 21h
jmp again
exit: mov ah,4ch
int 21h
code ends
end start
六、实验数据及处理结果
(1)程序运行结果:
(2)在DEBUG下调试:
反汇编操作:
分步调试:
七、实验总结
通过这次实验我在电脑上的实际操作和观看,以及问老师同学我了解汇编语言程序的编辑、调试和运行的过程方法和汇编语言程序的汇编、运行环境,掌握了简单的汇编语言程序编写与调试, 以及在DOS状态下通过D命令、E命令、R命令、T命令、A命令、G命令,U命令、观察记个通用寄存器和标志寄存器具体结果和有关内存单元的内容。

这也是我明白了应该多上机实践,才能熟练的掌握个指令的作用,通过观察各寄存器的变化,了解程序的运行情况,这样才能很好的掌握书上的知识,不会有纸上谈兵的感觉。

一、实验项目名称
分支程序实验
二、实验目的
1、掌握分支程序的设计方法;
2、掌握利用DEBUG修改参数、检查结果的方法;
3、熟悉汇编语言源程序的编辑、汇编、连接及调试过程。

三.实验要求
1.编写一个程序,显示AL寄存器中的两位十六进制数
2.编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符<CR>(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。

四、主要仪器设备及耗材
PC微机
DOS操作系统或Windows 操作系统
MASM.EXE,LINK.EXE,或宏汇编集成环境
五、实验步骤
1.用EDIT或其它编辑软件,编写.ASM源程序,例如HEXASC.ASM及DSPKEY.ASM。

2.对其进行汇编及连接,产生.EXE文件。

3.对.EXE文件进行调试运行。

(1)用DEBUG调试运行,学会修改AL内容的方法;
(2)对DSPKEY.EXE键入不同的字符,分别进行调试;
(3)在MS-DOS下运行这两个.EXE文件。

实验源程序:
1、显示AL寄存器中的两位十六进制数:
;DISPHEX.ASM
CODE SEGMENT
ASSUME CS:CODE
START:MOV AL,3EH
MOV BL,AL
MOV DL,AL
MOV CL,4
SHR DL,CL
CMP DL,9
JBE NEXT1
ADD DL,7
NEXT1:ADD DL,30H
MOV AH,2
INT 21H ;显示高位ASCII码
MOV DL,BL
AND DL,0FH
CMP DL,9
JBE NEXT2
ADD DL,7
NEXT2:ADD DL,30H
MOV AH,2
INT 21H ;显示低位ASCII码
MOV AH,4CH
INT 21H
CODE ENDS ;返回DOS
END START
2、判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均
显示“C”;若是回车字符<CR>(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入:
;DISPKEY.ASM
CODE SEGEMENT
ASSUME CS:CODE
START: MOV AH,1
INT 21H ;等待键入字符,送AL
CMP AL,0DH ;是否是回车符?
JZ DONE ;是则转DONE退出程序
CMP AL,’0’
JB NEXT
CMP AL,’9’
JA CHARUP
MOV DL,AL
MOV AH,2
INT 21H
JMP START
CHARUP:CMP AL,41H
JB NEXT
CMP AL,5AH
JA CHRDN
DISPC: MOV DL,’C’
MOV AH,2
INT 21H
NEXT: JMP START
CHRDN:CMP AL,61H
JB NEXT
CMP AL,7AH
JA NEXT
JMP DISPC
DONE: MOV AH,4CH
INT 21H
CODE: ENDS
END START
程序1的流程图:
程序2流程图:
六、实验数据及处理结果
程序1的运行结果:
程序2的运行结果:
程序1在DEBUG下的反汇编:
程序2在DEBUG下的反汇编:
七、实验总结
通过这次实验我了解了分支程序的设计方法,以及他的各种特点和作用,我下面总结一下他的特点如下:
1)顺序执行的程序称为顺序程序,其特点是每一条指令在执行过程中只被执行一次,可以
在DOC中利用DEBUG修改参数、检查结果的方法;
2)分支程序的特点是运行方向是向前的,在某一种确定条件下,只能执行多个分支中的一
个分支程序设计方法:
3)程序的分支一般用条件转移指令来实现,实现分支程序的设计方法是分析题意,确定算
法,根据算法,画出程序框图。

根据框图编写程序。

上机调试程序。

4)分支程序设计中经常会遇到判断“相等”和“不相等”、“负”和“正”、“大于”和
“小于”、“满足条件”和“不满足条件”等等。

这种判断使程序的流程不再是一条顺
序执行的直线,而变为由两个或多个分支所组成的倒树型结构,其中每一个分支只有在
满足条件时才被执行。

这次试验也加深了对汇编语言源程序的编辑、汇编、连接及调试过程的了解。

在以后的试验中我会更加的注重实际的操作。

一、实验项目名称
循环程序实验
二、实验目的
1.掌握循环程序的设计方法;
2.学会针对不同的问题,选用不同的组织循环的方法;
3.进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。

三.实验要求:
1.编写实验内容要求的两个程序;
2.写出调试以上程序,即修改程序参数,检查结果的操作方法;
3.熟悉源程序汇编、连接命令的使用方法即要回答的内容。

1.编写一个程序,显示BX寄存器中的两位十六进制数;
2.编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符<CR>(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。

四、主要仪器设备及耗材
PC微机
DOS操作系统或Windows 操作系统
MASM.EXE,LINK.EXE,或宏汇编集成环境
五、实验步骤
1.用EDIT或其它编辑软件,编写.ASM源程序,例如HEXASC.ASM及DSPKEY.ASM;
2.对其进行汇编及连接,产生.EXE文件;
3.对.EXE文件进行调试运行。

(1)用DEBUG调试运行,学会修改AL内容的方法;
(2)对DSPKEY.EXE键入不同的字符,分别进行调试;
(3)在MS-DOS下运行这两个.EXE文件。

程序1源程序:
编写一个程序,显示BX寄存器中的四位十六进制数:
;DISPHEX.ASM
CODE SEGMENT
ASSUME CS:CODE
START: MOV BX,2B3EH
MOV CX,2
TO: MOV AL,BH
MOV DL,BH
PUSH CX
MOV CL,4
SHR DL,CL
POP CX
JBE NEXT1
ADD DL,7
NEXT1: ADD DL,30H
push ax
MOV AH,2
INT 21h ;显示高位ASCII码
pop ax
MOV DL,AL
AND DL,0FH
CMP Dl,9
JBE NEXT2
ADD DL,7
NEXT2: ADD DL,30H
push ax
MOV AH,2
INT 21H ;显示低位ASCII码
pop ax
PUSH CX
mov cl,8
SHL BX,CL
POP CX
LOOP TO
MOV AH,4CH
INT 21H
CODE ENDS ;返回DOS
END START
程序2源程序:
判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“C”;若是回车字符<CR>(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入:
;DISPKEY.ASM
CODE SEGEMENT
ASSUME CS:CODE
START: MOV AH,1
INT 21H ;等待键入字符,送AL
CMP AL,0DH ;是否是回车符?
JZ DONE ;是则转DONE退出程序
CMP AL,’0’
JB NEXT
CMP AL,’9’
JA CHARUP
MOV DL,AL
MOV AH,2
JMP START CHARUP:CMP AL,41H JB NEXT
CMP AL,5AH JA CHRDN DISPC: MOV DL,’C’ MOV AH,2 INT 21H NEXT: JMP START CHRDN:CMP AL,61H JB NEXT
CMP AL,7AH JA NEXT
JMP DISPC DONE: MOV AH,4CH INT 21H CODE: ENDS
END START
程序1流程图:
程序2流程图:
开始
从键盘上输入数据
到AL
AL=0DH?
(判断是否为回车)
AL<’0' ?
AL>’9’?
结束
41H<=AL<=5AH Or 61H<=AL<=7AH ?N
Y
N
N
Y
把AL 的值给DL
并输出DL
把‘C ’给DL 并输出DL
Y
六、实验数据及处理结果
程序1运行结果:
程序2运行结果:
程序1在DEBUG 下的反汇编:
程序2在DEBUG下的反汇编:
七、实验总结
通过这次试验使我了解了什么是循环程序,从而也更加了解汇编语言的编程原理,我对循环结构有了以下的特点。

1)循环程序是由循环初始部分,循环体,环结束部分组成,其中循环初始部分是为进入循环
做必要的准备工作,循环体是程序中重复执行的程序段,由两部分组成:
2)循环工作部分:用于执行程序的实际任务;循环参数修改及循环控制部分,控制循环次
数的方法有计数控制循环,用条件控制循环和用逻辑变量控制循环,为进入下一次循环,修改地址指针、计数器内容等项参数;
3)检测循环是否已执行了规定的次数,从而确定继续循环还是结束循环。

循环结束部分是进
行循环之后的处理。

从实验中可以了解根据循环的类型的不同,选用不同的组织循环的方法;循环体的结构依照问题的不同,可以选择是先判断后处理还是先处理后判断,通过实验进一步熟悉利用DEBUG程序修改参数的方法,通过doc能检查和验证结果的正确性,
这次的实验是我更发现自己的不足也更加发现了汇编语言的难学,不过在以后的学习中我会更加努力学习的。

一、实验项目名称
子程序实验
二、实验目的
1.掌握主程序与子程序之间的调用关系及调用方法;
2.掌握子程序调用过程中近程调用与远程调用的区别;
3.掌握通过堆栈转送参数的方法。

三.实验要求:
1.第一个实验程序用子程序的近程调用实现。

由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。

实验过程中可以从堆栈的内容看到两个子程序的返回地址值。

由于是近调用,地址值只包括返回地址的段内偏移量。

在每个子程序的执行中,检查CS值是不变的。

2.第二个程序是利用远调用的方法调用子程序的。

在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。

子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。

3.第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。

一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。

有关该方法的原理此处不再介绍。

4.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图;熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。

1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。

要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。

2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。

四、主要仪器设备及耗材
PC微机
DOS操作系统或 Windows 操作系统
MASM.EXE,LINK.EXE,或宏汇编集成环境
五、实验步骤
1.编辑、汇编两个源程序,生成相应的可执行文件(.EXE)
2.用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。

特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。

3.检查程序执行的结果是否正确。

实验要求:
1.第一个实验程序用子程序的近程调用实现。

由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。

实验过程中可以从堆栈的内容看到两个子程序的返回地址值。

由于是近调用,地址值只包括返回地址的段内偏移量。

在每个子程序的执行中,检查CS值是不变的。

2.第二个程序是利用远调用的方法调用子程序的。

在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。

子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。

3.第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。

一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。

有关该方法的原理此处不再介绍。

4.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图;熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。

程序1源程序:
;CONV.ASN
DATA SEGMENT
BUF DB 0ABH,0CDH,0DEH,01H,02H,03H DB 3AH,4BH,5CH,6FH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA
MOV DS,AX
MOV CX,10
LEA BX,BUF
AGAIN: MOV AL,[BX]
CALL HEXASC
INC BX
LOOP AGAIN
MOV AH,4CH
INT 21H
HEXASC PROC NEAR
MOV DL,AL
PUSH CX
MOV CL,4
SHR DL,CL
POP CX
ALL DISP ;显示高位HEX数
MOV DL,AL
AND DL,0FH
CALL DISP
RET
HEXASC ENDP
DISP PROC
PUSH AX
CMP DL,9
JBE NEXT
ADD DL,7
NEXT: ADD DL,30H
MOV AH,2
INT 21H ;显示
POP AX
RET
DISP ENDP
CODE ENDS
END START
程序2源程序:
;COUNTER.ASM
DATA SEGMENT
char db 'b'
CHA DB 0dh,0ah,'b','$'
BUF DB 50H, ? ,50H DUP(?)
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(?)
STACK ENDS
MCODE SEGMENT
ASSUME CS: MCODE, DS: DATA,SS:STACK START: MOV AX,DATA
MOV DS,AX
LEA DX,BUF
MOV AH,0AH
INT 21H
LEA SI,BUF
MOV CL, [SI+1]
MOV CH, 0 ;CX中为字符串长度
INC SI
INC SI ;SI指向串首址TABLE MOV Al,CHAR
MOV AH,0 ;AX中为待查字符 PUSH SI
PUSH CX
PUSH AX ; 参数送堆栈
CALL CHECK
POP AX ;统计个数在AL中
MOV Dx,offset CHA
push ax
MOV AH,9
INT 21H
pop ax
MOV DL,AL
AND DL, 0FH
CMP DL,9
JBE NEXT
ADD DL,7
NEXT: ADD DL,30H
MOV AH,2
INT 21H ;显示统计个数 MOV AH,4CH
INT 21H
MCODE ENDS SCODE SEGMENT
ASSUME CS:SCODE CHECK PROC FAR
PUSH BP
MOV BP,SP
MOV SI,[BP+10] MOV CX, [BP+8] MOV AX, [BP+6] XOR AH, AH AGAIN: CMP AL,[SI]
JNE NEXT1
INC AH
NEXT1: INC SI
LOOP AGAIN
MOV AL, AH
MOV [BP+10],AX POP BP
RET 4
CHECK ENDP
SCODE ENDS
END START
六、实验数据及处理结果程序1运行结果:
程序2运行结果:
七、实验总结
通过实验中我主要了解了子程序的作用用法以及怎样编写程序。

以下是对它的总结:
1)子程序是在实际编程中,常常回遇到功能完全相同的程序段,不在同一程序模块,或虽在同一
模块而需重复执行,但又不是连续重复执行。

2)子程序是为了避免重复编制同一段程序,节省存储空间,把程序段独立开来,附加少量额外语
句,将其编制成公用子程序,供程序其他地方需要时调用,子程序是由保护现场(一些将在子程序运行时将要被破坏的寄存器的内容)依入口参数从指定位置取要加工处理的信息,加工处理,依出口参数向指定位置送经加工处理后的结果信息,返回调用程序。

3)调用子程序时一般应增加如下功能语句,想指定位置送要加工处理的信息;调用子程序。


过实验了解主程序与子程序之间的调用关系及调用方法和子程序调用过程中近程调用与远程调用的区别和通过堆栈转送参数的方法。

一、实验项目名称
排序程序设计
二、实验目的
掌握数据排序的一些常用算法,了解数列的有序、无序、升序和降序的概念。

三.实验要求:
1.复习排序的几个基本算法;
2.准备数据,按选择好的算法编写源程序。

数据以DW定义和键盘输入两种方法提供。

使用“冒泡排序”法,将内存中10个数据由小到大排序(每个数为16位二进制);
四、主要仪器设备及耗材
PC微机
DOS操作系统或 Windows 操作系统
MASM.EXE,LINK.EXE,或宏汇编集成环境
五、实验步骤
内容:使用“冒泡排序”法,将内存中10个数据由小到大排序(每个数为16位二进制)1.将编写好的源程序输入,建立源程序文件且存盘;
2.汇编、连接和运行此程序;
3.运行成功后,将程序的数据区建立方式改为键盘输入,由小到大排序改为由大到小排序,修改后重新调试、运行;
4.记录并分析排序的效率。

实验源程序:
code segment
org 100h
assume cs:code,ds:code
main: jmp start
ent db 0dh,0ah,'$'
array dw 1234h,5673h,7fffh,8000h,0dffh
dw 0ab5h,0369h,005fh,5634h,9069h,'$'
count equ $-array
start: mov ax,code
mov ds,ax
mov cx,count
shr cx,1
dec cx
mov bl,-1
again: mov dx,cx
and bl,bl
je exit
xor bl,bl
xor si,si
again1: mov ax,array[si]
cmp ax,array[si+2]
jle nchg
xchg array[si+2],ax
mov array[si],ax
mov bl,-1
nchg: inc si
inc si
dec dx
jnz again1
loop again
exit: mov ah,1
int 21h
mov ah,4ch
int 21h
code ends
end main
六、实验数据及处理结果
七、实验总结:
通过实验我最大的收获就是了解了编程中的几种重要排序法,在试验时我也查阅了书籍及上网了解了以下的知识。

特别是冒泡数据排序方法。

1)数据排序方法的一些常用算法和数列的有序、无序、升序和降序的概念,
2)冒泡排序算法中,每从头至尾处理一次,也就是内循环执行一次,使得一个元素到达最终位置,
其余元素的相对位置不变。

那么,在某些情况下,无需n-1次即可完成排序。

如果在某次处理中没有发生相邻元素的交换,也就是所任两个相邻的元素都是前下后大,那么所有元素就是递增排列的,无需再继续处理。

3)冒泡法排序是一个比较简单的排序方法。

在待排序的数列基本有序的情况下排序速度较快。


要排序的数有n个,则需要n-1轮排序,第j轮排序中,从第一个数开始,相邻两数比较,若不符合所要求的顺序,则交换两者的位置;直到第n+1-j个数为止,第一个数与第二个数比较,第二个数与第三个数比较,......,第n-j个与第n+1-j个比较,共比较n-1次。

此时第n+1-j个位置上的数已经按要求排好,所以不参加以后的比较和交换操作。

这次试验我学会使用冒泡排序思想设计解决简单排序问题的算法,也进一步理解程序设计的基本方法,体会程序设计在现实中的作用在以后的学习中要培养分析问题、发现规律的能力。

实验报告
实验课程:
学生姓名:
学号:
专业班级:
10年 12月 22日。

相关文档
最新文档