实验6 顺序程序设计及跟踪调试实验
【实验名称】顺序程序设计及跟踪调试实验
【实验目的】
学习顺序程序的设计方法,掌握汇编程序的编辑、编译、连接、运行调试过程。
【实验内容】
编写程序,计算Z=((W-X)/10*Y)的平方值,R为相除所得余数,其中W,X,Y均为八位有符号二进制数。
参考程序清单:
DATA SEGMENT
W DB -128
X DB 127
Y DB -100
R DB 0
Z DD 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
BEGIN: MOV AX,DATA
MOV DS,AX
MOV AL,X
CBW
MOV BX,AX
MOV AL,W
CBW
SUB AX,BX
MOV BL,10
IDIV BL
MOV R,AH
IMUL Y
IMUL AX
MOV WORD PTR Z,AX
MOV WORD PTR Z+2,DX
MOV AH,4CH
INT 21H
CODE ENDS
END BEGIN
【实验要求】
(1)编写符合实验内容要求的表达式计算程序,
(2)写出调试以上程序的过程,即输入不同参数值,读出Z的执行结果。
(3)熟练使用源程序汇编、连接命令的使用方法。
【实验步骤】
(1)利用UltraEdit等其它编辑软件,编写LX6.ASM源程序。
(2)对其进行编译、连接,产生.EXE文件。
(3)学习使用MASM软件包中CodeView工具的使用方法。
【实验报告】
(1)画出程序流程图,独立编写程序,列出程序清单。
(2)说明本实验是如何利用MASM软件包进行调试的。
(3)说明乘除中字节运算和字运算的存储单元扩展情况。
实验7 分支程序设计及跟踪调试实验
【
实验名称】分支程序设计及跟踪调试实验
【实验目的】
学习分支程序的设计方法,掌握汇编程序的编辑、编译、连接、运行调试过程,以及MASM软件包中CodeView工具的使用。
【实验内容】
编写程序,从键盘上输入0到9中任一自然数,求其立方值,若输入数据不是0-9,则显示“INPUT ERROR!”。
参考程序清单:
DATA SEGMENT
INPUT DB “PLEASE INPUT X(0...9):$”
TAB DW 0,1,8,27,64,125,216,343,512,729
X DB ?
Y DW ?
INERR DB 0DH,0AH,“INPUT ERROR!$“
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
BEGIN: MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET INPUT
MOV AH, 9
INT 21H
MOV AH, 1
INT 21H
CMP AL, '0'
JB LERR
CMP AL, '9'
LA LERR
AND AL, 0FH
MOV X, AL
ADD AL, AL
MOV BL, AL
MOV BH, 0
MOV AX, TAB[BX]
MOV Y, AX
EXIT: MOV AH, 4CH
INT 21H
LERR: MOV DX,OFFSET INERR
MOV AH,9
INT 21H
JMP EXIT
CODE ENDS
END BEGIN
【实验要求】
(1)编写符合实验内容要求的自然数立方值计算程序,
(2)写出调试以上程序的过程,即输入数值,输出程序执行结果的过程。
(3)熟练使用源程序汇编MASM、连接命令LINK的使用方法。
【实验步骤】
(1)利用UltraEdit等其它编辑软件,编写LX6.ASM源程序。
(2)对其进行编译、连接,产生.EXE文件。
(3)学习使用MASM软件包中CodeView工具的使用方法。
【实验报告】
(1)画出程序流程图,独立编写程序,列出程序清单。
(2)说明本实验中求解自然数立方值的算法设计思想。
实验8 循环程序设计及跟踪调试实验
【实验名称】循环程序设计及跟踪调试实验
【实验目的】
学习循环程序的设计方法,掌握汇编程序的编辑、编译、连接、运行调试过程,理解针对不同的问题,选用不同循环结构的方法。
【实验内容】
编写程序,已知BUF中存放N个数据,编程实现将大于等于0的数放入BUF1中,小于0的数放入BUF2中。
参考程序清单:
DATA SEGMENT
BUF DW -2,5,-3,6,100,0,-20,-9,8,-110,20,0
N=($-BUF)/2
BUF1 DW N DUP(?)
BUF2 DW N DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
BEGIN:MOV AX, DATA
MOV DS, AX
LEA BX, BUF
LEA SI, BUF1
LEA DI, BUF2
MOV CX, N
LOPA: MOV AX, [BX]
CMP AX, 0
JGE L1
MOV [DI], AX
ADD DI, 2
JMP NEXT
L1: MOV [SI], AX
ADD SI, 2
NEXT: ADD BX, 2
DEC CX
JNE LOPA
MOV AH,4CH
INT 21H
CODE ENDS
END BEGIN
【实验要求】
(1)编写符合实验内容要求的数据分类算程序,
(2)写出调试程序中编译MASM、连接命令LINK的使用方法。
(3)学会应用不同循环结构解决不同实际问题的方法。
【实验步骤】
(1)编辑、编译、连接源程序,产生可执行文件.EXE。
(2)使用MASM软件包中CodeView工具单步运行该程序,并验证结果的可靠性。
【实验报告】
(1)列出程序清单,画出程序流程图,编写程序代码。
(2)总结循环程序的循环结构和循环设计的方法。
(3)如果把数据中为“0”的数据也分类出来,程序应作哪些修改。
实验9 子程序设计及跟踪调试实验
【
实验名称】
子程序设计及跟踪调试实验
【实验目的】
学习子程序结构的设计方法,理解模块间主程序与子程序之间的调用关系,掌握多模块程序设计方法,学会使用PUBLIC和EXTRN伪指令解决模块间的符号通信问题。
【实验内容】
编写子程序,已知有两组N个元素的数据,分别存放在以BUF1和BUF2为首址的字节存储区中,要求用冒泡排序法将它们从小到大的排序。
参考程序清单:
;主程序MAIN.ASM
EXTRN SORT:FAR
DATA SEGMENT
BUF1 DB 30H,10H,40H,20H,50H,70H,60H,90,80H,0,0FFH
N1=$-BUF1
BUF2 DB 22H,11H,33H,55H,44H,77H,66H,99H,88H,0AAH,0EEH,0
N2=$-BUF2
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA,SS:STACK
BEGIN:MOV AX,DATA
MOV DS,AX
LEA BX,BUF1
MOV CX,N1
CALL SORT
LEA BX,BUF2
MOV CX,N2
CALL SORT
EXIT:
;MOV AH,4CH
;INT 21H
RET
MAIN ENDP
CODE ENDS
END BEGIN
;子程序SORT.ASM
PUBLIC SORT
CODE SEGMENT
SORT PROC FAR
PUSH AX
PUSH DX
PUSH SI
PUSH DI
MOV DX,CX
DEC DX
MOV SI,1
LOPI:MOV DI,SI
INC DI
MOV AL,[BX+SI-1]
LOPJ:CMP AL,[BX+DI-1]
JBE NEXT
XCHG [BX+DI-1],AL
MOV [BX+SI-1],AL
NEXT:INC DI
CMP DI,CX
JBE LOPJ
INC SI
CMP SI,DX
JBE LOPI
POP DI
POP SI
POP DX
POP AX
RET
SORT ENDP
CODE ENDS
END
【实验要求】
(1)仔细阅读教材中有关模块化程序设计的方法以及模块间通信的方法。
(2)弄清伪指令PUBLIC和EXTRN的功能及用法。
(3)掌握主程序和子程序之间的参数传递方法。
【实验步骤】
(1)分别对主程序MAIN.ASM和子程序SORT.ASM 模块进行汇编,在连接时,将它们装配成一个以.EXE为扩展名的可执行文件。
(2)应用MASM软件包中CodeView工具对.EXE文件进行调试及运行。
【实验报告】
(1)对源程序清单,画出相应的程序流程图。
(2)总结多模块程序设计的特点和编程方法。
(3)分析实验结果及所遇到的问题,并说明解决的方法。
实验10 宏定义程序设计及跟踪调试实验
【
实验名称】
宏定义程序设计及跟踪调试实验
【实验目的】
学习宏定义、宏调用、宏展开的编程技术,理解宏指令和子程序的根本区别,
掌握宏库的创建及调用流程,以及INCLUDE伪指令的使用格式。
【实验内容】
创建宏库,编写宏程序,首先把清屏和在屏幕上显示单个字符的功能模块定义成宏,并创建宏库文件MY.LIB,然后调用宏库MY.LIB中宏指令,实现屏幕显示10个“1”功能。
参考程序清单:
;宏库MY.LIB中的宏PRINT
PRINT MACRO A,B
MOV AH,0AH
MOV AL,A
MOV CX,B
MOV BH,O
MOV BL,OFH
INT 10H
ENDM
;宏库MY.LIB中的宏CLS
CLS MACRO
MOV AX,060OH
MOV CX,0
MOV DX,1849H
MOV BH,7
INT 10H
ENDM
INCLUDE MY.LIB
CODE SEGMENT
ASSUME CS: CODE
START: CLS
PRINT 31H, 10
MOV AX, 4C00H
INT 21H
CODE ENDS
END START
【实验要求】
(1)仔细阅读教材中有关宏汇编程序设计的方法内容。
(2)弄清宏库创建和INCLUDE伪指令使用方法。
(3)掌握
宏定义、宏调用、宏展开的编程技术。
【实验步骤】
(1)
分别定义宏体CLS和PRINT,创建宏库MY.LIB。
(2)
创建列表文件(.LST),查看宏展开代码。
(3)
应用MASM软件包中CodeView工具对.EXE文件进行调试及运行。
【实验报告】
(1)对源程序清单,画出相应的程序流程图。
(2)总结宏汇编程序设计的特点和编程方法。
(3)分析实验结果及所遇到的问题,并说明解决的方法。
实验11 汇编语言与C语言混合编程实验
【
实验名称】汇编语言与C语言混合编程实验
【实验目的】
学习汇编语言与C语言的混合编程技术,进而理解C++与汇编的混合编程,以及Win32下汇编语言的可视化编程方法。
【实验内容】
汇编主程序调用C子函数程序,根据x、y、z的输入值,计算x2、y2、z2的值,根据
x2+y2值与
z2值的比较结果,实现“0”与“1”标识符的输出。
参考程序清单:
1.汇编主程序模块代码,文件名E624_1.ASM
.386
.MODEL FLAT
INPUT PROTO C PX:PTR SDWORD,PY:PTR SDWORD,PZ:PTR SDWORD
VERIFY PROTO C X:DWORD,Y:DWORD,Z:DWORD
OUTPUT PROTO C X:DWORD,Y:DWORD,Z:DWORD,RESULT:DWORD
.DATA
X DWORD ?
Y DWORD ?
Z DWORD ?
RESULT DWORD ?
.CODE
MAIN PROC C
INVOKE INPUT,OFFSET X,OFFSET Y,OFFSET Z
INVOKE VERIFY,X,Y,Z
MOV RESULT,EAX
INVOKE OUTPUT,X,Y,Z,RESULT
RET
MAIN ENDP
END
2.C子程序模块代码,文件名E624_2.C
#include "stdio.h"
extern void input(int *px,int *py,int *pz);
extern int verify(int x,int y,int z);
extern void output(int x,int y,int z,int result);
void input(int *px,int *py,int *pz)
{
printf("input x,y,z:");
scanf("%d,%d,%d",px,py,pz);
printf("x=%d,y=%d,z=%d\n",*px,*py,*pz);
}
int verify(int x,int y,int z)
{
if(x*x+y*y==z*z)
return 1;
else
return 0;
}
void output(int x,int y,int z,int result)
{
printf("verify(%d,%d,%d)=%d\n",x,y,z,result);
}
【实验要求】
(1)仔细阅读教材中有关汇编语言与高级语言混合编程内容。
(2)弄清汇编语言与高级语言混合编程的实质。
(3)掌握Win32下汇编语言调用系统库函数的方法。
【实验步骤】
(1)
分别定义汇编主程序E624_1.ASM,C子程序E624_2.C。
(2)
汇编语言与C语言混合编程的编译链接过程。
(3)
应用MASM软件包中CodeView工具对.EXE文件进行调试及运行。
【实验报告】
(1)对源程序清单,画出相应的程序流程图。
(2)总结汇编语言与高级语言混合编程的方法和特点。
(3)分析实验结果,查找主程序和子程序所对应的二进制代码。
实验12 多模块程序的运行及子程序库设计实验
【
实验名称】多模块程序的运行及子程序库设计实验
【实验目的】
学习多模块的链接技术,理解模块化程序设计思想,掌握子程序库的创建方法。
【实验内容】
根据模块化程序设计思想,编程实现屏幕动画程序设计。
参考程序清单:
data segment
Car db 7
db 52h,70h,0,0
db 0b2h,70h,0,1
db 0dbh,7,0,1
db 0dbh,7,0,1
db 4fh,7,1,0
db 4fh,7,0,-3
db 2,7,-2,1
char_cnt dw ?
pointer dw ?
line_on db ?
col_on db ?
data ends
code segment
assume cs:code,ds:data
main proc far
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
call clear_screen
lea di,car
mov dh,10
mov dl,10
call move_shape
ret
main endp
clear_screen proc near
push ax
push bx
push cx
push dx
mov ah,6
mov al,0
mov ch,0
mov cl,0
mov dh,24
mov dl,79
mov bh,7
int 10h
pop dx
pop cx
pop bx
pop ax
ret
clear_screen endp
move_shape proc near
push ax
push bx
push cx
push dx
push di
mov ah,0fh
int 10h
sub ch,ch
mov cl,[di]
inc di
mov char_cnt,cx
mov pointer,di
mov line_on,dh
mov col_on,dl
plot_next:
add dh,[di+2]
add dl,[di+3]
cmp dl,80
jb mov_crsr
call erase
pop di
pop dx
pop cx
pop bx
pop ax
ret
mov_crsr:
mov ah,2
int 10h
mov al,[di]
mov bl,[di+1]
push cx
mov cx,1
mov ah,9
int 10h
pop cx
add di,4
loop plot_next
call dly_qrtr
call erase
jmp short plot_next
move_shape endp
erase proc near
mov cx,char_cnt
mov di,pointer
mov dh,line_on
mov dl,col_on
erase_next:
add dh,[di+2]
add dl,[di+3]
mov ah,2
int 10h
mov al,[di]
mov bl,0
push cx
mov cx,1
mov ah,9
int 10h
pop cx
add di,4
loop erase_next
mov cx,char_cnt
mov di,pointer
mov dh,line_on
inc col_on
ret
erase endp
dly_qrtr proc near
push cx
push dx
mov dx,0ffh
dl1:mov cx,0ffffh
dl2:loop dl2
dec dx
jnz dl1
pop dx
pop cx
ret
dly_qrtr endp
code ends
end main
【实验要求】
(1)理解弄清模块化编程思想的本质。
(2)掌握子程序库的创建、调用原理方法。
【实验步骤】
(1)
对实验例程进行编译、链接后创建EXE文件。
(2)
把例程中的子程序改写为独立代码段的子程序,并且创建子程序库。
(3)
应用MASM软件包中CodeView工具对.EXE文件进行调试、运行,以及子程序库中子程序代码的定位。
【实验报告】
(1)对源程序清单,画出相应的程序流程图。
(2)总结子程序库的创建方法和过程。
(3)分析实验结果,查找主程序调用子程序的入口地址。
实验13 I/O接口中端口号存储单元内容的读写实验
【实验名称】I/O接口中端口号存储单元内容的读写实验
【实验目的】
学习接口、端口、端口地址的概念,掌握I/O端口的寻址方式,熟练使用I/O指令实现对外设端口地址的读写编程。
【实验内容】
CMOS数据的读取,读取显示系统时间程序。参考程序清单:
cursor equ 45H
attrib equ 2fh
code segment
assume cs:code,ds:code
start:
jmp go
oldcur dw ?
OLD1C DW 2 DUP(?)
NEWINT1C:
PUSHF
CALL DWORD PTR CS:OLD1C
push ax
PUSH BX
PUSH CX
PUSH DX
XOR BH,BH
MOV AH,3
INT 10H
MOV CS:OLDCUR,DX
MOV AH,2
XOR BH,BH
MOV DX,CURSOR
INT 10H
MOV AH,2
INT 1AH
PUSH DX
PUSH CX
POP BX
PUSH BX
CALL SHOWBYTE
CALL SHOWCOLON
POP BX
XCHG BH,BL
CALL SHOWBYTE
CALL SHOWCOLON
POP BX
CALL SHOWBYTE
MOV DX,CS:OLDCUR
MOV AH,2
XOR BH,BH
INT 10H
POP DX
POP CX
POP BX
POP AX
IRET
SHOWBYTE PROC NEAR
PUSH BX
MOV CL,4
MOV AL,BH
SHR AL,CL
ADD AL,30H
CALL SHOW
CALL CURMOVE
POP BX
MOV AL,BH
AND AL,0FH
ADD AL,30H
CALL SHOW
CALL CURMOVE
RET
SHOWBYTE ENDP
SHOWCOLON PROC NEAR
MOV AL,':'
CALL SHOW
CALL CURMOVE
RET
SHOWCOLON ENDP
CURMOVE PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,3
MOV BH,0
INT 10H
INC DL
MOV AH,2
INT 10H
POP DX
POP CX
POP BX
POP AX
RET
CURMOVE ENDP
SHOW PROC NEAR
PUSH AX
PUSH BX
PUSH CX
MOV AH,09H
MOV BX,attrib
MOV CX,1
INT 10H
POP CX
POP BX
POP AX
RET
SHOW ENDP
GO: PUSH CS
POP DS
MOV AX,351CH
INT 21H
MOV OLD1C,BX
MOV BX,ES
MOV OLD1C+2,BX
MOV DX,OFFSET NEWINT1C
MOV AX,251CH
INT 21H
MOV DX,OFFSET GO
SUB DX,OFFSET START
MOV CL,4
SHR DX,CL
ADD DX,11H
MOV AX,3100H
INT 21H
CODE ENDS
END START
【实验要求】
(1)理解CMOS数据的存储地址端口号。
(2)写出CMOS数据存储格式。
(3)熟练使用I/O指令进行端口编程。
【实验步骤】
(1)编辑、编译、连接源程序,产生可执行文件.EXE。
(2)读出CMOS数据,列表微机的配置信息。
【实验报告】
(1)列出程序清单,画出程序流程图,编写程序代码。
(2)总结IN、OUT指令的用法。
(3)如果把CMOS数据中的内存容量参数读出来,程序应作哪些修改。
实验14 常用系统中断调用实验
【实验名称】
常用系统中断调用实验
【实验目的】
学习DOS和BIOS中断服务程序的功能、参数设置、调用方法,理解子程序调用CALL和返回指令RET的使用方法,掌握使用中断服务程序设置屏幕显示方式。
【实验内容】
通过
调用BIOS
中断,编程实现图形方式下的
1
0
×16行列
方格的程序,
参考程序清单如下:
CODE SEGMENT
ASSUME CS:CODE
MAIN PROC FAR
START: PUSH DS
SUB AX, AX
PUSH AX
MOV AH, 0
MOV AL, 4
INT 10H
CALL HORI
MOV AH, 0
INT 16H
MOV AH, 0
MOV AL, 4
INT 10H
CALL VERT
MOV AH, 0
INT 16H
MOV AH, 0
MOV AL, 4
INT 10H
CALL HORI
CALL VERT
MOV AH, 0
INT 16H
MOV AH, 0
MOV AL, 3
INT 10H
RET
MAIN ENDP
HORI PROC NEAR
MOV DX, 0
HLINE:
MOV CX, 0
HDOT:
MOV AL, 1
MOV AH, 0CH
INT 10H
INC CX
CMP CX, 300
JL HDOT
ADD DX, 20
CMP DX, 200
JL HLINE
RET
HORI ENDP
VERT PROC NEAR
MOV CX, 0
VLINE:
MOV DX, 0
VDOT:
MOV AL, 2
MOV AH, 0CH
INT 10H
INC DX
CMP DX, 180
JL VDOT
ADD CX, 20
CMP CX, 320
JL VLINE
RET
VERT ENDP
CODE ENDS
END START
【实验要求】
(1)能够计算BIOS中INT 10H号中断服务程序的向量地址。
(2)查找定位终端服务程序代码。
(
3
)熟练使用
BIOS
中断服务程序进行程序设计。
【实验步骤】
(
1
)编辑、编译、连接源程序,产生可执行文件
.EXE
。
(
2
)跟踪定位
BIOS
中
INT 10H
中断服务程序代码。
【实验报告】
(
1
)列出程序清单,画出程序流程图,编写程序代码。
(
2
)总结
BIOS
中断功能调用的方法。
(
3
)如果改变屏幕显示方式,程序应如何修改。
实验15 DOS中断服务程序设计、调用实验
【实验名称】
DOS
中断服务程序设计、调用实验
【实验目的】
学习常驻内存程序的编写,理解中断向量的重新定向技术,掌握
DOS
中断服务程序的设计方法。
【实验内容】
编写一个时钟程序,要求把时钟信号显示在屏幕的右上角,并在程序结束后常驻内存。参考程序清单如下:
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
CLOCK PROC FAR
DEC CS:X
JZ C2
JMP CEND
C2: PUSH DS
PUSH ES
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH CS
POP DS
MOV X, 20
INC S
CMP S, 60
JB C1
MOV S, 0
INC M
CMP M, 60
JB C1
MOV M, 0
INC H
CMP H, 24
JB C1
MOV H, 0
C1: MOV AL, S
MOV AH, 0
MOV DL, 10
DIV DL
OR AX, 3030H
MOV WORD PTR [T+6], AX
MOV AL, M
MOV AH, 0
DIV DL
OR AX, 3030H
MOV WORD PTR [T+3], AX
MOV AL, H
MOV AH, 0
DIV DL
OR AX, 3030H
MOV WORD PTR [T], AX
MOV CX, 8
CLD
MOV AX, 0B800H
MOV ES, AX
MOV AH, 1FH
LEA SI, [T]
MOV DI, 71*2
C3: LODSB
STOSW
LOOP C3
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
POP ES
POP DS
CEND: IRET
T DB "00:00:00"
H DB 0
M DB 0
S DB 0
X DB 20
CLOCK ENDP
MAIN: MOV AX, CODE
MOV DS, AX
MOV AH, 2CH
INT 21H
MOV H, CH
MOV M, CL
MOV S, DH
LEA DX, CLOCK
MOV AX, 251CH
INT 21H
MOV AX, 3100H
LEA DX, MAIN
MOV CL, 4
SHR DX, CL
ADD DX, 11H
INT 21H
RET
CODE ENDS
END MAIN
【实验要求】
(1)学习常驻内存程序的编写,以及操作系统对程序的分段管理方法。
(2)理解中断向量、中断服务程序、子程序入口地址之间的关系。
(
3
)掌握通过中断向量调用自定义子程序的实现过程。
【实验步骤】
(
1
)编辑、编译、连接源程序,产生可执行文件
.EXE
。
(
2
)编写自定义子程序,实现通过中断向量调用自定义子程序。
【实验报告】
(
1
)列出程序清单,画出程序流程图,编写程序代码。
(
2
)总结常驻内存程序和修改中断向量程序的编写方法。
(
3
)如果更改
1CH
号中断向量为其它常用中断向量,在保证不破坏其它常用中断向量功能的前提下,
程序应如何修改。