微机原理及接口技术
实 验 指 导 书
20##年9月
信息学院实验中心微机实验室
第一章 80X86微机原理及其程序设计
实验一 熟悉PC机的使用和调试汇编程序的方法
一.实验目的:
1.掌握汇编程序由编辑、编译、链接到调试的全过程。
2.通过汇编调试工具加深对机器指令执行过程的了解。
二.实验要求:
1.了解 PC 机的系统类型和基本配置, 熟悉 PC 机 DOS和 WINDOWS下的基本操作。
2.掌握使用 UltraEdit 等编辑器对汇编语言源程序 (存储后扩展名为.ASM)的编辑操作。
3.学会用宏汇编程序 MASM (或TASM)对.ASM文件进行编译(编译后扩展名为.obj)。
4.使用链接程序LINK(或TLINK)对.OBJ 文件链接生成 .EXE 文件。
5.学会用汇编调试工具软件TD(或DEBUG)对.EXE文件进行调试进一步深对机器指令的了解、执
行程序、检查运行结果的方法。
三.实验仪器:
PC 机一台
四.实验内容:
汇编程序的编程环境有以下二种方式:
1. Dos窗口下命令行方式
2. UltraEdit方式
其中第一种Dos方式,是指进入Dos窗口模式编辑源文件,用命令行方式直接调用
Tasm,Masm等编译工具进行程序的编译、链接、调试,而后两种工作方式都是在Windows
下进行源文件的编辑,而编译和链接仍然是通过调用Tasm,Masm等编译工具完成相应工
作。为了方便我们现在一般采用后一种编程环境。
下面我们分别介绍:
UltraEdit方式
UltraEdit是Windows下非常优秀的文本编辑软件,有很好的可配置性,支持语法高亮等。
通过配置UltraEdit,可实现在UltraEdit环境下编辑汇编源程序、汇编、连接、调用TDebug
调试非常方便。配置完成后,可实现快捷键调用各编译、连接、调试功能。实验机器上已经预
配置好了。
使用说明:
1.打开UltraEdit,编辑并保存汇编源文件。
先新建一个文件,并保存为.asm为后缀的文件,此后,可以有语法高亮指示。输入汇编程
序并保存。
2.编译
UltraEdit菜单栏-》高级-》masm编译(或Tasm编译)
此菜单会调用masm.exe或tasm.exe,输出结果放在当前编辑屏幕的下方。
3.链接
UltraEdit菜单栏-》高级-》Link链接(或Tlink链接)
此菜单会调用Link.exe(ml.exe)或tlink.exe,输出结果也放在当前编辑屏幕的下方。
4.调试
UltraEdit菜单栏-》高级-》Td调试
此菜单会新开一个dos窗口,在其中运行td.exe,可利用单步跟踪和设置断点等方式进行调试,调试完毕,ALT+X退出Td环境,exit返回即可。
另:DOS窗口模式与全屏模式的切换键:Alt+Enter
调试最好在全屏模式下。
五.实验习题:
1.输入以下程序, 完成由编辑、编译、链接到调试的全过程。
在调试过程中应使用单步跟踪、断点等方法调试,注意观察寄存器、标志位和有关存储器内容
的变化。
A. 将S1(BYTE),S2(WORD)和S3(DWORD)中内容送至D1,D2,D3
注意: 以下程序有误,在调试过程中加以修改使之正确
DATA SEGMENT
SS1 DB 1234H
SS2 DW EA32H
SS3 DD 12345678H
DD1 DB 0
DD2 DW ?
DD3 DW ?
DATE ENDS
CODE SEGMEMT
ASUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV AL,SS1
MOV DD1,AL
LEA SI,SS2
LEA DI,DD
MOV AX,[SI]
MOV [DI],AX
MOV SI,OFFSET S3
MOV DI,OFFSET D3
MOV AX,[SI]
MOV D3,AX
INC SI
INC DI
MOV AX,[SI]
MOV [DI],AX
MOV AX,4C00H ;返回系统
INT 21H
CODE ENDS
ENDS STRAT
B.完成两个长整数相加的汇编程序
要求: 调试过程中应更改必要的参数值,以验证程序的正确性,例如本题可修改加数和被加数
以判别最高位进位处理是否正确。
并将该程序修改为减法操作重新调试。
DATA SEGMENT
NUMBER EQU 6
BUFFER1 DB 12H,0E2H,33H,43H,12H
BUFFER2 DB 22H,0A2H,55H,0F2H,3FH
RESULT DB NUMBER DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV CX,NUMBER-1
MOV SI,OFFSET BUFFER1 ;被加数指针
MOV DI,OFFSET BUFFER2 ;加数指针
LEA BX,RESULT ;和指针
XOR AX,AX ;清CF标志
NEXT: MOV AL,[SI]
ADC AL,[DI] ;带进位相加
MOV BYTE PTR [BX],AL ;保存部分和
INC SI ;变动指针
INC DI
INC BX
LOOP NEXT ;循环控制
ADC AH,0 ;最高位进位
MOV BYTE PTR [BX],AH
MOV AX,4C00H ;返回系统
INT 21H
CODE ENDS
END START
C.完成数据块的移动,并利用TD观察内存中数据移动过程。
DS_DATA SEGMENT
BUFFER1 DB 0,1,2,3,4,5,6,7,8,9
DS_DATA ENDS
ES_DATA SEGMENT
RESULT DB 10 DUP(?)
ES_DATA ENDS
MY_CODE SEGMENT
ASSUME CS:MY_CODE,DS:DS_DATA,ES:ES_DATA
START: MOV AX,DS_DATA
MOV DS,AX
MOV AX,ES_DATA
MOV ES,AX
MOV SI,OFFSET BUFFER1
MOV DI,OFFSET RESULT
MOV CX,10
REP MOVSB
MOV AX,4C00H
INT 21H
MY_CODE ENDS
END START
2.在汇编调试工具软件的环境下, 完成下列指令的执行, 注意选取有代表性的数据, 并观察指
令执行前后的数值变化:
例如: 观察 MOV AX,BX 指令
在TD或DEBUG 下将 AX,BX 分别置不同的值,写入 MOV AX,BX 指令然后执行,再观察 AX,BX
寄存器的内容。
A. XCHG
B. XLAT
C. LDS 和 LES
D. MUL 和 IMUL
E. CBW 和 CWD 分正数和负的情况
F. 移位和循环指令
实验二 简单汇编程序设计
一.实验目的:
1.掌握简单程序的设计和调试方法
2.利用汇编调试工具加深对机器指令和伪指令的了解
二.实验要求:
简单程序是构成复杂程序的基础。简单程序又称顺序程序,顾名思意,就是为完成一简单的目的,采用一串指令序列,按顺序逐条执行。在简单程序执行过程中,每条指令只执行一次,同时由于没有转移,一般不考虑对标志的影响。
象所有汇编程序设计一样,编程前,应考虑如何分配 CPU 中的寄存器和内存中单元等,要考虑到指令本身的特点和要求分配寄存器,例如,如果希望使用乘法指令进行乘法,根据指令的要求,必须要使用 AL 或 AX 作为被乘数,在这种情况下,AL或AX 就必须考虑为存放被乘数,当然,乘积应该是放在AX或DX:AX 中。
1.掌握汇编程序的基本结构及设计方法,包括:
A 汇编语言源程序结构
B 基于汇编级的解题算法
C 寄存器和存储器的内容分配
D 简单汇编程序的设计
E 返回系统的方法
2.掌握对自编程序的调试及出错修改的方法,包括:
A 汇编程序的编辑、编译、链接及调试
B 在调试程序过程中发现语法错误的处理方法
C 在调试程序过程中如何发现逻辑错误及处理方法
3.利用调试工具软件对课堂中讲授的机器指令、伪指令、操作符、运算符等内容加深了解
三.实验仪器:
PC 机一台
四.实验内容:
例1.在屏幕上输出字符串"Hello the world!"
代码如下:
DATA SEGMENT
BUFFER DB 'Hello the world!',0DH,0AH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
LEA DX,BUFFER
MOV AH,9
INT 21H
MOV AX,4C00H
INT 21H
CODE ENDS
END START
五.实验习题:
1.用多种寻址方式将数据段中定义的A1(字),A2(字),A3(双字)的数据分别送至附加段B1,B2,B3单元。
2.将 A 中的大写英文字母转换成相应的小写字母。
例: A:45H('E')→65H('e')
3.将 A 中数据(<=9)的平方存至B中。
例: A:6→B:24H(36)
4.将一个压缩的 BCD 数转换成相应的 ASCII 码。
例: 56H→35H('5'),36H('6')
5.有一种加密方法是首先在被加密的所有符号中建立其一一对应的符号,例如:
0 - 2 , 1 - 7 , 2 - 1 , 3 - 6 , 4 - 9
5 - 0 , 6 - 8 , 7 - 3 , 8 - 4 , 9 - 5
然后将数据进行变换后存储, 即当源数是6时,保存的数据是8,这样就可以达到保密的效果。试编一程序完成十六进制数的加密和解密程序。
6.完成分别将两个压缩 BCD 数据和非压缩 BCD 数据相加的程序(加数和被加数及和小于9999)。
7.完成两个 32 位数的乘法程序。例: 01234567H*89ABCDEFH=9CA39DC94E4629H(选做)
8.利用串操作指令完成两串数据的比较, 结果用 RESULT 单元为 00H 和 0FFH 表示相同或不相同。
例: String1:ABC, String2:ABC 则 RESULT:00H
String1:ABC, String2:ADC 则 RESULT:0FFH
9.利用串操作指令统计以 "$"(ASCII码为24H)为结束的字符串中字符的个数。
例:String:STUDY$ 则 RESULT:5
10.按本实验要求,自编一程序。
实验三 汇编分支程序设计
一.实验目的:
掌握分支程序设计和调试方法
二.实验要求:
分支程序的基本设计方法包括:
1.掌握利用条件转移指令方法
2.了解利用跳转表方法
3.了解利用逻辑尺方法
三.实验仪器:
PC 机一台
四.实验内容:
分支结构是程序设计的基本结构,它们在执行过程中,或直接更改或通过对标志的判别,实现更改程序按顺序执行的次序,这些更改是通过对 IP(段内)或CS:IP(段间)的修改完成的,而实现对这些寄存器的修改是通过无条件转移和有条件转移完成的。
1.无条件转移
无条件转移采用的是无条件转移指令,即JMP类指令,在8086汇编中,JMP类指令根据需要转移的目的不同,分成短 JMP(SHORT),段内JMP(NEAR)和段间JMP(FAR),其基本格式如下:
短跳转:JMP TTT ; TTT 在该跳转指令的 ±127 字节之内
段内跳转: JMP TTT ; TTT 是段内 NEAR 型定义的标号
JMP NEAR PTR TTT
JMP CX ; 利用寄存器中内容替换 IP
JMP WORD PTR [BX] ; 利用内存中某字单元内容替换 IP
段间跳转: JMP FAR PTR TTT ; TTT 是 FAR 型标号
JMP DWORD PTR [BX] ; 利用内存中双字单元内容替换 IP和 CS
严格地说, SHORT 跳转不是当前 JMP 指令的 ±127 字节之内,计算机实际操作过程是将该指令读入后的 IP ,即 JMP 当前地址加 2 后的 IP与指令中八位的偏移量相加,然后替换 IP,所以,若以JMP 指令的位置为准的话,则是 -126 至+129 之间。 SHORT 和 NEAR 型一般由汇编时自动区分,应指出的是,条件转移采用的都是 SHORT 型,因此,当源和目的较远时 ( 即超出 SHORT 范围 ),应在较近的位置设置一条JMP 指令,以实现不同位置的跳转。
2.条件转移
条件判别指令是条件转移程序设计的基础,掌握指令如何对标志的影响及如何利用条件转移指令达到程序分支的目的。
如前所述,条件转移的跳转距离都是 SHORT 型。对跳转的条件判别根据判别的条件分两类,一种是单条件的判别,另一种是复合条件的判别,对单条件判别,主要对单一的标志位进行测试,如判CF标志,判SF标志等,而复合条件则是对多标志位进行判别,其标志的影响一般是由数值运算后决定的,如带符号数大于等于的条件判别等。尽管复合条件需多标志判别,但在8086指令助记符中与单条件转移指令没有区别。
单条件判别指令如下:
1.JC 或 JNC 根据进位标志 CF 进行转移
2.JE/JZ 或 JNE/JNZ 根据零标志 ZF 进行转移
3.JS 或 JNS 根据符号标志 SF 进行转移
4.JO 或 JNO 根据溢出标志 OF 进行转移
5.JP/JPE 或 JNP/JPO 根据奇偶标志 PF 进行转移
根据操作数的不同,分无符号数和带符号数的判别,对无符号数有 A(高于) B(低于),带符号数有G(大于) L(小于)等判别。为了方便起见,其指令助记符对同一种条件可能有多种表示方法,如:JGE与JNL 的条件判别条件是相同的,使用者根据习惯和需要选取其中的一种表示。
无符号数判别指令如下:
1.JA/JNBE 高于(不低于等于)转移
2.JAE/JNB 高于等于(不低于)转移
3.JB/JNAE 低于(不高于等于)转移
4.JBE/JNA 低于等于(不高于)转移
带符号数判别指令如下:
1 JG/JNLE 大于(不小于等于)转移
2 JGE/JNL 大于等于(不小于)转移
3 JL/JNGE 小于(不大于等于)转移
4 JLE/JNG 小于等于(不大于)转移
3.分支程序设计
有条件转移程序是分支程序主要部分,这样的分支程序是根据当前运算的结果去判断选择不同的程序段执行,反之,如果要求是根据不同的情况,完成不同的任务,则需要使用分支程序结构来实现。如上述,程序的分支是根据标志决定的,所以,如何影响标志及如何利用标志是分支程序的重点,例如,判断 AX 中内容是否是负数,我们可用多种方法实现:
方法一 AND AX, AX ; 影响 SF 标志
JS MINCE ; 为负数转入负数处理
.........
方法二 CMP AX, 0 ; 影响 SF 标志
JS MINCE ; 为负数转入负数处理
.........
方法三 TEST AX,8000H ; 影响 ZF 标志
JNZ MINCE ; 为负数转入负数处理
.........
方法四 ADD AX,AX ; 影响 CF 标志
JC MINCE ; 为负数转入负数处理
.........
方法五 SHL AX,1 ; 影响 CF 标志
JC MINCE ; 为负数转入负数处理
.........
还可以举出其它方法
由上例可以看出,同样的目的可用不同的方法去影响不同的标志,采用不同的跳转指令来实现,显然,要编好分支程序,首先应掌握指令对标志如何影响,这也是汇编程序设计的特点之一。
本实验中有输入和显示。以下列出简单的字符输入和显示的程序,注意,它们都是以 ASCII 码方式体现的。
1.由键盘读入字符的程序:
MOV AH,01 ; 功能号
INT 21H ; 系统调用读入字符
MOV INPUT_CHAR, AL ; AL为输入的字符的ASCII 码值
2.由屏幕显示字符的程序:
MOV AH,02H ; 功能号
MOV DL,'#' ; DL : 显示字符的 ASCII 码
INT 21H ; 系统调用显示字符
例1.设计一数据块间的搬移程序。设计思想:程序要求把内存中一数据区(称为源数据块)传送到另一存储区(成为目的数据块)。源数据块和目的数据块在存储中可能有三种情况,如图所示
图1.3.1 内存中源数据块和目的数据块的三种可能情况
对于两个数据块分离的情况,如图1.3.1(a),数据的传送从数据块的首地址开始,或从数据块的末地址开始均可。但是对于有重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭到破坏,可有如下结论:
当源数据块首地址<目的块首地址时,从数据块末地址开始传送数据,如图1.3.1(b)所示。
当源数据块首地址>目的块首地址时,从数据块首地址开始传送数据,如图1.3.1(c)所示。
实验程序流程图如图所示
实验程序清单:
SSTACK SEGMENT STACK
DW 64 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE
START: MOV CX, 0010H
MOV SI, 3100H
MOV DI, 3200H
CMP SI, DI
JA A2
ADD SI, CX
ADD DI, CX
DEC SI
DEC DI
A1: MOV AL, [SI]
MOV [DI], AL
DEC SI
DEC DI
DEC CX
JNE A1
JMP A3
A2: MOV AL, [SI]
MOV [DI], AL
INC SI
INC DI
DEC CX
JNE A2
A3: JMP A3
CODE ENDS
END START
五.实验习题:
1.将一个字节的十六进制数转换成对应的 ASCII 码。
例: 3EH→33H('3'),4EH('E')
2.编写可接受 10 个键盘命令 ( A,B...J ),完成分别转向P1,P2,….P10 的程序。P1,P2,...P10 程序用 P1,P2,...P10 显示表示。
3.将 10 个十六位带符号数中正数相加。
例:3543H,5943H,-3578H,-3432H,4523H,3323H,-5634H,54EFH,-5423H,7230H
则 1CDEBH
注:部分分支程序习题与循环程序习题合并附于循环程序设计实验习题中
课堂练习
找出内存单元中最高位为1的无符号数输出。
例:定义12H,34H,56H,78H,90H 输出90H
可输出到寄存器或存储单元中
实验四 汇编循环程序设计
一.实验目的:
掌握循环程序的设计和调试方法
二.实验要求:
掌握循环程序的基本结构及设计方法,包括:
A 循环程序的循环初始化、循环体及循环控制条件
B 多种循环控制条件
C 循环体中的指针变化
了解多重循环程序的设计方法
三.实验仪器:
PC机一台
四.实验内容:
例1.将AX中16进制数转换为10进制数输出
如 AX=47EH 输出1150
其流程图如下:
程序如下:
CODE SEGMENT
ASSUME CS:CODE
START: MOV AX,47EH
MOV CX,0
MOV BX,10
DISP1: MOV DX,0
DIV BX
PUSH DX
INC CX
OR AX, AX
JNE DISP1
DISP2: POP DX
MOV AH,2
ADD DL,30H
INT 21H
LOOP DISP2
MOV AX,4C00H
INT 21H
CODE ENDS
END START
五.实验习题:
1.编写在一串数据中统计正数,负数和零的个数并加以显示。
例:34H,-3BH,-5AH,72H,0,-2DH,0,66H
则正数:3,负数:3,零:2
2.统计某十六位数中 "1" 的个数并加以显示。
例:0101001100101110B 则 8
3.一种数值滤波的方法是将相邻的两数求平均值,试编程序实现。
4.将字符串1 插入字符串2 的中间, 其位置由键盘输入。
5.在一已排序的数组中插入新的数据,插入新数据后的数组仍满足排序要求。
6.编写一串在带符号数中找出最大数和最小数的程序。
例:35H,32H,73H,10H,08H,0FH,2AH,3BH 则:最大数73H 最小数08H
7.统计一组数据 ( BYTE ) 中 D3D2D1 位相同的个数并加以显示。
8.编写一程序完成无符号数的排序程序(由大到小)。
例:34H,67H,0E2H,0A7H,89H,73H,51H,43H,0E2H,0A7H,89H,73H,67H,51H,43H,34H
9.自编题
实验五 简单DOS和BIOS调用汇编程序设计
一.实验目的:
掌握简单DOS系统功能和BIOS的调用方法
二.实验要求:
1.掌握 DOS 系统功能调用方法
A.了解 DOS 系统调用所完成的功能
B.掌握如何根据题目要求利用系统调用完成所需的功能
C.掌握系统调用的方法, 包括入口参数设置,功能号设置,系统调用和出口参数获得
2.掌握 BIOS 调用方法
三.实验仪器:
PC机一台
四.实验内容:
BIOS和DOS是两组系统服务软件集合,它们使用户能够访问和使用PC机的硬件,也可以这么说,对一个汇编程序编程者来说,如果要使用PC机硬件的话,一般是采用BIOS和DOS调用来实现。在使用MS-DOS的PC机上使用硬件的基本方法有以下三种:
1.直接访问硬件
使用PC机硬件资源最直接的方法是通过编写使用IN和OUT指令程序来实现,编写直接访问硬件的程序需要编程者对所使用硬件的控制非常熟悉,包括口地址,控制命令,硬件结构等,这些,对一般的编程者来说,要掌握是有一定难度的,同样,即使是编程者掌握了必要的硬件知识,但由于直接访问所要考虑的因素较多,也会使编写的程序相当繁杂,增加了调试程序的困难,另一方面,编程者按自己的要求设置硬件的工作方式,有可能会影响整个系统的运行,另外,采用直接访问硬件的编程方法编制的程序,其可移植性相当差,在一个机器上运行的程序,换到另外一个厂家生产的机器上有可能无法运行,因此,如果不是为了获得更高的执行效率和获得DOS和BIOS不支持的功能,程序员应避免采用该方法。
2.使用BIOS调用
BIOS称为基本输入输出系统,由DOS-BIOS和ROM-BIOS两部分组成,它是计算机硬件和其它程序之间的第一道缓冲。BIOS直接和外设通讯,完成设备一级的控制,并附有其它的实用服务功能,它为编程者提供了一个简单的软件接口以避免和外设直接打交道,这样,可以降低编程者对硬件要求的了解程度,简化使用PC机硬件资源的程序,而BIOS是PC机的标准软件接口,具有兼容性,提高了编制程序的可移植性。
采用 BIOS 功能调用主要是为了得到较高的运行效率(与DOS功能调用相比),或者需要利用DOS 不具备的某些功能.。BIOS调用最常见的是在显示器的控制程序中,不同的显示器会增加相应的 BIOS功能。
3.使用DOS调用
DOS在更高层次上给出了与BIOS相同的功能,一般说来, DOS调用需要的入口,出口参数较BIOS 简单,调用也容易,方便,不需要编程者对硬件有更多的了解,通过调用DOS ,还可以充分利用操作系统提供的所有功能,编制的程序可移植性也较高。与BIOS相比,DOS完成的功能没有其丰富,即对于某些特殊的要求,DOS调用也许不能实现,此外,DOS调用的执行效率也比BIOS低。
应该使用哪种方法
选择哪种方式应根据不同的需要来选择,首先必须是以完成任务为目的,一般按DOS,BIOS到硬件直接控制的顺序选择,另外,好的编程者还要根据程序应用的场合,权衡程序的可移植性,编程的复杂性和目标代码长短等因素选择相应的方式。
此外,在选择DOS调用时,因注意操作系统的版本,一般的高版本的操作系统兼容低版本。
DOS功能调用的一般步骤为:
1.如有必要,装入入口参数到规定的寄存器;
2.装入功能号到 AH 中;如有必要,装入子功能号到 AL 中;
3.调用 DOS 相应功能的中断 ( 这里一般指 INT 21H );
4.如有必要,取出返回结果或出错信息.
例1:利用Dos系统功能调用将输入的小写字母转换成大写输出
如:键盘输入abcdef 在屏幕上换行输出ABCDEF
程序清单:
DATA SEGMENT
BUF DB 10
DB ?
DB 10 DUP(0)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA DX,BUF
MOV AH,10
INT 21H
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
LEA BX,BUF
MOV CX,0
MOV CL,[BX+1]
ADD BX,2
A1:MOV DL,[BX]
SUB DL,20H
MOV AH,2
INT 21H
INC BX
LOOP A1
MOV AX,4C00H
INT 21H
CODE ENDS
END START
例2:编写实验程序,利用BIOS调用在显示器上的输出窗口显示A~Z共26 个大写英文字母。
显示I/O 功能调用使用说明如下:
INT 10H 使用说明
入口:AH=00H,AL=01H
功能:清屏
入口:AH=01H,AL=数据
功能:写AL中的数据到显示屏上
入口:AH=06H,DS:BX=字串首地址,且字符串尾用00H 填充
功能:显示一字串,直到遇到00H 为止
实验程序清单:
SSTACK SEGMENT STACK
DW 64 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE
START: MOV CX,001AH
MOV BL,41H ;‘A’的ASCII码值
MOV AH,01H
A1: MOV AL,BL
INT 10H ;功能调用
INC BL
PUSH CX
MOV CX,0FFFFH
A2: LOOP A2
POP CX
DEC CX
JNZ A1
A3: JMP A3
CODE ENDS
END START
五.实验习题:
1.在键盘上输入十个一位的十进制数, 相加后在屏幕上显示。
参考系统调用:
A.键盘输入并回显 INT 21H 功能 01H
B.显示输出 INT 21H 功能 02H
2.在屏幕上显示 "What is your name?" ,输入自己姓名后显示
"My name is XXX" 。
参考系统调用:
A.显示字符串 INT 21H 功能 09H
B.键盘输入到缓冲区 INT 21H 功能 0AH
3.在屏幕上显示 ASCII 字母表。
4.将当前键盘状态在屏幕上显示, 用 ON/OFF 表示。
参考系统调用:
A.读当前键盘状态 INT 16H 功能 02H
入口参数: 无
出口参数: AL : 当前状态
7 6 5 4 3 2 1 0
. . . . . . . 1 RIGHT SHIFT 键按下
. . . . . . 1 . LIFT SHIFT 键按下
. . . . . 1 . . CTRL 键按下
. . . . 1 . . . ALT 键按下
. . . 1 . . . . SCROLL LOCK 键按下
. . 1 . . . . . NUM LOCK 键按下
. 1 . . . . . . CAPS LOCK 键按下
1 . . . . . . . INS 键触发
5.在屏幕上显示系统日期和时间,用英文表示星期几。
参考系统调用:
A.取系统日期 INT 21H 功能 2AH (置系统日期 2BH)
入口参数 AH = 2AH
出口参数 CX= 年 (1980 ~ 2099)
DH=月(1 ~ 12)
DL= 天(1 ~ 31)
AL= 星期几 ( 0:星期天,1:星期一...)
B.取系统时间 INT 21H 功能 2CH ( 置系统时间 20H )
入口参数 AH= 2CH
出口参数 CH= 小时 ( 0 ~ 23 )
CL= 分 ( 0 ~ 59 )
DH= 秒 ( 0 ~ 59 )
DL= 百分秒 ( 0 ~ 99 )
6.在键盘上输入等待时间(毫秒) 后,屏幕上显示 " BEGIN ..", 等待要求的时间后, 再显示 " END "。
参考系统调用:
A.标准时间等待( AT 以上机器 ) INT 15H 功能 86H
入口参数 AH= 86H
CX:DX = 等待的微秒数
7.显示当前 MS-DOS 版本 ( V5.0 )。
参考系统调用:
A.取 MS-DOS 版本号,次版本号和版本标志
INT 21H 功能 33H 子功能 06H
入口参数 AH= 33H
AL= 06H
出口参数 BL= 版本号
BH= 次版本号
DH= 版本标志
8.在屏幕上循环显示 ASCII 符号表 ( 由 21H 开始到 0FFH ),直到键入回车键结束。
9.自编题。
实验六 汇编子程序和宏汇编的程序设计
一.实验目的:
1.掌握子程序设计和调试方法
2.掌握多模块汇编程序设计方法
3.掌握宏汇编的程序设计方法
二.实验要求:
1.掌握子程序设计方法,包括:
A.子程序间参数简单传递方法
B.利用堆栈传递方法
C.子程序的递归
2.掌握多模块汇编程序的设计、调试,包括:
A.PUBLIC 和 EXTRN 伪指令的使用方法
B.多模块的链接
3.掌握宏汇编的程序设计方法
三.实验仪器:
PC机一台
四.实验内容:
例1:求无符号字节序列中的最大值和最小值。设有一字节序列,其存储首地址为3000H,字节数为08H。利用子程序的方法编程求出该序列中的最大值和最小值。
程序流程图如下图所示:
实验程序清单:
SSTACK SEGMENT STACK
DW 64 DUP(?)
SSTACK ENDS
DATA SEGMENT
************ ;数据段中存放相应字节序列
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS, AX
MOV SI, 3000H ; 数据区首址
MOV CX, 0008H
CALL BRANCH ; 调用子程序
HERE: JMP HERE
BRANCH PROC NEAR ; 子程序,返回参数在AX中
JCXZ A4
PUSH SI
PUSH CX
PUSH BX
MOV BH, [SI]
MOV BL, BH
CLD
A1: LODSB
CMP AL, BH
JBE A2
MOV BH, AL
JMP A3
A2: CMP AL, BL
JAE A3
MOV BL, AL
A3: LOOP A1
MOV AX, BX
POP BX
POP CX
POP SI
A4: RET
BRANCH ENDP
CODE ENDS
END START
五.实验习题:
1.将一串 ASCII 码中小写英文字母转换成大写, 该串以 "$" 结束,要求判别和转换用子程序实现。
2.将一串十六进制数转换成对应的 ASCII 码, 其中转换过程用子程序实现。
3.将 DISPLAY 单元 ( WORD ) 中的数据用二进制的方式显示, 其中子程序完成将 AX 中数据显示的功能。
4.主程序读入一串字符后, 利用堆栈方式将该字符串的段址,偏移及串长传给子程序, 在子程序中加以显示, 返回主程序后显示 'OK'。
5.利用堆栈方法实现 N! 的计算。
6.A模块中有两组无符号数, B模块是加法程序, 在A模块中两次调用B模块实现加法。其参数用PUBLIC和EXTRN方式进行传递。
7.利用数据段以 COMMAND 方式完成第 6 题的要求。
8.编写一可实现左右移多位的宏定义,并利用该宏定义实现 A1 左移3位, A2右移5位的程序。同时, 利用显示子程序将移位前后的数据加以显示。
9.编写用查表法求 1 ~ 15 平方的程序, 其中平方表用宏定义实现。 数据由键盘输入(00退出)结果在屏幕上显示。
10.自编题。