实 验 报 告
课 程 名 称
实 验 名 称
实 验 日 期
学 生 专 业
学 生 学 号
学 生 姓 名
教 师 姓 名
成 绩
南京理工大学机械工程学院
实验一 DEBUG命令及其操作
一、实验目的
1. 熟练掌握debug的常用命令,学会用debug来调试程序。
2. 深入了解数据在存储器中的存取方法及堆栈中数据的压入与弹出。
3. 掌握各种寻址方法以及简单指令的执行过程。
二、实验要求
1. 实验前要作好充分准备,包括汇编程序清单、调试步骤、调试方法以及对程序结果的分析等。
2. 本实验要求在PC机上进行。
3. 本实验只要求在DEBUG调试状态下进行,包括汇编程序,调试程序,执行程序。
三、实验内容
l 实验内容1:学习用DEBUG调试工具进行源程序的输入、汇编、调试和执行。
实验报告要求:
1. 写出运行结果;
2. 小结debug常用命令及使用体会
答:1.原文已给出(略)
2.a 汇编
d显示内存单元内容
e修改单元内存内容
g执行命令
t单步(或多步)调试
n指定文件路径文件名(含扩展名)
u反汇编
r查看寄存器值及修改
l加载程序
w写盘命令
体会:提升学习热情和动手能力 有助于理解代码执行过程
l 实验内容2
设AX=3000H,BX=5000H,请编一程序段将AX的内容和BX的内容进行交换。请用堆栈作为两寄存器交换内容的中间存储单元,用DEBUG调试程序进行汇编与调试。
实验报告要求:
1. 写出完成上述功能的程序段;
2. 单步执行,并记录寄存器AX, BX及堆栈指针SP的值
答:
A100
Mov ax,3000 ; ax:3000 bx:0000 sp:ffee
Mov bx,5000 ;ax:3000 bx:5000 sp:ffee
Push ax ;ax:3000 bx:5000 sp:ffec
Mov ax,bx ;ax:5000 bx:5000 sp:ffec
Pop bx ;ax:5000 bx:3000 sp:ffee
Int 20
l 实验内容3
设DS=当前段地址,BX=0300H,SI=0002H,请用DEBUG的命令将存储器偏移地址300H~304H连续单元装入0AH,0BH,0CH,0DH,0EH。在DEBUG状态下送入下面的程序,并用单步执行的方法,分析每条指令源地址的形成过程?当数据传送完毕时,AX中的内容是什么?
实验报告要求:
1. 写出源操作数的寻址方式;
2. 单步执行,并记录相关寄存器及存储单元的值
A100 ;给各内存单元赋值
Mov di,0300
Mov dx,0a
Mov cx,5
1oop1:mov[di],dx
Inc di
Inc dx
1oop loop1
程序清单如下: 寻址方式和AX的内容
MOV BX,0300 立即寻址
MOV SI, 0002 立即寻址
MOV AX,BX 寄存器寻址 AX: 0300
MOV AX,0304H 立即寻址 AX:0304
MOV AX,[0304H] 存储器直接寻址 AX:ds:0304 内存单元的内容0EH
MOV AX,[BX] 寄存器间接寻址 AX:ds:0300 内存单元的内容0AH
MOV AX,0001[BX] 基址相对寻址 AX:ds:0301 内存单元的内容0BH
MOV AX,[BX][SI] 基址变址寻址 AX:ds:0302 内存单元的内容0CH
MOV AX,0001[BX][SI] 基址变址寻址 AX:ds:0303内存单元的内容0DH
l 实验内容4
设AX=0002H,编写程序将AX的内容乘10,要求用移位的方法完成。
写出实现上实验报告要求:
1. 述功能的程序段;
2. 单步执行程序,记录每条指令的机器码及相关寄存器的内容
注意:左移指令用SHL,而不能使用SAL
A100
Mov ax,2 机器码:b80200 ax:0002 dx:0000 cl:00
Mov dx,0 机器码:ba0000 ax:0002 dx:0000 cl:00
Shl ax,1 机器码:d1e0 ax:0004 dx:0000 cl:00
Mov dx,ax 机器码: 01d0 ax:0004 dx:0004 cl:00
Mov cl,2 机器码:b102 ax:0004 dx:0004 cl:02
Shl ax,cl 机器码:d3e0 ax:0010 dx:0004 cl:02
Add ax,dx 机器码:01d0 ax:0014 dx:0004 cl:02
Int 20 机器码:cd20 ax:0014 dx:0004 cl:02
实验二 简单程序的编写及汇编连接
一、 实验目的
1. 熟练掌握编写汇编语言源程序的基本方法和基本框架。
2. 学会编写顺序结构、分支结构和循环结构的汇编程序,掌握宏定义与宏调用的方法。
3. 掌握程序中数据的产生与数输出的方法。
4. 熟悉建立源文件,进行汇编和连接的全过程,并对程序进行调试。
二、 实验要求
1. 实验前准备
① 分析题目,将程序中的原始数据、中间结果和最终结果的存取方式确定好。
② 写出算法或画出流程图。
③ 写出源程序。
④ 对程序中的结果进行分析,并准备好上机调试的过程。
2. 本实验要求在PC机上进行。
3. 汇编过程中出现问题,可用DEBUG进行调试。
三、 实验内容
1.实验内容1
① 编辑源程序(参考程序见下),建立 .ASM文件;
② 用MASM程序汇编,生成 .OBJ文件;查看 .LST文件的内容
③ 用LINK程序链接,生成 .EXE文件;
④ 使用DEBUG命令将 .EXE文件调进内存,执行后查看程序运行结果;
⑤ 使用DEBUG命令,检查各段在内存当中分配情况。
参考程序:
; exercize21
data segment
org 0200h
buffer dw 0, 1, -5, 10, 256, -128, -100, 45, 6, 3,
dw -15,-67, 39, 4, 20, -1668, -32766, 32765, -525,
dw 300
count equ ($-buffer)/2
max dw ?
data ends
stack segment stack 'stack'
db 100 dup ('s')
stack ends
code segment para 'code'
assume cs:code, ds:data, ss:stack
sta proc far
push ds
xor ax, ax
push ax
mov ax, data
mov ds, ax
lea si, buffer
mov cx, count
dec cx
mov ax, [si]
chkmax: add si, 2
cmp [si], ax
jle next
mov ax, [si]
next: loop chkmax
mov max, ax
ret
sta endp
code ends
end sta
实验报告要求:
1. 小结汇编语言源程序的编译及连接过程;
2. 记录数据段在程序执行前后的内容
3. 写出程序调试中出现的问题及解决方法;
答:
1. 把待汇编的程序放在存放汇编、链接程序的文件夹里打开汇编程序输入待汇编的程序名字 ,以默认配置生成obj文件,再打开链接程序输入待链接的程序名字以默认配置生成exe文件
2. 执行前后buff数据数据块不变 max执行前数据为0000H执行后为7ffdH
3. 很顺利
作业:编程并且在计算机上调试。
①用汇编语言编写一个加法程序:
1234+5678
请用ASCII码的形式将加数与被加数存放在数据区DATA1和DATA2中,并将相加的结果显示输出。
②假设有一组数据:5,-4,0,3,100,-51,……,请编一程序,判断每个数是否大于0,等于0,还是小于0,并输出判断结果。即:
1 当x>0
y = 0 当x=0
-1 当x<0
①sstack segment
dw 32 dup(?)
sstack ends
data segment
data1 db ‘1234'
data2 db ‘5678’
data3 db 4 dup(?)
data ends
code segment
assume cs:code,ss:sstack,ds:data
sta:push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
lea si,data1
lea di,data2
lea bx,data3
mov al,[si+3]
mov ah,[di+3]
and al,0fh
and ah,0fh
add al,ah
or al,30h
mov [bx+3],al
mov al,[si+2]
mov ah,[di+2]
and al,0fh
and ah,0fh
adc al,ah
or al,30h
mov [bx+2],al
mov al,[si+1]
mov ah,[di+1]
and al,0fh
and ah,0fh
adc al,ah
or al,30h
mov [bx+1],al
mov al,[si]
mov ah,[di]
and al,0fh
and ah,0fh
adc al,ah
or al,30h
mov [bx],al
mov cx,4
mov ah,2h
a1:mov dl,[bx]
int 21h
inc bx
loop a1
ret
code ends
end sta
②sstack segment stack 'stack'
dw 32 dup(?)
sstack ends
data segment
buff db 12,-23,5,-4,0,3,100,-51,3,-45,9,2
data ends
count equ $-buff
code segment
assume ss:sstack,ds:data,cs:code
start prog far
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
lea bx,buff
lea si,count
mov cx,[si]
loop1:mov al,[bx]
cmp al,0
jz aa1
and al,80h
jz aa2
mov ah,2
mov dl,2dh
int 21h
aa: inc bx
loop loop1
jmp ov
aa1:mov ah,2
mov dl,30h
int 21h
jmp aa
aa2:mov ah,2
mov dl,31h
int 21h
jmp aa
ov:ret
start endp
code ends
end start
实验三 8254定时/计数器应用实验
一、实验目的
1、掌握8254的工作方式及应用编程;
2、掌握8254典型应用电路的接法。
二、实验设备
PC机一台,TD-PIE实验装置一套,示波器一台。
三、实验内容
1、计数应用实验。编写程序,应用8254的计数功能,使用单次脉冲模拟计数,使每当按动‘KK1 +’5次后,产生一次计数中断,并在屏幕上显示一个字符‘M’。
2、定时应用实验。编写程序,应用8254的定时功能,产生一个1 ms的方波。
1、计数应用实验
编写程序,将8254的计数器0设置为方式3,计数值为十进制数4,用单次脉冲KK 1+作为CLK0时钟,OUT0连接MIR7,每当KK1+按动5次后产生中断请求,在屏幕上显示字符‘M’。
实验步骤:
(1) 实验接线如图4-2所示;
(2) 编写实验程序,经编译、链接无误后装入系统;
(3) 运行程序,按动KK1+产生单次脉冲,观察实验现象;
(4) 改变计数值,验证8254的计数功能。
实验程序清单:
A8254 EQU 06C0H ;8254计数器0的端口地址
B8254 EQU 06C2H ;8254计数器1的端口地址
C8254 EQU 06C4H ;8254计数器2的端口地址
CON8254 EQU 06C6H ;8254控制字寄存器的端口地址
SSTACK SEGMENT STACK
DW 32 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE, SS:SSTACK
START : PUSH DS
MOV AX, 0000H
MOV DS,AX
Lea ax,irq7
mov si,3ch
mov [si],ax
mov ax,seg irq7
mov [si+2],ax
CLI
POP DS
;初始化主片8259,其端口地址为20H和21H
MOV AL,11H
OUT 20H,AL ;ICW1
MOV AL,08H
OUT 21H,AL ;ICW2
MOV AL,04H
OUT 21H,AL ;ICW3
MOV 21H,01H
OUT 21H,AL ;ICW4
MOV AL,6FH ;OCW1
OUT 21H,AL
;初始化8254
MOV DX,CON8254
MOV AL,____11h_____ ;计数器0,方式0
OUT DX,AL
MOV DX,A8254
MOV AL,_____04h____ ;给计数器0送初值
OUT DX,AL
STI
AA1: JMP AA1
;中断服务程序
IRQ7: MOV AX,014DH
INT 10H ;显示字符M
MOV AX,0120H
INT 10H
MOV AL,__20h_____
OUT ___20h____,AL ;中断结束命令
IRET
CODE ENDS
END SEGMENT
2、定时应用实验
编写程序,将8254的计数器0设置为方式3,用信号源1MHz作为CLK0时钟,OUT0输出波形为1 ms方波。
实验步骤:
(1)接线图如图4-3所示;
(2)根据实验内容,编写实验程序,经编译、链接无误后装入系统;
(3)运行实验程序,用示波器测试OUT0输出,验证程序功能。
实验程序清单
A8254 EQU 06C0H
B8254 EQU 06C2H
C8254 EQU 06C4H
CON8254 EQU 06C6H
SSTACK SEGMENT STACK
DW 32 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE
START:MOV DX,CON8254
MOV AL,____37h____ ;8254控制字,计数器0,方式3
OUT DX,AL
MOV DX,A8254
MOV AL,___63h_____ ;给计数器0送初值
OUT DX,AL
MOV AL,____09h____
OUT DX,AL
AA1: JMP AA1
CODE ENDS
END START
六、思考题
1、在将计数初值赋给8254后,马上就可以启动并进行定时或计数吗?
答:不是,计数的开始还得看门控信号,在写入初值后若门控信号有效(软件触发为高电平有效,硬件触发为上升沿有效)则开始计数,否则等待有效门控信号的到来才开始计数
2、若CLK0输入1.925MHz的时钟,能否在OUT0实现输出30ms的定时脉冲?
答:30*1925=57750<65535 所以用二进制写初值方式可以实现,若用十进制方式写初值则不能实现(十进制最大计数初值为0,即10000)
实验四 8255并行接口实验
一、实验目的
1、学习并掌握8255的工作方式及其应用;
2、掌握8255典型应用电路的接法。
二、实验设备
PC机一台,TD-PITE实验装置一套。
三、实验内容
1、基本输入输出实验。
本实验系统中,8255的端口地址分别为0640H,0642H,0644H以及0646H。编写程序,使8255的A口为输入,接拨动开关,B口为输出,接发光二极管;要求只要开关拨动,发光二极管的显示就发生相应改变。
2、流水灯显示实验。
编写程序,使8255的A口和B口均为输出,数据灯D7~D0由左向右,每次仅亮一个灯,循环显示,D15~D8与D7~D0正相反,由右向左,每次仅点亮一个灯,循环显示。
四、实验原理
并行接口是以数据的字节为单位与I/O设备或被控制对象之间传递信息。CPU和接口之间的数据传送总是并行的,即可以同时传递8位、16位或32位等。8255可编程外围接口芯片是Intel公司生产的通用并行I/O接口芯片,它具有A, B, C三个并行接口,用+5 V单电源供电,能在以下三种方式下工作:方式0——基本输入/输出方式、方式1——选通输入/输出方式、方式2——双向选通工作方式。8255的内部结构及引脚如图5-1所示,8255工作方式控制字和C口按位置位/复位控制字格式如图5-2所示。
五、实验步骤
1、基本输入输出实验
本实验使8255端口A工作在方式0并作为输入口,端口B工作在方式0并作为输出口。用一组开关信号接入端口A,端口B输出线接至一组发光二极管上,然后通过对8255芯片编程来实现输入输出功能。具体实验步骤如下述:
(1) 实验接线图如图5-3所示,按图连接实验线路图;
(2) 编写实验程序,经编译、连接无误后装入系统;
(3) 运行程序,改变拨动开关,同时观察LED显示,验证程序功能。
实验程序清单
SSTACK SEGMENT STACK
DW 32 DUP (?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE
START: MOV DX,0646H
MOV AL,_____90h_____ ;8255的工作方式控制字
OUT DX,AL
AA1: MOV DX,0640H
IN AL,DX
CALL DELAY
MOV DX,0642H
OUT DX,AL
JMP AA1
;延时子程序
DELAY: PUSH CX
MOV CX,0F00H
AA2: PUSH AX
POP AX
LOOP AA2
POP CX
RET
CODE ENDS
END START
2、流水灯显示实验
使8255的A口和B口均为输出,数据灯D7àDO由左向右,每次仅亮一个灯,循环显示,D15~D8与D7~D0正相反,由右向左,每次仅点亮一个灯,循环显示。实验接线图如图5-5所示。实验步骤如下所述:
(1) 按图5-5连接实验线路图;
(2) 编写实验程序,经编译、链接无误后装入系统;
(3) 运行程序,观察LED灯的显示,验证程序功能;
(4) 自己改变流水灯的方式,编写程序。
实验程序清单
SSTACK SEGMENT STACK
DW 32 DUP (?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE
Start:mov dx.0646h
Mov al,80h
Out dx,al
Mov bx,0180h
Aa1:mov dx,0640h
Mov al,bl
Out dx,al
Call delay
Mov dx,0642h
Mov al,bh
Out dx,al
Call delay
Ror bl,1
Rol,bh,1
Jmp aa1
DELAY: PUSH CX
MOV CX,0F00H
AA2: PUSH AX
POP AX
LOOP AA2
POP CX
RET
CODE ENDS
END START