实验一 Debug命令及汇编指令和寻址的应用
一、 实验目的:
1、 掌握DEBUG的基本命令及其功能,学会用DEBUG调试程序;
2、 掌握8086CPU的指令功能,体会寄存器的作用;
3、 了解数据在内存的存放方式和内存操作数的几种寻址方式;
4、 了解指令的执行过程。
二、 实验内容:
1、设堆栈段指针SP=1000H,AX=4000H,BX=8000H;请编写一段程序将 AX 和BX的内容进行交换。要求:用三种不同的方法。
方法一:
DATA SEGMENT
BUF DB ?
DATA ENDS
STACK SEGMENT STACK
DB 10 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,4000H
MOV BX,8000H
MOV CX,AX
MOV AX,BX
MOV BX,CX
CODE ENDS
END START
方法二:
DATA SEGMENT
BUF DB ?
DATA ENDS
STACK SEGMENT STACK
DB 10 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,4000H
MOV BX,8000H
XCHG AX,BX
CODE ENDS
END START
方法三:
DATA SEGMENT
BUF DB ?
DATA ENDS
STACK SEGMENT STACK
DB 10 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,4000H
MOV BX,8000H
PUSH AX
PUSH BX
POP AX
POP BX
CODE ENDS
END START
2、分别执行以下指令,比较寄存器寻址,寄存器间接寻址和相对寄存器寻址 间的区别。
MOV BX,1000H
MOV AX,BX
MOV AX,[BX]
MOV AX,20[BX]
要求:在执行以上指令时,记下当时DS数据段的值,记下每条指令执行后的AX的结果。将以上指令的"BX"修改为DX执行指令,观察结果及结果产生的原因。
答:DS数据段的值为13D8H,MOV AX,BX 执行后AX的值为1000H,MOV AX,[BX] 执行后AX的值为3325H,MOV AX,20[BX] 执行后AX的值为14ABH。第一条指令是将1000H送入BX寄存器中,指令二是将BX中的值送入AX中,指令三是将存储器中地址为13D8H:1000H字单元内的值送入AX中,指令四是将存储器地址为13D8H:1020H字单元的值送入AX中。
3、已知有如下程序段:
MOV AX,3421H
MOV CL,4
在以上程序段的基础上,分别执行以下指令:
ROL AX,CL
ROR AX,CL
SHL AX,CL
SHR AX,CL
SAR AX,CL
RCL AX,CL
RCR AX,CL
试在DEBUG下用A命令汇编以上程序段,用T命令跟踪,观察以下内容:
(1) 每条指令执行完后,AX寄存器的内容是什么?
(2) 每条指令执行完成后,进位、符号和零标志位的值有什么变化?
答:ROL AX,CL AX=4213H,CF=1,SF=0,ZF=0;
ROR AX,CL AX=1342H,CF=0,SF=0,ZF=0;
SHL AX,CL AX=3420H,CF=1,SF=0,ZF=0;
SHR AX,CL AX=0342H,CF=0,SF=0,ZF=0;
SAR AX,CL AX=0342H,CF=0,SF=0,ZF=0;
RCL AX,CL AX=4213H,CF=1,SF=0,ZF=0;
RCR AX,CL AX=3342H,CF=0,SF=0,ZF=0;
4、设有以下部分程序段:
TABLE DW 10H,20H,30H,40H,50H
ENTRY DW 4
.
.
.
LEA BX,TABLE
ADD BX,ENTRY
MOV AX,[BX]
要求: (1)将以上程序段补充成为一个完整的汇编程序。
(2)在(1)的基础上编辑、调试并运行程序,记录在执行MOV AX,[BX]后AX的内容。
答:(1)DATA SEGMENT
TABLE DW 10H,20H,30H,40H,50H
ENTRY DW 4
BUF DB 20 DUP (?)
DATA ENDS
STACK SEGMENT STACK
DB 10 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
LEA BX,TABLE
ADD BX,ENTRY
MOV AX,[BX]
MOV AH,4CH
INT 21H
CODE ENDS
END START
(2)AX=30H
三、心得及收获
通过此次实验,我已经熟练掌握了程序上机过程,熟悉了程序的汇编、链接、调试的步骤,掌握了Debug常用命令的功能及命令格式。在程序汇编时发现编写程序存在很多错误,无法生成OBJ文件,原因在于第一次上机编写程序,汇编语言命令和程序格式还不是很熟练,对部分命令功能掌握的并不准确,还有输入上的一些错误等,最后根据错误提示解决了问题,完成了实验,这也让我对这些语言命令更熟悉。
实验二 汇编语言程序的调试与运行
一、实验目的
1、 掌握汇编语言的开发环境和运行过程;
2、 熟悉运算类指令对标志位的状态影响以及标志位状态的表示方法;
3、 熟悉逻辑类指令的用法;
4、 掌握传送类指令的功能;
5、掌握顺序程序设计的基本方法。
二、实验内容
1、 求单元内存中所定义的两个字节变量的连续内容之和。要求使用三种不同的方法实现,下边给出一种方法,请自己编写出另外两种方法的程序(提示:(1)用定义字的形式实现;(2)用直接寻址方法实现。
DATA SEGMENT
A DB 5CH,85H
B DB 43H,0ABH
DATA ENDS
STACK SEGMENT STACK
DB 10 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
MOV SI,0
MOV AL,A[SI]
ADD AL,B[SI]
MOV A[SI], AL
INC SI
MOV AL,A[SI]
ADC AL,B[SI]
MOV A[SI],AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
定义字法:
DATA SEGMENT
A DW 855CH
B DW 0AB43H
C DW ?
DATA ENDS
STACK SEGMENT STACK
DW 10 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
MOV SI,0
MOV AX,A[SI]
ADD AX,B[SI]
MOV C[SI],AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
直接寻址:
DATA SEGMENT
A DB 5CH,85H
B DB 43H,0ABH
DATA ENDS
STACK SEGMENT STACK
DB 10 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
MOV AL,[0000]
ADD AL,[0002]
MOV [0000],AL
MOV AL,[0001]
ADC AL,[0003]
MOV [0001],AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
2、编写计算表达式2×(X+Y-50)/Z的值得程序,要求将其商和余数分别放在A、B单元中(设X、Y和Z都是16为有符号数,A、B是字单元,不考虑溢出情况)。
DATA SEGMENT
X DW 1234H
Y DW 4567H
Z DW 1321H
A DW ?
B DW ?
DATA ENDS
STACK SEGMENT STACK
DB 10 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
MOV AX,X
ADD AX,Y
SUB AX,0032H
SHL AX,1
IDIV Z
MOV A,AX
MOV B,DX
MOV AH,4CH
INT 21H
CODE ENDS
END START
结果:A=09H,B=02A9H
3、拆字程序:把偏移地址为1000H中的字内容拆开,并将高字节内容送入4001H单元,将低字节内容送到4002H单元。
DATA SEGMENT
ORG 1000H
DW 3456H
ORG 4001H
DB ?,?
DATA ENDS
STACK SEGMENT STACK
DW 10 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
MOV BX,1000H
MOV AX,WORD PTR [BX]
MOV BX,4001H
MOV [BX],AH
MOV [BX+1H],AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
结果:1000H:56H;
1001H:34H;
4001H:34H;
4002H:56H;
三、心得及收获
经过实验发现对MUL、IMUL、DIV、IDIV等指令的规则并不明确,在运算时不能正确运用。除此之外当然还对汇编语言命对状态标志位的影响更明确,也明确了字单元的数据在内存中时是高位高字节,低位低字节。通过实验还发现对知识点的学习存在很多盲点,是上课听讲认真程度不够,平时看书太马虎,以后得认真对待。
实验三 分支结构程序设计
一、实验目的
1、 熟悉运算类指令对标志位的状态影响以及标志位状态的表示方法;
2、 掌握条件转移、无条件转移指令的使用方法;
3、 掌握分支程序设计、编写、调试和运行的方法。
二、实验内容
1、 编写程序,实现将大写字母字符串转换成小写字符串。
设:字符串的首地址为STRING,字符串的长度在LEN单元内。数据段定义如下:
DATA SEGMENT
STRING DB ‘I am a student’
LEN EQU $-STRING
DATA ENDS
程序如下
DATA SEGMENT
STRING DB 'I am a student'
LEN EQU $-STRING
DATA ENDS
STACK SEGMENT STACK
DB 10 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS, AX
MOV BX, 0000H
ROLL:MOV AL, BYTE PTR[BX]
CMP AL,60H
JNC NEXT
ADD AL,20H
MOV [BX],AL
NEXT:INC BX
CMP BX,LEN
JC ROLL
MOV AH,4CH
INT 21H
CODE ENDS
END START
2、内存中定义三个16位数,判断这三个数是否相等。若三个数相等,则显示 “All equal.”, 若只有其中两个数相等,则显示 “Only two equal.”; 否则,显示 “All three different from each other.”。
DATA SEGMENT
A DW 2345H
B DW 1234H
C DW 3214H
STRING1 DB "All equal$"
STRING2 DB "Only two equal$"
STRING3 DB "All three different from each other$"
DATA ENDS
STACK SEGMENT STACK
DB 10 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV BL,A EQ C
MOV BH,B EQ C
ADD BL,BH
SUB BL,1H
JC ORDER3
SUB BL,1H
JC ORDER2
LEA DX,STRING1
JMP NEXT
ORDER2:LEA DX,STRING2
JMP NEXT
ORDER3:LEA DX,STRING3
JMP NEXT
NEXT:MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
3、从键盘输入一个字符,判断该字符时小写字母、大写字母、数字或其他字符,并给出相应的提示。
DATA SEGMENT
A DB 'This is a capital',0dH,0aH,'$'
B DB 'This is a lowercase',0dH,0aH,'$'
C DB 'This is a figure',0dH,0aH,'$'
D DB 'This is a undefined character',0dH,0aH,'$'
DATA ENDS
STACK SEGMENT STACK
DB 100 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,SS:STACK
START: MOV AX,DATA
MOV DS,AX
NEXT1: MOV AH,01H
INT 21H
CMP AH,0dH
JZ EXIT
CMP AL,30H
JS NEXTD
CMP AL,3AH
JS NEXTC
CMP AL,41H
JS NEXTD
CMP AL,60H
JS NEXTA
CMP AL,61H
JS NEXTD
CMP AL,7BH
JS NEXTB
NEXTD: LEA DX, D
JMP NEXT2
NEXTA: LEA DX, A
JMP NEXT2
NEXTB: LEA DX, B
JMP NEXT2
NEXTC: LEA DX, C
NEXT2: MOV AH,09H
INT 21H
JMP NEXT1
EXIT: MOV AH,4CH
INT 21H
CODE ENDS
END START
三、心得及收获
由于对条件转移类指令掌握的不到位,在程序中出现了错误的转跳,而且不能输练所有的条件转移指令,导致所编写程序过于冗长繁复,不够简洁。由于对分支结构程序的结构利用不合理,导致程序结构混乱,分支部分不太合理,程序有些头重脚轻。这些问题经过不断的练习后已经有了很大的改善。还有在第三题中对字符分类时,将输入字符的ASCII码与其它字符比较时费了好大劲去查各个字符的ASCII码,最后发现完全不用那么麻烦,直接把两个字符进行比较就行了,这也是由于知识点掌握不全面所致,以后会加强。
实验四循环程序设计
一、实验目的
1、 掌握循环指令LOOP、LOOPZ、LOOPNZ的使用方法;
2、 掌握实现单重、多重循环程序设计、编写、调试和运行的方法。
二、实验内容
1、 在数据段变量名为A的数据区内有10个字符,编程实现将这10个字符以相反次序传送到附加段变量名为B的内存区中。源程序已部分给出,请将程序补充完整,并调试运行结果。
DATA SEGMENT
A DB '1234567890'
N EQU $-A
B DB N DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA SI,A
LEA DI,B
ADD DI,N
MOV CX,N
MOVE: MOV AL,[SI]
MOV ES:[DI],AL
INC SI
DEC DI
LOOP MOVE
MOV AH,4CH
INT 21H
CODE ENDS
END START
2、 编写一个程序,将内存1000H开始的连续100个字节送往1050H开始的连续100个内存单元中。
DATA SEGMENT
A DB 20 DUP(?)
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
START:MOV AX,DATA
MOV DS,AX
MOV CX,64H
MOV SI,1000H
MOV DI,1050H
ADD SI,63H
ADD DI,63H
NEXT: MOV AX,[SI]
MOV [DI],AX
DEC SI
DEC DI
LOOP NEXT
MOV AH,4CH
INT 21H
CODE ENDS
END START
3、 数据段开始区域中,连续存放着10个无符号数,编写程序找出这10个数中最大的一个数,并将其存放到该数据区的后边。
DATA SEGMENT
A DB 12H,32H,45H,23H,98H,32H,54H,76H,64H,86H
B DB 0
N EQU $-A
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
START:MOV AX,DATA
MOV DS,AX
LEA BX,A
MOV CX,N
MOV AL,[BX]
ORDER:INC BX
CMP AL,[BX]
JNB NEXT
MOV AL,[BX]
NEXT: LOOP ORDER
MOV B,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
三、心得及收获
本次实验内容是熟悉循环结构程序的编写,循环语句很简单,很容易完成,但在程序中要特别注意的是程序的循环次数。在第二题中我运行了自己编写的程序后发现结果并不像题目所要求的,其它的符合要求,但1000H单元中的内容并未移到1050H单元中。经反复检查发现移位100次应该是从1063H开始到1000H结束,我开始是从1064H开始的,循环了100次之后到1001H结束了,没有达到预期目的,程序错误。所以程序循环次数要特别注意。
实验六 DOS中断功能调用程序设计
一、实验目的
掌握1号、2号、9号和10号DOS系统功能的调用方法和程序设计方法。
二、实验内容
1、 编程实现由键盘输入任意一个字符,将该字符的ASCII码值显示在屏幕上。
DATA SEGMENT
A DB 20 DUP(?)
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
START:MOV AX,DATA
MOV DS,AX
NEXT:MOV AH,01H
INT 21H
CMP AL,0DH
JNZ NEXT
MOV AH,4CH
INT 21H
CODE ENDS
END START
2、 编写一程序,实现从键盘输入一个字符,判断其是不是一个数字,如果是则请输出这个数字,如果不是,请输出 “这不是一个数字” 的英文信息。
DATA SEGMENT
STRING DB 'This is not a Figure',0DH,0AH,'$'
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
START:MOV AX,DATA
MOV DS,AX
NEXT2:MOV AH,08H
INT 21H
CMP AL,0DH
JZ EXIST
CMP AL,30H
JB NEXT
CMP AL,39H
JA NEXT
MOV DL,AL
MOV AH,02H
INT 21H
JMP NEXT3
NEXT:LEA DX,STRING
MOV AH,09H
INT 21H
NEXT3:JMP NEXT2
EXIST:MOV AH,4CH
INT 21H
CODE ENDS
END START
3、 从键盘键入10个字符,然后以与键入相反的顺序输出。
DATA SEGMENT
INFO1 DB 0DH,0AH,'INPUT STRING:$'
INFO2 DB 0DH,0AH,'OUTPUT STRING:$'
STR DB 20 DUP(?)
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
START:MOV AX,DATA
MOV DS,AX
LEA DX,INFO1
MOV AH,09H
INT 21H
MOV CX,0AH
LEA BX,STR
INPUT:MOV AH,01H
INT 21H
MOV SI,CX
MOV [BX][SI],AL
LOOP INPUT
MOV AH,09H
LEA DX,INFO2
INT 21H
MOV AH,09H
LEA DX,STR
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
三、心得及收获
在本次实验中发现对自己对DOS中断功能调用很不熟悉,对各个功能调用入口和出口参数没记清楚,导致了很多错误。在排除这些错误之后发现调用9号功能输出要求字符串后还会跟随很多乱码,最后经过看书才知道9号功能要输出的字符串后必须以“$”结尾。而且编写的程序输入字符时输入一个就结束了,最后经反复改进才可以多次输入。
实验八存储器扩展实验
一、实验目的
1、 片选存储器扩展方法;
2、 了解61C256 RAM特性;
3、 学习数据存储不同的读写方法;
4、 学习片外程序存储器的读方法。
二、实验设备
1.PC计算机 1台
2.Dais-X86实验箱 1台
三、实验内容
使用一片61C256(32K),作为片外扩展的数据存储器,按图8.1流程编写一程序,实现对其进行读、写验证操作。
说明:试验箱已配有一片作为实验程序空间,地址从0000:0000H~7FFFH
图8.1 程序流程
图8.2 实验线路
实验程序:CODE SEGMENT
ORG 1000H
ASSUME CS:CODE
START:MOV BX,8000H
MOV CX,100H
NEXT:MOV BYTE PTR[BX],12H
INC BX
LOOP NEXT
CODE ENDS
END START
三、心得及收获
本次完成的存储器扩展实验重点在于扩展电路的连接,但本实验只需进行一片存储器扩展,比较简单,而且测试程序也十分简单,只是实验系统很不稳定,容易出现故障,即使一切操作都正确,也得经反复多次尝试才能成功。