微机原理及应用实验
课程名称___微机原理及应用实验___ 学生学院信息工程学院
专业班级
学号
学生姓名
指导老师乐金松
2016年05 月11 日
实验二数据处理程序(一)
实验目的:
1、进一步学习、掌握汇编程序调试方法
2、弄清子程序调用和返回过程
3、通过实验调试乘法、除法程序,弄清多字节乘除法程序的基本算法和
程序设计方法
实验内容:
1、源程序的编辑
2、源程序的剪辑、编译、链接
3、汇编程序调试,完成相关数据的记录和分析
实验步骤:
一、程序剪辑和编辑
1、下面是一段主程序模板,请将L8086软件包中的乘法和除法程序的
主体部分拷贝粘贴在指定的位置,以MAIN.ASM文件名保存;-------------------------------------------------------------------------
STACK SEGMENT STACK 'STACK'
DB 1024 DUP (0)
STACK ENDS
;----------------------------------------------------------------------------
;define data segment
DATA SEGMENT
;------------------------------------------- ;地址分配
R0 DW (?) ;0000H
R1 DW (?) ;0002H
R2 DW (?) ;0004H
R3 DW (?) ;0006H
R4 DW (?) ;0008H
R5 DW (?) ;000AH
R6 DW (?) ;000CH
R7 DW (?) ;000EH
;----------------------------------------------------------------------------------
X DD 12345678H ;0010H~003H
Y DD 87654321H ;0014H~0017H
Z DD 55555555H ;0018H~001BH
;------------------------------------------------------------------------------------
buffer0 DB (?) ;001CH
buffer1 DB (?)
buffer2 DB (?)
buffer3 DB (?)
buffer4 DB (?)
buffer5 DB (?)
buffer6 DB (?)
buffer7 DB (?)
;----------------------------------------------------
DATA ENDS
;---------------------------------------------------------
;define code segment
PROGRAM SEGMENT
ASSUME CS:PROGRAM, DS:DATA, SS:STACK
;******************************************************* MAIN PROC FAR
START: PUSH DS ;return DOS standard program MOV AX,0
PUSH AX
MOV AX,DATA ;set DS
MOV DS,AX
;--------------主循环程序-------------------------------------------
DO_WAIT:
CALL BMUL
CALL BDIV
; CALL KEY_SCAN
; CALL BCTD
; CALL DELAY
JMP DO_WAIT
RET
MAIN ENDP
;----------------以下为过程子程序------------------------------------
;===============R2R3*R6R7=R4R5R6R7================== BMUL PROC NEAR
;……
BMUL ENDP
;------------R4R5R6R7/R2R3=R6R7--------------------
BDIV PROC NEAR
;……
BDIV ENDP
;---------------二翻十程序--------------------------------
BCTD PROC NEAR
RET
BCTD ENDP
;-----------------软件延时----------------------------------
DELAY PROC NEAR
RET
DELAY ENDP
;-------------------键盘扫描--------------------------------
KEY_SCAN P ROC NEAR
RET
KEY_SCAN E NDP
;------------------------------------------------------------
PROGRAM ENDS
END START
;---------------------------------------------------------------------------------------
2、将程序编译连接成可执行文件。
二、程序载入
1、用DEBUG命令将程序载入到内存
2、用反汇编U命令观察和记录以下信息:
主程序起始地址:[ 07AD : 0000 ]
主程序结尾地址:[ 07AD : 001D ]
乘法程序起始地址:[ 07AD : 0013 ]
乘法程序结尾地址:[ 07AD : 0066 ]
除法程序起始地址:[ 07AD : 0067 ]
除法程序结尾地址:[ 07AD : 00CA ]
代码段段地址:CS=07AD
用户数据段段地址:DATA=07AA
当前系统数据地段段地址:DS=075A
乘法子程序入口地址:BMUL=0013
除法子程序入口地址:BDIV=0067
3、用R命令观察记录一下信息
DS=075A
ES=075A
SS=076A
SP=0400
4、执行程序G0A回车,用D0命令观察并记录以下信息
R0分得的单元地址:07AA:0000~07AA:0001
R7分得的单元地址:07AA:000E~07AA:000F
X分得的地址:07AA:0010~07AA:0013
X双字数据存放的顺序:单元号地址:0010 内容:0X78
单元号地址:0011 内容:0X56
单元号地址:0012 内容:0X34
单元号地址:0013 内容:0X12 Y分得的地址:07AA:0014~07AA:0017
Y双字数据存放的顺序:单元号地址:0014 内容:0X21
单元号地址:0015 内容:0X43
单元号地址:0016 内容:0X65
单元号地址:0017 内容:0X87
三、程序的调试
1、调试乘法程序:
1)程序执行到乘法子程序入口
2)在入口参数输入:R2R3=100 0000 6400
R6R7=100 0000 6400
3)执行程序到乘法程序RETF指令处,查看结果
R4R5R6R7=0000 0000 0000 1027
4)自行输入一组数据,复位IP=0,验证结果
R2R3=10 (0000 0a00)
R6R7=10 (0000 0a00)
执行程序后:R4R5R6R7=0000 0000 0000 6400
2、调试除法程序:
1)复位IP=0,将程序执行到除法子程序入口
2)在入口信息输入数据:R4R5R6R7=10000
R2R3=100
3)程序执行到除法程序的RETF指令,用D0命令查看结
R6R7=0000 6400
4)自选一组数据,自行验证除法程序
R4R5R6R7=0000 0000 0000 1E00
R2R3=0000 0600
执行程序后结果R6R7=0000 0500
四、编程,R0R1=X*Y/Z
1)自行编写一段程序,调用乘法和除法程序,计算上式
DO_WAIT:
MOV AX,X
MOV R3,AX
MOV AX,X+2
MOV R2,AX
MOV AX,Y
MOV R7,AX
MOV AX,Y+2
MOV R6,AX
CALL BMUL ;第一断点
MOV AX,Z ;第二断点
MOV R3,AX
MOV AX,Z+2
MOV R2,AX
CALL BDIV ;第三断点
MOV AX,R7
MOV R1,AX
MOV AX,R6
MOV R0,AX
JMP DO_WAIT ;第四断点
1、执行程序,验证结果
程序执行到第一断点:R2R3=34127856(即是0x12345678)
R6R7=65872143(即是0x87654321)
程序执行到第二断点:R4R5R6R7=A00905CDB870788D
(即是0x09A0CD0570B88D78)
中间结果正确吗?
答:运行的中间结果正确,0x12345678*0x87654321=0x09a0cd0570b88d78程序执行到第四断点:R6R7=1CE2 6710
程序执行到第三断点:R2R3= 55555555(即是0x55555555)
R4R5R6R7= A00905CDB870788D
(即是0x09A0CD0570B88D78)
程序执行到第四断点:R6R7=E21C1067(即是0x1CE26710)
中间结果正确吗?
答:运行结果正确0x09A0CD0570B88D78/0x55555555=0x1CE26710
2、自行修改数据段定义的X,Y ,Z 的值,执行程序验证结果
X= 1111h
Y=2222h
Z=3333h
R0R1=0000600B(即是0x0B60),运行结果正确