实验内容
通过对实验程序的编写、调试,使学生熟悉8086的指令系统等,了解程序设计过程,掌握汇编程序设计方法以及如何使用实验系统提供的各种调试、分析手段来排除程序错误。
实验一 数据传送
一、实验目的
熟悉8086汇编指令,能自己编写简单的程序,掌握数据传输的方法。
二、实验内容
编写程序,实现数据段的传送、校验。
三、程序框图
四、实验步骤
在DS段内3000H~30FFH中输入数据;使用单步、断点方式调试程序,检测DS段内6000H ~60FFH中的内容。熟悉查看特殊功能寄存器、CS段、DS段的各种方法。
五.程序清单
.MODEL SMALL
.STACK 100
.DATA
CODE SEGMENT
ASSUME CS:CODE
STA: MOV AX,@DATA
MOV DS,AX
MOV ES,AX
NOP
MOV CX,100H
MOV SI,3000H
MOV DI,6000H
CALL T1
MOV CX,100H
MOV SI,3000H
MOV DI,6000H
CLD
REPE CMPSB
JMP $
T1 PROC NEAR
CLD
CMP SI,DI
JZ Retu
JNB T2
ADD SI,CX
DEC SI
ADD DI,CX
DEC DI
STD
T2: REP MOVSB
Retu: RET
T1 ENDP
CODE ENDS
END STA
六、实验结果分析
在输入数据之后,运用单步、断点方式调试程序后,可以较为顺利地检测检测DS段内中的内容,在本次实验之中,已经大概熟悉了查看特殊功能寄存器、CS段、DS段的各种方法,经过这次实验,熟悉来8086汇编指令,能自己编写简单的程序,成功掌握数据传输的方法,有了不小的收获。
实验二 双字节BCD码(十进制数)减法
一、实验目的
熟悉8086汇编指令,掌握汇编语言的设计和调试方法。能画出程序流程框图,自己设计程序,熟悉BCD码、补码,了解如何调用系统提供的子程序。
二、实验内容
从键盘上输入4位被减数、减数,实现双字节BCD码(四位数)的减法,结果显示在数码管上;进一步熟悉使用断点、单步进入、单步、运行到光标处、修改PC指针、全速运行等各种调试手段;熟悉查看特殊功能寄存器、CS段、DS段存贮器的各种方法。
三、程序框图
四、实验步骤
首先从键盘上输入4位被减数、减数,然后通过运算实现双字节BCD码的减法,将结果显示;使用各种调试手段对程序进行调试;查看特殊功能寄存器。
五.程序清单
.MODEL SMALL
.STACK 100
DATA SEGMENT
REL DB 5 DUP(0)
F1 DB 1
one DB 8 DUP(?)
two DW 1 DUP(?)
trd DW 1 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
STA1: MOV AX,DATA
MOV DS,AX
MOV ES,AX
NOP
MOV F1,0
STA2: LEA DI,two
MOV CX,4
CALL GK
MOV F1,1
LEA DI,trd
MOV CX,4
CALL GK
MOV AX,two
MOV BX,trd
MOV DL,10H
CMP AX,BX
JNB STA3
XCHG AX,BX
MOV DL,11H
STA3: SUB AL,BL
DAS
XCHG AL,AH
SBB AL,BH
DAS
XCHG AL,AH
CLD
LEA DI,one
CALL B12
MOV AL,AH
CALL B12
MOV AL,10H
STOSB
STOSB
STOSB
STOSB
LEA SI,one+3
MOV CX,3
CALL BD
LEA SI,one
MOV AH,9
INT 21H
JMP STA2
GK PROC NEAR
MOV REL+1,AL
MOV AX,DX
MOV DX,0
MOV BX,100
DIV BX
MOV REl+2,AL
MOV AX,DX
MOV DX,0
MOV BX,10
DIV BX
MOV REl+3,AL
MOV REL+4,DL
MOV AH,4CH
INT 21H
RET
GK ENDP
B12 PROC NEAR
PUSH AX
AND AL,0FH
STOSB
POP AX
AND AL,0F0H
MOV CL,4
ROR AL,CL
STOSB
RET
B12 ENDP
BD PROC NEAR
B1: MOV AL,[SI]
CMP AL,0
JNZ ET
MOV AL,10H
MOV [SI],AL
DEC SI
LOOP B1
ET: CLD
MOV [SI+1],DL
RET
BD ENDP
CODE ENDS
END STA1
六、实验结果分析
首先要得到减数和被减数,先判断减数和被减数之间的大小问题,判断之后,进行相应的处理,先将两数的低位进行相减,将结果转换为十进制,再将两数的高位进行相减,再将结果转换为十进制,将结果合并,再转换为BCD码,再转换为非压缩BCD码,显示结果。在本次实验中,进一步熟悉使用断点、单步进入、单步、运行到光标处、修改PC指针、全速运行等各种调试手段;对查看特殊功能寄存器、CS段、DS段存贮器的各种方法更熟悉。
实验三 四字节十六进制数转十进制数
一、实验目的
进一步熟悉8086汇编指令,了解十六进制数转十进制数的方法。
二、实验内容
从键盘上输入8位十六进制数,实现四字节十六进制数转8位十进制数,并在数码管上显示。注意输入数据必须在00000000H~05F00000H范围,否则,结果超出8位十进制数,无法正确显示。
三、程序框图
四、实验步骤
从键盘上输入8位十六进制数,实现四字节十六进制数转8位十进制数,在数码管上显示。
五.程序清单
.MODEL SMALL
.STACk 100
DATA SEGMENT
REL DB 5 DUP(0)
F1 DB 1
BUF DB 8 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
STA1: MOV AX,DATA
MOV DS,AX
MOV ES,AX
NOP
MOV F1,0
STA2: LEA DI,BUF
MOV CX,8
CALL GK
MOV F1,1
MOV SI,WORD PTR BUF
MOV DI,WORD PTR BUF+2
CALL BD4
LEA DI,BUF
CALL BB2
MOV AL,AH
CALL BB2
MOV AL,BL
CALL BB2
MOV AL,BH
CALL BB2
LEA SI,BUF+7
MOV CX,7
CALL BD
LEA SI,BUF
MOV AH,9
INT 21H
JMP STA2
GK PROC NEAR
MOV REL+1,AL
MOV AX,DX
MOV DX,0
MOV BX,100
DIV BX
MOV REl+2,AL
MOV AX,DX
MOV DX,0
MOV BX,10
DIV BX
MOV REl+3,AL
MOV REL+4,DL
MOV AH,4CH
INT 21H
RET
GK ENDP
BB2 PROC NEAR
PUSH AX
AND AL,0FH
STOSB
POP AX
AND AL,0F0H
MOV CL,4
ROR AL,CL
STOSB
RET
BB2 ENDP
BD PROC NEAR
STD
MOV DI,SI
BD1: LODSB
CMP AL,0
JNZ ET
MOV AL,10H
STOSB
LOOP BD1
ET: CLD
RET
BD ENDP
BD4 PROC NEAR
XOR AX,AX
XOR BX,BX
MOV CX,32
BD41: RCL SI,1
RCL DI,1
ADC AL,AL
DAA
XCHG AL,AH
ADC AL,AL
DAA
XCHG AL,BL
ADC AL,AL
DAA
XCHG AL,BH
ADC AL,AL
DAA
XCHG AL,BH
XCHG AL,BL
XCHG AL,AH
LOOP BD41
RET
BD4 ENDP
CODE ENDS
END STA1
六、实验结果分析
从外部获得十六进制数,再将其转换为十进制数,在数码管上显示,只要注意十六进制数的输入问题即可,经过本次实验,我进一步熟悉8086汇编指令,了解十六进制数转十进制数的方法,对于汇编有了更深的理解。
实验四 冒泡排序
一、实验目的
熟悉使用8086指令,掌握汇编语言的设计和调试方法,了解如何使用高效方法对数据排序。
二、实验内容
编写并调试一个排序程序,要求使用冒泡法将一组数据从小到大重新排列。
三、程序框图
四、实验步骤
使用断点方式调试程序,检查数据段中数据是否按从小到大的顺序排列。
五.程序清单
.MODEL SMALL
.STACK 100
DATA SEGMENT
T1 DB 3H,5H,6H,2H,9H,35H,04H,57H,62H,07H,0FFH,0A0H,43H,99H,52H,89H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
STA1: MOV AX,DATA
MOV DS,AX
NOP
MOV CX,15
STA2: PUSH CX
LEA SI,T1
MOV DL,0
STA3: LODSB
MOV AH,[SI]
CMP AH,AL
JNB STA4
MOV [SI],AL
MOV [SI-1],AH
MOV Dl,1
STA4: LOOP STA3
POP CX
CMP DL,0
JZ ET
LOOP STA2
ET: JMP $
CODE ENDS
END STA1
六、实验结果分析
本次实验是编写一个冒泡排序的程序,用冒泡法将一组数据从小到大排列,在本次实验之中,我再一次熟悉使用8086指令,掌握更多的汇编语言的设计和调试方法,了解了如何使用高效方法对数据排序,对汇编语言有了更深的理解。