目录
实验一 汇编语言程序设计开发环境... 2
实验二 BCD数运算与十进制调整... 6
实验三 键盘输入与回显... 10
实验四 字符串匹配... 13
实验五 用递归计算阶乘... 17
实验六 中断服务子程序设计... 20
实验一 汇编语言程序设计开发环境
一、实验目的
1、掌握汇编语言程序设计的基本方法和技能;
2、熟练掌握使用TC编辑环境编辑汇编语言源程序;
3、熟练掌握宏汇编程序MASM的使用;
4、熟练掌握连接程序LINK的使用;
5、debug的使用;
二、实验设备
计算机
三、实验原理
上机过程:手工编写的源程序——> 汇编语言源文件(.asm)——>机器语言目标文件(.obj)——>机器语言执行文件(.exe)
(1)汇编语言
汇编语言源程序的汇编过程是是利用汇编程序(MASM)对已编辑好的源程序文件(.ASM)进行汇编,将源程序文件中以ASCII码表示的助记符指令逐条翻译成机器码指令,并完成源程序中的伪指令所指出的各种操作,最后可以建立3个文件:扩展名为 .OBJ的目标文件、扩展名为 .LST 的列表文件和扩展名为 .CRF 的交叉索引文件。
在对源程序文件(ASM文件)汇编时,汇编程序将对ASM文件进行两遍扫描,若程序文件中有语法错误,则结束汇编,汇编程序将指出源程序中存在的错误,这时应返回编辑环境修改源程序中的错误,再经过汇编,直到最后得到无错误的目标程序,即OBJ文件。因此,汇编程序的主要功能可以概括为以下三点:
(1) 检查源程序中的语法错误,并给出错误信息;
(2) 产生目标程序文件(OBJ文件),并可给出列表文件(.LST文件);
(3) 展开宏指令
(2)DEBUG命令
1显示内存单元内容的命令D
格式(1):-D 地址
D命令中的地址可为段内偏移量,也可为段基址和段内偏移量两部分,中间用冒号隔开,如1680:0110,即指段基址为1680H,段内偏移量为0110H。Debug中所显示的数据均为十六进制数,且省去了后面的H标志。
格式(2):-D 范围
将显示指定地址范围内的内存单元的内容,起始地址可由段基址及段内偏移量两个部分组成,中间用冒号“:”隔开,也可以只指出段内偏移量,而此时的段基址在DS中。这里所说的范围包含起始地址和结束地址。
比如 –D DS:1000 1020
将显示数据段偏移地址为1000H到1020H的内容。
2运行程序命令G
格式:G [=地址][地址[地址…]]
该命令可以在程序运行中设置断点。它是Debug程序进行程序调试的主要命令之一。
示例:-g 001a 则执行从当前cs:ip至001a的指令,注意:地址设置必须从指令的第一字节设起。
<1>第一个参数“=地址”规定了程序执行的起始地址,以CS内容作段地址,等号后面的地址只需给出地址偏移量。此时,命令G与地址之间的等号不能省去。
如果在G命令执行前,已经设置了CS值和IP值,则也可以直接用G命令,从指定地址执行程序。
<2>格式中后面给出的地址是指断点地址,最多可设置10个断点。当程序执行到一个断点时,就停下来,显示CPU各寄存器的内容和标志位的状态,以及下一条待执行的指令,被调试程序的所有断点全部被取消,并返回Debug。
<3>地址参数所指的单元,必须包含有有效的8088指令的第一个字节,否则将产生不可预料的结果。
<4>堆栈必须至少包含有6个可用字节,否则也将产生不可预料的结果。
<5>若断点地址只包括地址偏移量,则认为段地址在CS寄存器中。
四、实验内容
要求:把40个字母a的字符串从源缓冲区传送到目的缓冲区。
实验程序:
data segment ;define data segment
source_buffer db 40 dup ('a')
data ends
extra segment ;define extra segment
dest_buffer db 40 dup (?)
extra ends
code segment ;define code segment
main proc far ;main part of program
assume cs:code,ds:data,es:extra
start: ;starting execution address
;set up stack for return
push ds ;save old data segment
sub ax,ax ;put zero in AX
push ax ;save it on stack
;set DS register to current data segment
mov ax,data ;data segment addr
mov ds,ax ;into DOS register
;set ES register to current extra segment
mov ax,extra ;extra segment addr
mov es,ax ;into ES register
;MAIN PART OF PROGRAM GOES HERE
lea si,source_buffer ;put offset addr of source
;buffer in SI
lea di,dest_buffer ;put offset addr of dest
;buffer in DI
cld ;set DF flag to forward
mov cx,40 ;put count in CX
rep movsb ;move entire string
ret ;return to DOS
main endp ;end of main part of program
code ends ;end of code segment
end start ;end assembly
上机调试及运行结果
1用masm程序产生OBJ文件
2用LINK产生exe文件
3程序的执行
4用反汇编命令U来确定所要设定的断点地址
由上图可知,断点地址为的偏移地址为:001C
5用G命令使程序运行,同时设定断点为001C
6用D命令查看数据段的有关区域,查看程序的运行结果。
五、实验心得
通过这次上机实验,第一次接触了TC环境,对汇编程序的编译、运行有了感性的认识。学会了如何在TC环境下编程,熟悉了根据提示,修改错误,调试程序的过程,并学会了使用几个常用的DEBUG命令。
实验二 BCD数运算与十进制调整
一、实验目的
1、熟悉BCD码的基本知识
2、熟悉汇编语言BCD码多字节加减法基本指令的使用方法;
3、掌握BCD码调整指令的使用方法。
二、实验设备
计算机
三、实验原理
1、BCD码
BCD码是一种用二进制编码的十进制数,又称二—十进制数。它是用4位二进制数表示一个十进制数码的,由于这4位二进制数的权为8421,所以BCD码又称8421码。在IBM PC机中,表示十进制的BCD码可以用压缩的BCD码和非压缩的BCD码两种格式表示。
(1)压缩的BCD码
压缩的BCD码用4位二进制数表示一个十进制数位,整个十进制数形式为一个顺序的以4位为一组的数串。
(2)非压缩的BCD码
非压缩的BCD码则以8位二进制数表示一个十进制数位,8位中的低4位表示8421的BCD码,而高4位则没有意义。
2、BCD码的调整指令
(1)压缩的BCD码调整指令
1)DAA加法的十进制调整指令
该指令把AL中的和调整到压缩的BCD格式,这条指令之前必须执行ADD或ADC指令,加法指令必须把两个压缩的BCD码相加,并把结果存放在AL寄存器中。
功能:如果AL寄存器中低4位大于9或辅助进位(AF)=1,则(AL)=(AL)+6且(AF)=1;如果(AL)>=0A0H或(CF)=1,则(AL)=(AL)+60H且(CF)=1。同时,SF、ZF、PF均有影响。
2) DAS 减法的十进制调整指令
该指令把AL中的差调整到压缩BCD格式,这条指令之前必须执行SUB或SBB指令,减法指令必须把两个BCD码相减,并把结果存放在AL寄存器中。
功能:如果(AF)=1或AL寄存器中低4位大于9,则(AL)=(AL)-6且(AF)=1;如果(AL)>=0A0H或(CF)=1,则(AL)=(AL)-60H且(CF)=1。同时SF、ZF、PF均受影响。
(2)非压缩的BCD码调整指令
1)AAA 加法的ASCII调整指令
执行的操作:(AL)←把AL中的和调整到非压缩的BCD格式
(AH)←(AH)+调整产生的进位值
这条指令之前必须执行ADD或ADC指令,加法指令必须把两个非压缩的BCD码相加,并把结果存放在AL寄存器中。
2)AAS减法的ASCII调整指令
执行的操作:(AL)←把AL中的差调整到非压缩的BCD格式
(AH)←(AH)+调整产生的借位值
这条指令之前必须执行SUB或SBB指令,减法指令必须把两个非压缩的BCD码相减,并把结果存放在AL寄存器中。
四、实验内容
4位BCD码相加
实验程序
STACK SEGMENT STACK
DB 100 DUP(?)
STACK ENDS
DATA SEGMENT
X1 DB 4 DUP(?)
X2 DB 4 DUP(?)
X3 DB 5 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN PROC
MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET X1
MOV CX,4
NEXT1:CALL INPUT
AND AL,0FH
MOV [BX],AL
INC BX
LOOP NEXT1
MOV AH,2
MOV DL,'+'
INT 21H
MOV BX,OFFSET X2
MOV CX,4
NEXT2:CALL INPUT
AND AL,0FH
MOV [BX],AL
INC BX
LOOP NEXT2
MOV AH,2
MOV DL,'='
INT 21H
MOV SI,OFFSET X1+3
MOV DI,OFFSET X2+3
MOV BX,OFFSET X3+4
MOV CX,4
OR CX,CX
NEXT3:MOV AL,[SI]
ADC AL,[DI]
AAA
MOV [BX],AL
DEC SI
DEC DI
DEC BX
LOOP NEXT3
MOV AL,0
ADC AL,AL
MOV [BX],AL
MOV CX,5
NEXT4:MOV DL,[BX]
ADD DL,30H
MOV AH,2
INT 21H
INC BX
LOOP NEXT4
MOV AH,4CH
INT 21H
MAIN ENDP
INPUT PROC
AGAIN:MOV AH,8
INT 21H
CMP AL,'0'
JB AGAIN
CMP AL,'9'
JA AGAIN
MOV AH,2
MOV DL,AL
INT 21H
RET
INPUT ENDP
CODE ENDS
END MAIN
上机调试及运行结果
1235和5689是从键盘中输入的4位非压缩的BCD码,06294为调整后的相加结果。
五、实验心得
通过本次,对一些BCD码调整的原理及指令有了更深的认识,加深了计算机运算规则的理解。
BCD码本质上是十进制数,应遵循逢十进一的规则。而计算机是按二进制数进行计算的,所以BCD码都会被计算机当做二进制数来运算,其记过也是二进制数,与期望的十进制数的结果不同,所以需要进行调整,才能得到期望的结果。
实验三 键盘输入与回显
一、实验目的
1、熟悉DOS功能的9号功能,从键盘输入并在显示器上显示字符串
2、熟悉DOS功能调用指令INT 21H
二、实验设备
计算机
三、实验原理
1、单字符输入
功能号1、7和8都可以接收键盘输入的单字符串,输入字符以ASCII码形式存放在累加器AL中。其中7号和8号功能无回显。
2、字符串输入
输入字符串可以通过调用DOS功能的0AH号功能实现。
3、单字符显示
在显示器上显示的内容都是字符形式,如果是数字,则一定是其对应的ASCII码。要将一个字符串送到显示器显示,可调用DOS功能的2、6、9号功能实现。其中2、6用于显示单个字符,功能9显示一个字符串。
4、字符串显示
要在显示器上显示字符串,可调用DOS功能的9号功能,该功能要求被显示的字符串必须以“$”字符作为结束符,否则会引起屏幕混乱。
5、返回DOS
用4CH号功能返回DOS的程序段:
MOV AH,4CH
INT 21H
四、实验内容
(1)单字符串输入与回显
从键盘读入一串字符,在字符串尾插入一个“$”,并显示该字符。
实验程序:
DATA SEGMENT
JICUN DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV AH,1
INT 21H
MOV JICUN,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
上机调试及运行结果
上图中,h是从键盘输入的字符。
(2)字符串显示
实验程序:
DATA SEGMENT
BUFSIZE DB 50
ACTLEN DB ?
CHARS DB 50 DUP(20H)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET BUFSIZE
MOV AH,0AH
INT 21H
XOR CX,CX
MOV CL,ACTLEN
MOV DX,OFFSET CHARS
MOV BX,DX
ADD BX,CX
MOV BYTE PTR[BX],'$'
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
上机调试及运行结果
上图中,“nanchangdaxue”是从键盘输入的字符串。
五、实验心得
通过本次实验,熟悉了DOS功能调用的用于键盘输入的1、7、8号功能,巩固了我对理论知识的认识,增强了汇编语言的编程语感。
本实验中还用到了4CH功能号返回DOS。
实验四 字符串匹配
一、实验目的
通过逐个比较两字符串,判断字符串是否匹配。
二、实验设备
计算机
三、实验原理
将两个字符串想比较。若出项不相同的字符,则将“NO MATCH!”在屏幕上显示出来。
四、实验内容
实验程序:
DATA SEGMENT
STR1 DB 0DH,0AH,'**This is find-keyword from a sentence program.**',0DH,0AH,'$'
STR2 DB 'Enter keyword:','$'
STR3 DB 0DH,0AH,'Enter sentence:','$'
INF1 DB 0DH,0AH,'Match!',0DH,0AH,'Match at location $'
INF2 DB ' of the sentence.',0DH,0AH,'$'
ERR DB 0DH,0AH,'No match!',0DH,0AH,'$'
DAT1 DB 20H,?,20H DUP(?)
DAT2 DB 80H,?,80H DUP(?)
COUNT DB ?
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,ES:DATA,CS:CODE
DISP MACRO DAT
LEA DX,DAT
MOV AH,9
INT 21H
ENDM
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
DISP STR1
AGAIN: DISP STR2
LEA DX,DAT1
MOV AH,0AH ;输入关键字
INT 21H
LEA SI,DAT1
INC SI
MOV AL,0
CMP AL,[SI]
JZ DONE
MOV AL,[SI]
MOV COUNT,AL
INC SI ;指向关键字开始单元
SENT: LEA SI,DAT1
INC SI
INC SI
DISP STR3
LEA DX,DAT2
MOV AH,0AH ;输入被查句子
INT 21H
LEA DI,DAT2
INC DI
MOV AL,0
CMP AL,[DI]
JZ DONE
MOV AL,[DI]
CMP AL,[SI-1]
JB ERRO ;比较关键字和句子长短
INC DI ;指向句子的开始单元
MOV BX,DI
CLD
COMP: MOV CL,COUNT
COMP1: CMPSB
JNZ COMP2
DEC CL
JNZ COMP1
JMP FIND1
COMP2: INC BX
MOV DI,BX
LEA SI,DAT1
INC SI
INC SI
DEC AL
JNZ COMP
ERRO: LEA DX,ERR
MOV AH,9
INT 21H
JMP AGAIN
FIND1: CALL FIND
JMP SENT
DONE: MOV AH,4CH
INT 21H
FIND PROC
DISP INF1
MOV DX,0
LEA DX,DAT2
INC DX
INC DX
SUB BX,DX
MOV DX,BX
INC DX
PUSH DX
MOV CL,4
SHR DL,CL
CMP DL,9
JBE NEXT1
ADD DL,7
NEXT1: ADD DL,30H
MOV AH,2
INT 21H ;显示高位ASCII码
POP DX
AND DL,0FH
CMP DL,9
JBE NEXT2
ADD DL,7
NEXT2: ADD DL,30H
MOV AH,2
INT 21H ;显示低位ASCII码
DISP INF2
RET
CODE ENDS
END START
上机调试及运行结果
五、实验心得
本实验中在进行字符串比较时从字符串长度和个对应的字符两方面来比较。先判断字符串的长度,长度不相同,则字符串不匹配;若长度相同,再逐个比较相对应的字符,只有两字符串完全相等时,才输出字符串信息,否则显示“NO MATCH!”
在程序中,由于涉及到不同的情况,所以运用了程序条件专一指令等程序控制指令。
实验五 用递归计算阶乘
一、实验目的
了解子程序的设计及递归算法。
二、实验设备
计算机
三、实验原理
堆栈保护及递归算法,用递归算法计算3!
四、实验内容
实验程序:
DATA SEGMENT
N DW 3
RESULT DW ?
DATA ENDS
STACKSEG SEGMENT
DW 128 DUP(0)
TOS LABEL WORD
STACKSEG ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA,SS:STACKSEG
START:MOV AX,STACKSEG
MOV SS,AX
MOV SP,OFFSET TOS
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV BX,N
PUSH BX
CALL FACT
POP RESULT
RET
MAIN ENDP
FACT PROC NEAR
PUSH AX
PUSH BP
MOV AX,[BP+6]
CMP AX,0
JNZ FACT1
INC AX
JMP EXIT
FACT1:DEC AX
PUSH AX
CALL FACT
POP AX
MOV DX,[BP+6]
MUL DX
EXIT:MOV [BP+6],AX
POP BP
POP AX
RET
FACT ENDP
CODE ENDS
END START
上机调试及实验结果
程序中要计算的是3!,在数据段查看的结果如上图;
查看堆栈段:
五、实验心得
通过这次实验,巩固了我对子程序的应用以及堆栈原理的认识。
本实验是一个子程序设计实验,运用递归来计算阶乘。实验程序中涉及到堆栈保护等知识点。数据的进栈出栈,以及数据存放的位置等都要在程序中考虑。
实验六 中断服务子程序设计
一、实验目的
1、熟悉中断的相关知识;
2、熟悉中断向量的功能调用;
3、掌握中断处理程序的设计方法。
二、实验设备
计算机
三、实验内容
;1CH:定时器控制的软中断,时钟中断每发生一次(约1/12.8秒),就要调用
;一次中断类型1CH的处理程序。
DSEG SEGMENT
COUNT DW 1
MESS DB ‘THE BELL IS RINGING!’, 0DH,0AH,’$’
DSEG ENDS
CSEG SEGMENT
MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG
START:
PUSH DS
SUB AX, AX
PUSH AX
MOV AX, DSEG
MOV DS, AX
MOV AL, 1CH
MOV AH, 35H
INT 21H
PUSH ES
PUSH BX
PUSH DS
MOV DX, OFFSET RING
MOV AX, SEG RING
MOV DS, AX
MOV AX, 251CH
INT 21H
POP DS
IN AL, 21H
AND AL, 11111110B
OUT 21H, AL ; 开放定时器中断
STI
MOV DI, 2000
DELAY1:
MOV SI, 3000
DELAY2:
DEC SI
JNZ DELAY2
DEC DI
JNZ DELAY1
POP DX
POP DS
MOV AL, 1CH
MOV AH, 25H
INT 21H
RET
MAIN ENDP
RING PROC FAR
PUSH DS
PUSH AX
PUSH CX
PUSH DX
MOV AX, DSEG
MOV DS, AX
STI
DEC COUNT
JNZ EXIT
MOV DX, OFFSET MESS
MOV AH, 09H
INT 21H
MOV DL, 07H ;响铃符
MOV AH, 02H
INT 21H
MOV COUNT, 182
EXIT:
CLI
POP DX
POP CX
POP AX
POP DS
IRET
RING ENDP
CSEG ENDS
END START
上机调试及运行结果
程序运行后在屏幕上显示“THE BELL IS RINGING!”
五、实验心得
本实验时中断服务程序,执行的是响铃操作,每隔10S进行一次中断,执行一次操作。直接用G命令就可查看结果。
通过这次实验,对计算机的中断指令以及其原理有了更深的认识,这说明通过实践来熟练操作是学以致用最好的方法。实验中遇到不少问题,最终通过调试解决了,这使自己的调试水平得到了提高。