《 微机原理与接口技术 》 第五章、第六章

85
微微微微微微微微微微 《》 微微微 微微微 微微 微微微

description

《 微机原理与接口技术 》 第五章、第六章. 主讲:方义秋. 第 5 章 宏汇编语言 本章学习目标 通过本章的学习,应当掌握以下内容: • 了解汇编语言的基本知识和特点。 掌握宏汇编基本语法。 • 掌握汇编语言常用伪指令的使用方法。 • 熟悉宏汇编语言的程序结构、段定义以及语句的格式。. 汇编语言与宏汇编语言. 汇编语言 是一种面向 CPU 指令系统的程序设计语言,它采用指令助记符来表示操作码和操作数,用符号地址表示操作数地址。 - PowerPoint PPT Presentation

Transcript of 《 微机原理与接口技术 》 第五章、第六章

《微机原理与接口技术》第五章、第六章

主讲:方义秋

第 5 章 宏汇编语言 本章学习目标

通过本章的学习,应当掌握以下内容:• 了解汇编语言的基本知识和特点。•掌握宏汇编基本语法。• 掌握汇编语言常用伪指令的使用方法。• 熟悉宏汇编语言的程序结构、段定义以及语句的格式。

3

汇编语言与宏汇编语言• 汇编语言是一种面向 CPU 指令系统的程序设计语言,它采用

指令助记符来表示操作码和操作数,用符号地址表示操作数地址。

• 汇编语言编写的源程序在输入计算机后,需要将其翻译成目标程序,计算机才能执行相应指令,这个翻译过程称为汇编,完成汇编任务的程序称为汇编程序。

• 汇编程序是最早也是最成熟的一种系统软件,它除了能够将汇编语言源程序翻译成机器语言程序这一主要功能外,还能够根据用户的要求自动分配存储区域,包括程序区、数据区、暂存区等;自动把各种进制数转换成二进制数,把字符转换成 ASCII 码,计算表达式的值等;自动对源程序进行检查,给出错误信息,如非法格式、未定义的助记符、标号、漏掉操作数等。具有这些功能的汇编程序称为基本汇编 ASM ( Assembler )。

4

•在基本汇编的基础上,进一步允许在源程序中把一个指令序列定义为一条宏指令,并包含有大量伪指令的汇编程序,叫做宏汇编 MASM ( MacroAssembler )。它包含全部基本汇编 ASM 的功能,还增加了宏指令、结构、记录等高级汇编语言功能。

5

1 .汇编程序采用分段结构,每一段有若干语句组成。 2 .语句分类: 指令性语句,即符号指令——通知 CPU 进行某种操作的命令,由硬件完成其功能。 指示性语句,即伪指令——提供编译信息、链接信息,其功能由相应的软件完成。 3 .符号指令的书写格式: [ 标号: ] 符号指令 [ ;注释 ] 4 .伪指令的书写格式: [ 变量名 ] 伪指令 [ ;注释 ] 注:版本不同,伪指令的种类也略有不同。

5 . 1 汇编程序的语句类型

6

5 . 2 . 1 标号、变量和常量 1 .标号和变量——又称符号地址 标号——代表指令地址,定义在代码段,为转移指令提供目标。 变量——代表内存操作数的存储地址,或者说变量名就代表某个单元。定义在 DS , ES , FS , GS ,SS 段。 命名规则:不能用保留字、仅能使用给定集合的符号、不能用数字打头、最长不超过 31个字符。

5 . 2 宏汇编基本语法

7

标号和变量的 3 个属性 段属性:其所在的段基址,用 SEG运算符可算出。

例: MOV AX, SEG BUF 偏移属性:用 OFFSET运算符可算出其有效地址。

例: MOV BX, OFFSET BUF 类型属性: 变量的类型有:

字节型:用 DB伪指令定义 字型: 用 DW伪指令定义 双字型:用 DD伪指令定义 四字型:用 DQ伪指令定义 五字型:用 DT伪指令定义

注:使用时,可用 PTR运算符作临时性的修改 标号的类型有:

NEAR(近):该类型标号是段内转移指令的目标地址 FAR(远):该类型标号是其他代码段转移指令的目标地

8

立即数:经汇编后转换成等值的二进制补码。如: 12 , 0A8H, 10100000B, 34Q,-2

字符串常数:经汇编后转换成相应的 ASCII 码。如: ‘A’,‘ ABCD’,‘ 3’

例: X DB ‘ABC’ ;相当于 X DB 41H, 42H, 43H

MOV DL,‘ 1’ ; DL=31H 符号常数:用伪指令 EQU 或“ =”定义。 例: COUNT EQU 55

POINTER = 2F8H •••••• MOV CL, COUNT ; CL=55 MOV DX, POINTER ; DX=2H8H

2 .常量

9

1 .数值运算符 ( 1 )算术运算符有: +、—、*、/、 MOD(模除,即取余) 例: MOV AX, 8 + 5 ;汇编时完成运算,其值若出界给出错误信息。

MOV AX, 31 MOD 5 ; AX=1

5 . 2 . 2 运算符

( 2 )逻辑运算符有:   NOT:按位取反 例: MOV AL, NOT 10010011B; AL=01101100B AND:按位相与 例: MOV AL, 37H AND 0FH ; AL=07H OR: 按位相或 例: MOV AL, 7 OR 30H ; AL=37H XOR:按位异或 例: MOV 0AAH XOR 55H ; AL=0FFH HIGH:截取高 8 位 例: MOV AH, HIGH BX ; BH→AH LOW:截取低 8位 例: MOV AL, LOW BX ; BL→AL

10

( 3 )关系运算符有: 运算符 格式 说明 例

EQ X EQ Y X = Y 为“真”

MOV AX , X EQ 5 ;若 X=5 则 AX=0FFFFH 否则 AX=0H

NE X NE Y X≠Y 为“真” MOV BL , X NE 25

LE X LE Y X≤Y 为“真” MOV EAX , X LE 77

GE X GE Y X≥Y 为“真” MOV DI , X GE 07H

LT X LT Y X< Y 为“真”

MOV CX , X LT 25

GT X GT Y X> Y 为“真”

MOV DL , X GT 25

注:关系运算符为“真”时,结果为“- 1”(即全 1 ),否则为 0 。

11

格式: 类型的说明符 PTR 地址表达式 类型说明符有:BYTE(字节) WORD(字) PTR 内存操作数的 5 种寻址之一 DWORD(双字) NEAR(近) FAR(远) PTR 转移地址标号/过程名

2 .修改类型属性的运算符—— PTR运算符

12

( 1 )求某个逻辑段/变量/标号的段基址运算符 SEG 格式: SEG 段名 【例】

MOV AX, SEG DATA ; AX=名为 DATA逻辑段的段基址

MOV DS , AX 【例】 XYZ DW 1234H ……

MOV AX, SEG XYZ ; AX=变量 XYZ所在段的段基址 ( 2 )取变量/标号的偏移地址运算符 OFFSET 格式: OFFSET 变量名或标号 【例】

MOV BX, OFFSET XYZ ; BX=变量 XYZ 的偏移基址

3 .返回属性或数值的运算符

13

( 3 )返回变量或标号的类型 TYPE 格式: TYPE 变量/标号 功能:返回变量类型:字节=1,字=2,双字=4;

返回标号类型:NEAR=— 1 , FAR=-2。 例: MOV AX, TYPE XYZ ; AX=2 ( 4 ) $ 运算符,返回汇编计数器的当前值。 用法:紧跟在 DB, DW, ••• 伪指令之后,统计出分配给某个变量的单元数。 例: XYZ DW 1234H, 5678H

COUNT EQU $ - XYZ ; COUNT=4

14

[ 地址表达式 ]—— 是内存操作数的常用寻址方式。 [ 下标 ]—— 表示用下标访问数据元素,直接寻址 .例: XYZ DW 1234H, 5678H

MOV BX, XYZ[2] ; BX=78H

4 .方括号运算符和地址表达式

15

1 .等值伪指令 格式: 符号常数 EQU 表达式 例: XX EQU 22H ; XX代表 22H 特点:符号常数在后继语句中不能更改。 2 .等号伪指令 格式: 符号常数 = 表达式 例: XX = 22H ; XX代表 22H,特点:在后继语句中可以重新定义:

XX= XX+1 注:符号常数可定义在任意逻辑段中,要先定义后使用。

5 . 3 数据定义的伪指令

16

格式:变量名 DB 一串用逗号间隔的单字节数 例: BUF1 DB 22H, 5*6, 10101010B

; BUF1 为字节型的变量 DB 120, -5 , 0A6H,‘HELLO’ ;分配 11 个单

元。 COUNT EQU $ - BUF1 ;统计出 BUF1 变量的单元数→符号常数, COUNT=

11 BUF2 DB ?,?, 10 DUP (‘ A’)

;?为随机数,共分配 12单元。

3.字节定义的伪指令

17

格式:变量名 DW 一串用逗号间隔的双字节数 功能:通知汇编程序,把所定义的双字节数从指定变量开始依次存放。规律:低对低,高对高 例:WNUM DW 1234H, 56,‘ AB’,‘ C’,? COUNT EQU $-WNUM ;COUNT=10 注: DW伪指令中的字符串常数,单引号内只能是一个或两个字符 ,‘C’编译后为 0043H。 5 .多字节定义的伪指令 格式:变量名 DD/DF/ DQ/DT 一串用逗号间隔的多字节数 说明:伪指令 DD/ DF/ DQ/DT 为所定义的每一个数, 分配 4 个、 6个、 8个、 10个单元。 例 5 . 3 . 1 ( P.76)

4 .字定义的伪指令 34H

12H

38H

00H

42H

41H

43H

00H

00H

00H

WNUM

18

本节主要解决程序的结构: 说明 CPU 的类型 定义逻辑段结构

说明段约定 定义过程

返回DOS 系统 说明程序的结束

5 . 4 宏汇编语言基本语法

19

格式及功能: .8086 ;只汇编 8086、 8088指令

.486 ; 80486及以下实模式指令

.486P ; 80486及以下全部指令 缺省 ;与设置 .8086等价

位于源程序的第一条指令。

1 .方式选择伪指令指明使用的 CPU 类型

20

格式: 段名 SEGMENT 定位参数 链接参数 ‘分类名’ 段长度 段体 称为属性参数 ( 可选 )段名 ENDS 属性参数为源程序的汇编、链接提供必要的信息,用于模块化设计:

各模块单独编译,单独汇编,生成各自的 OBJ文件,然后通过链接程序将各 OBJ文件链接起来,生成一个 EXE文件。 不同模块之间,同名段如何链接、如何定位?

2 .段定义语句——即逻辑段的定界语句

21

BYTE—— 段从任意字节开始 WORD—— 段从下一个字地址开始开始 DWORD—— 段从下一个双字地址开始开始 PARA (默认)——段从下一节地址开始( 16个字节为一节) PAGE—— 段从下一页地址开始( 256字节为一页)

( 1 )定位参数(段对齐)——通知链接程序,逻辑段的目标代码在存储器中如何存放

22

( 2 )链接参数(组合)——用于控制 LINK行为,指示在满足定位方式的前提下,同名各模块如何组合 PRIVATE(默认):段不与其他同名段合并。 PUBLIC—— 段与其它同名段合并为单个连续段 MEMORY—— 与 PUBLIC 等价 COMMON—— 段与其它同名段“覆盖”组合成一个逻辑段,段长为最长段长。STACK—— 段与其它同名段组合成一个大堆栈段。 AT表达式——由表达式给出段基址。常与 ORG伪指令配合,指定存储单元。 例: DATA SEGMENT AT 0040H ; DATA 段的段基址为 0040H

ORG 0017H ;指定 KEY的偏移地址 KEY DB ? ; KEY的物理地址为 0417H

DATA ENDS

23

图 5.1 (书 P.80)指出主模块 +子模块在链接时,链接参数的功能。( 3 )’分类名’——用户指定,用来区别逻辑段 链接时,把不同模块中分类名相同的同名段组织成一类,存放在邻近的存储区中。 ( 4 )段长度 USE16——该逻辑段长度最大允许为 64K,单元的有效地址为 16位, 16位寻址方式 USE32——该逻辑段长度可以超过 64K,单元的有效地址为 32位, 32位寻址方式,段长 4G。

24

格式: ASSUME 段寄存器:段名, ••• ,段寄存器:段名 功能:通知汇编程序,寻址逻辑段使用哪一个段寄存器,是非执行语句。 例: ASSUME CS : CODE, DS : DATA 说明: 作为代码段的第一条语句。 除 CS 以外段寄存器的初值必须在程序中用指令设置。如:

MOV AX, DATA 或 MOV AX, SEG DATA MOV DS , AX MOV DS , AX

DOS 把一个可执行程序( EXE文件)调用内存之后,自动地把程序代码段的段基址赋给了 CS 。

3 .段约定语句

25

格式:过程名 PROC 属性参数

……过程实体 ……RET

过程名 ENDP 属性参数:

NEAR(可缺省):与调用指令在同一个代码段中。 FAR(远过程):与调用指令不在同一个代码段中。

4 .过程定义语句

26

格式: ORG 表达式 功能:通知汇编程序,从表达式给出的有效地址开始,依次存放后继目标块。 例: CODE SEGMENT

ASSUME CS : CODEORG 100H

BEG: JMP START ;有效地址 BEG=100HBUF DB 12 , 34

START: ··········MOV AH, 4CHINT 21H ;返回DOS

CODE ENDS ;代码段结束 END BEG ;汇编程序结束

5 .定位语句

27

格式 1 : END 程序启动地址标号例: END BEG ;表明以 BEG标号开始的主程序的结束。 说明: DOS 把一个可执行程序( EXE文件)调用内存之后,自动地把程序代码段的段基址赋给了 CS ,把 BEG所在单元的偏移量赋给 IP 。 格式 2 : END ;用于模块化程序中的子模块结束。 程序返回DOS 的常用方法:

MOV AH, 4CH INT 21H

6 .汇编结束语句

28

介绍基于DOS环境的实模式程序设计的基本方法。

本章主要教学内容 1 、汇编语言基本格式、程序设计步骤和方法 2 、 DOS 和 BIOS 中断调用 3 、顺序、分支、循环、子程序的基本结构和设计方法 4 、宏指令与条件汇编

本章教学目的 使学生掌握指令系统的应用,学会程序设计的方法。

教学重点:指令系统的应用、汇编语言程序设计

教学难点:指令的灵活运用、程序设计技巧

第 6 章 汇编语言程序设计

29

( 1 )分析问题,抽象出数学模型( 2 )确定算法或解题思想( 3 )绘制流程图( 4 )存储空间和工作单元初始化( 5 )程序编制( 6 )静态检查( 7 )动态调试

程序设计的基本步骤

30

程序一般可以由顺序结构、分支结构和循环结构这 3 种组合而成。每一个结构只有一个入口和一个出口, 3 种结构的任意组合和嵌套就构成了结构化的程序。( 1 )顺序结构:是按照语句的先后次序执行一系列的顺序操作( 2 )分支结构:也叫条件选择结构,根据不同情况做出判断和选择,以便执行不同的程序段 , 分为双分支结构和多分支结构。( 3 )循环结构:循环实际上是分支结构的一种扩展,循环是否继续是依靠条件判断语句来完成的。按照条件判断的位置,可以把循环分为“当型循环”和“直到型循环”。

程序的基本结构

31

可执行文件的类型有:*.bat 批处理文件 低 *.exe 执行文件 (执行级别) *.com 执行文件 高

有两种类型的编程格式:1 、 EXE文件的编程格式2 、 COM文件的编程格式

6 . 1 汇编源程序的编程格式

32

.486SSEG SEGMENT STACK 〈堆栈段的内容〉 SSEG ENDSDSEG SEGMENT 〈数据段的内容〉DSEG ENDSCSEG SEGMENT

ASSUME CS : CSEG , DS : DSEG , SS : SSEG 启动标号: 〈代码段的内容〉

MOV AH , 4CHINT 21H ;返回 DOS

CSEG ENDS END 启动标号

6 . 1 . 1 EXE文件编程格式

特点:可有多个逻辑段(数据段、堆栈段、代码段),在实模式下,每个逻辑段的目标块≤ 64KB,适合编写大型程序。

33

例 6.1.1 :显示 10行 HELLO( .EXE格式) .486 DATA SEGMENT USE16 MESG DB ‘HELLO’ , 0DH , 0AH ,’ $’ ; 0DH :回车, 0AH :换行 DATA ENDS STACK_ SEGMENT PARA STACK ‘STACK’ USE16 DB 100 DUP (?) STACK _ ENDS CODE SEGMENT USE16 ASSUME CS : CODE , DS : DATA , SS : STACK_ BEG : MOV AX , STACK_ MOV SS , AX ;设置栈底和栈顶(可省略) MOV SP , 100 ;∵装入内存时自动给 SS , SP赋值。

MOV AX , DATA MOV DS , AX MOV CX , 10 ;设置循环次数 LAST : MOVAH , 9 MOV DX , OFFSET MESG INT 21H ;显示一行 HELLO LOOP LAST ;循环控制 MOV AH , 4CH INT 21H ;返回 DOS CODE ENDS END BEG ;结束

代码段

堆 栈段

数 据段

34

特点:( 1 )只有一个代码段,不允许设置堆栈段; ( 2 )数据集中设置在代码段的开始或末尾; ( 3 )在代码段偏移地址为 100的单元必须是程序的启动指令。 ( 4 )代码段的目标块﹤ 64KB。适合于编写中小型程序。

CODE SEGMENT USE16 ASSUME CS : CODE ORG 100H ;指定后继指令的有效地址 BEG:JMP START ; BEG为程序的启动地址

<数据定义 >START: <代码内容 > MOV AH, 4CH 或采用 INT 20H INT 21H ;返回DOSCODE ENDS END BEG

6 . 1 . 2 COM文件的编程格式

35

例 6.1.2 :显示 10行 HELLO( .COM 格式) CODE SEGMENT USE16

ASSUME CS : CODEORG 100H ;指定后继指令的有效地址

BEG:JMP START ; BEG为程序的启动地址 MESG DB ‘HELLO’, 0DH, 0AH,’$’ ; 0DH:回车, 0AH:换行 START: MOV CX, 10 ;设置循环次数LAST: MOV AH, 9 MOV DX, OFFSET MESG INT 21H ;显示一行 HELLO LOOP LAST ;循环控制

MOV AH, 4CH 或采用 INT 20HINT 21H ;返回DOS

CODE ENDS END BEG ;汇编结束

36

( 1 )编辑生成 ASM文件( 2 )汇编生成 OBJ文件(用 TASM.EXE 或 MASM.EXE)( 3 )链接生成 EXE文件(用 TLINK.EXE或 LINK.EXE)( 4 )链接生成 COM文件:用 TLINK.EXE链接时使用小写的“ t”做链接参数。

从汇编语言源程序到可执行程序的生成过程 :

汇编语言源程序 .ASM 汇编 目标程序 .OBJ

连接可执行程序 .EXE

TASM.EXE

TLINK.EXE

EDIT.EXE

编辑

37

1 、当 EXE文件装入内存:• 程序段前缀( PSP )—— DOS 在同一块内存区的用户程序上方(低址)偏移地址为 00H~ FFH的单元自动生成 256个字节的数据块。 • 使 DS=ES=存放 PSP 的段基址, FS=GS=0,使 CS : IP=用户程序的启动地址, SS :SP 指向用户堆栈段的栈顶,然后 DOS 将控制权交给用户。 EXE文件内存映像如图 6.1 ( a )( P.86)

6 . 1 . 3 EXE文件和 COM文件的内存映像

38

INT 20H

……

数据段

代码段

堆栈段

DS , ES

CS :IP

SS :SP

用户程序

PSP

图 6.1 ( a ) EXE文件的内存映像

39

2 、当 COM文件装入内存:• 程序段前缀( PSP )—— DOS 在同一块内存区的用户程序上方(低址)偏移 00H~ FFH的单元生成一个程序段前缀。 • 从偏移地址 100H开始依次存放用户程序,所以 IP=100H, CPU从此开始执行。 • 自动为用户设置堆栈段,且在用户程序的高端。初始栈顶为 2 个字节的 0。 • DOS 自动赋值使 CS=DS=ES=SS=PSP 的段基址。FS=GS=0, IP=100H, SP=FFFEH,后 DOS 将控制权交给用户。 COM文件内存映像如图 6.1 ( b )( P.86)

40

INT 20H

……

用户程序

堆栈段

00H

00H

CS , DS, ES , SS

IP

SP64KB—256B

PSP

图 6.1 ( b ) COM文件的内存映像

100H

41

占用 256个单元,信息是 DOS装载可执行文件时自动生成的,用来管理用户程序: • 向用户程序传递参数,提供正常结束和异常结束时返回DOS 的途径。 PSP 的数据格式 : (书 P.86 )

• 程序运行时如何从 PSP 中获取命令行参数? •当程序结束返回DOS之后,用户程序及 PSP所占用的内存空间均被释放。

6 . 1 . 4 程序段前缀( PSP )

42

1 、常用方法: MOV AH, 4CH INT 21H

2 、 COM文件还有 3 种: ( 1 )直接执行 INT 20H; ( 2 )调用 INT 21H 的 0号功能;

MOV AH, 0 INT 21H

( 3 )执行 RET指令。如果堆栈段的内容全部弹出,则 SP必然等于 FFFEH,

CPU 将无条件转入 PSP 的首单元,执行那里的 INT 20H,返回DOS 。

6 . 1 . 5 返回 DOS 的其他方法

43

3 、 EXE文件还有 1 种:设法使 CPU 转到 PSP首单元采用下面 3项措施: ( 1 )把整个执行程序放在一个远过程中 ( 2 )在给 DS赋初值之前,将 PSP 的物理地址入栈,执行:

PUSH DS MOV AX, 0 PUSH AX

( 3 )程序在需要返回DOS 的地方执行 RET指令即可,此时 CS : IP 为 PSP 的首单元 例6.1.3 :显示 10行 HELLO( .EXE格式)

44

例 6.1.3 :显示 10行 HELLO( .EXE格式) .486 DATA SEGMENT USE16 MESG DB ‘HELLO’ , 0DH , 0AH ,’ $’ ; 0DH :回车, 0AH :换行 DATA ENDS STACK_ SEGMENT PARA STACK ‘STACK’ USE16 DB 100 DUP (?) STACK _ ENDS CODE SEGMENT USE16 ASSUME CS : CODE , DS : DATA , SS : STACK_ MAIN PROC FAR ;定义远过程 BEG : PUSH DS

MOV AX , 0 ; PSP首单元物理地址入栈 PUSH AX MOV AX , DATA

MOV DS , AX MOV CX , 10 ;设置循环次数 LAST : MOVAH , 9 MOV DX , OFFSET MESG INT 21H ;显示一行 HELLO LOOP LAST ;循环控制 RET ;返回 DOSMAIN ENDP CODE ENDS END BEG ;结束

远过程

45

COM文件:不允许设置堆栈区,但其装入内存后,DOS 将自动在用户程序的高端地址为其设置堆栈区。 EXE文件:可以设置 SS ,若没有设置链接时有警告信息,但 DOS 将其装入内存后,自动分配 128个字节的堆栈区。

6 . 1 . 6 源程序堆栈段的设置

46

DOS 系统中有两个核心模块: IBMBIO.COM—— 为基本 I/O 设备处理程序,完成数据 I/O

的基本操作。IBMDOS.COM——磁盘文件管理程序。

这两个模块中有 100多个子功能可被用户调用。用户调用这些子功能就称之为“ DOS 系统功能调用”。DOS 系统功能调用的调用模式:

MOV AH ,功能号设置入口参数INT 21H ;执行“ 21 型中断服务程序”的由 AH 指定的子程

序。分析出口参数

6 . 2 DOS 系统 I/O 功能调用( INT 21H)

47

1 、从键盘输入一个字符( 1 ) 01H 功能——等待键盘键入一个字符,有回显,响应 Ctrl_

C 。( 2 ) 08H 功能——等待键盘键入一个字符,无回显,响应 Ctrl_

C 。( 3 ) 07H 功能——等待键盘键入一个字符,无回显,不响应 Ctrl_C 。入口参数:无出口参数: AL=按键的 ASCII 码。

若 AL=0 ,表明按键是功能键,需再次调用本功能,才能返回按键的扩展码。例: MOV AH , 01H

INT 21H

CMP AL ,‘ Y’ ;从键盘输入的字符与‘ Y’比较 JE EXIT ;若是,转

DOS 系统常用的输入 / 输出功能调用

48

2 、在屏幕上显示一个字符 02H 功能——在光标所在位置显示一个字符,光标右移,响应 Ctrl_C 。入口参数: DL=待显示的 ASCII 码。出口参数:无例: MOV AH , 02H

MOV DL ,‘ A’

INT 21H ;在屏幕上显示字符 A

49

06H功能——根据 DL寄存器的内容执行字符显示 /字符输出 ( 1 )显示 DL 中的字符 入口参数: DL=0 ~ FEH出口参数:无,显示与 DL内容对应的字符( 2 )判断有无键盘输入,无回显,不响应 Ctrl_C 。 入口参数: DL=FFH出口参数:若无键输入,则置Z标 =1 若有键输入,则置Z标 =0, AL=输入字符的 ASCII 码。若 AL=0 ,需再次调用本功能,才能返回按键的扩展码。0BH 功能——查询有无键盘输入,响应 Ctrl+C

入口参数:无 出口参数: AL=0 无键入 AL=FFH 有键入

3 、判断有无键盘输入

50

09H 功能——从当前光标处开始显示字符直到遇到串的结束标志,‘ $’(即 ASCII 码 24H ),响应 Ctrl+C 。 入口参数: DS : DX= 字符串首地址。出口参数:无。实验证明破坏 AL寄存器的内容。例: 设数据段 STR DB ‘AAAAA’ , 0DH , 0AH ,‘$’代码段

对 DS初始化MOV AH, 09HMOV DX, OFFSET STRINT 21H ;屏幕上显示‘ AAAAA’ 并回车换

行•••••

3 、在屏幕上显示字符串

51

0AH功能——等待从键盘输入字符串(以回车结束输入),送用户程序数据区。 入口参数: DS : DX=缓冲区首址,要求该缓冲区中: 第一字节存放允许用户输入的字符数(包括回车键);出口参数: 实际输入的字符数(不包括回车键),保存在缓冲区的第二字节 从第三字节开始保存输入的字符串(包括回车键)。

4 、从键盘输入一串字符

BUF +0 预置可容纳的字符个数(包括回车符)+1 实际接受的字符个数(不包括回车符)+2

: 键入字符串的实际存储区:

+n

数据缓冲区

52

例: BUF DB 20, 0, 21DUP (?) ;建立缓冲区,字符串最长为 19个 ····· MOV DX, OFFSET BUF MOV AH, 0AH ;输入 ABCDEF回车 INT 21H ; BUF: 20, 6,‘ ABCDEF’ , 0DH •••••

53

00H 功能——结束一个程序。入口参数: CS= 程序段前缀段基址 实用于 COM 格式的源程序返回 DOS 。例: MOV AH , 00H

INT 21H

4CH功能——终止当前程序的运行,把控制权交给调用它的程序,释放存储空间,关闭所打开的文件。 入口参数: AL= 返回码(或者不设置) 出口参数:无 例 6. 2 . 1 (书 P.92 )人机对话

5 、返回DOS

54

BIOS—— 基本输入 /输出系统程序,放在主板 ROM 中,提供的功能有: 系统加电自检、 引导装入、 主要输入 /输出设备的驱动程序 对系统接口电路的初始化编程等等。 DOS 与 BIOS 的关系: BIOS 是最低层的系统软件。

DOS 是较高层次的系统软件, DOS 的许多功能是通过调用 BIOS实现的。 用户程序调用 BIOS 功能称为“BIOS 功能调用”

6 . 3 BIOS键盘输入功能调用( INT 16H )

55

MOV AH,功能号设置入口参数 INT n 分析出口参数

BIOS 功能调用模式:

调用 BIOS键盘输入子功能,使用 INT 16H调用 BIOS屏幕操作子功能,使用 INT 10H

56

00H 功能——等待从键盘输入一个字符,无回显,响应 Ctrl_C 。入口参数:无出口参数: AL=键入字符的 ASCII 码。若 AL=0,则 AH=输入键的

扩展码。例: MOV AH, 00H INT16H ;若键入字符 A ,则屏幕不显示, AL=41H 01H 功能——查询键盘缓冲区是否有键入字符 入口参数:无 出口参数: Z标 =1 ,表键盘无输入 Z标 =0,有键入字符, AL=字符的 ASCII 码, AH=字符的扩展码。

BIOS 常用的键盘输入子功能(调用指令 INT 16H )

57

02H 功能——读键盘当前的转换键状态 入口参数:无 出口参数: AL=键盘状态字。状态字各位定义如下:

7 0Insert键

Caps Lock

Num Lock

Scroll Lock

Alt键 Ctrl键

左Shift

右Shift

注:位置为 1 ,表示相应的转换键被按下,或有效时。   10H 功能——读扩展键盘,无回显,响应 Ctrl_C 。入口参数:无出口参数: AL=键入字符的 SACII 码,若 AL=0, AH=键入字符的扩展码。

58

11H 功能——查询扩展键盘缓冲区是否有键入字符入口参数:无出口参数: Z标 =1 ,表键盘无输入 Z标 =0,有键入字符, AL=字符的 SACII 码,AH=字符的扩展码。 12H 功能——读扩展键盘当前的转换键状态入口参数:无出口参数: AL= 扩展键盘状态字。 AL7 ~ AL0的置位条件同功能 02H。

59

MOV AH, 01HINT 16H ;查询键盘缓冲区JZ STOP ;无键入则转MOV BX, AXMOV CH, 4

LOOP1 : MOV CL, 4ROL BX, CL ;不带进位的循环左移,把高 4位移

到低 4位MOV AL, BLAND AL, 0FH ;截取低 4位ADD AL, 30H ;转换为 ASCII 码CMP AL, 3AHJL NEXT ;是数字,转ADD AL, 07H ;不是数字再加 7,变为字母

NEXT: MOV DL, ALMOV AH, 02HINT 21H ;显示 DL中的字符DEC CHJNZ LOOP1

STOP : ·····

实例:检查键盘缓冲区是否有字符,若有则将此字符的 ASCII 码及扩展码送屏幕显示。

60

6. 4 . 1 显示器 分类: CRT(阴极射线管或称光栅扫描)显示器; 液晶显示器。 显示适配器——是显示器和系统总线之间的接口电路。用 9针插座与 CTR显示器相连。

功能: CRT控制器、定时器、字符发生器、显示存储器等。 显示器和显示适配器共同组成微机的输出显示系统。 CRT显示器性能指标 分辨率:分字符分辨率(以字符为单位)和图形分辨率(以像素为单位) 显示速度——与分辨率及扫描频率有关。 色彩及亮度等级(灰度)

6 . 4 文本方法 BIOS屏幕调用 ( INT 10H )

61

单色显示——只能工作在文本方式下,显示字母、数字、符号。对应的显示标准是 MDA 。 彩色显示器——即支持文本模式,又支持图形模式。• 对应的显示标准是 CGA→EGA→VGA→SVGA→TVGA (达到了 1024X768的最大分辨率, 256色,支持132 列的文本显示模式) • DOS启动后,适配器自动工作在 80列X 25 行的文本方式下。

1 .屏显方式

62

• 当适配器工作在 80列X 25 行的文本方式时,屏幕被划分为 2000个“方格”,每一个方格对应显示存储区(又称视频映像区)中的两个单元: 偶地址:存放待显示字符的 ASCII 码 奇地址:存放待显示字符的“属性字” •显适配器中:容量为 4K,实际使用 4000个单元(一屏)。 地址为: B000: 0000~ 0FFFH。 •彩显适配器中:文本显示容量为 16K,分成 4页,页号分别为: 0, 1 , 2 , 3 ,一页即一屏。

2 .显示存储器

63

彩显适配器中 0-3页的存储地址分配 :第 0 页存储器地址为: B800: 0000 ~ 0FFFH,空闲 96个单元第 1页存储器地址为: B900: 0000 ~ 0FFFH,空闲 96个单元第 2页存储器地址为: BA00: 0000 ~ 0FFFH,空闲 96个单元第 3页存储器地址为: BB00: 0000 ~ 0FFFH,空闲 96个单元启动 DOS 后,系统默认第 0 页为“当前页”。 显示存储区与屏幕字符的对应关系,如图 6.3(书 P.95): 相对各个页面的段基址而言:

本页显示存储单元的地址偏移量 =行号 *160 +列号 *2 相对于 0页的段基址而言:

各页显示存储单元的地址偏移量等于 行号 *160 +列号 *2+页号 *1000H 显示存储器组装在显示适配器中,与系统 RAM 统一变址: 单色显示存储器占用系统 RAM B0000 ~ B0FFFH共 4K单元 彩色文本存储器占用系统 RAM B8000 ~ BBFFFH共 16K单元

64

描述了字符显示的特性:前景色、背景色、是否闪烁等。如图 6.4 及表 6.1(P.96)。 4 .屏幕显示   系统加电后, BIOS 对显示适配器进行初始化,使屏幕工作在 80X25黑白文本方式。 CRT 控制器从 0页的显示存储单元依次取出字符的 ASCII 码,转换成点阵码送 CRT,驱动 CRT显示   CRT 控制器以 50屏 / 秒的速率,周期性地、不间断地进行上述操作。对程序员来讲,只要把待显字符的 ASCII 码和它的属性字写入显示存储器的相关单元,就相当于输出到屏幕上。

3 .属性字

65

1 .调用指令: INT 10H2.功能:    00H 功能——设置屏幕显示方式 入口参数: AL= 模式号。如:

AL=0, 40X25 黑白文本方式AL=1 , 40X25 彩色文本方式AL=2 , 80X25 黑白文本方式AL=3 , 80X25 彩色文本方式

出口参数:无

6 . 4 . 2 文本方式 BIOS屏显功能调用 ( INT 21H )

66

    01H 功能——设置光标的形状 入口参数: CH=光标顶部扫描线行号( 0 ~7), CL=光标底部扫描线行号( 0 ~7)

出口参数:无   02H 功能——设置光标位置入口参数: BH=显示页号, DH=行号, DL=列号。出口参数:无  03H 功能——读光标的位置 入口参数: BH=显示页号。 出口参数: CH, CL=光标顶部扫描线、底部扫描线行号 DH, DL=光标在屏幕上的行、列号。

67

   05H 功能——选择工作页面入口参数: AL= 页号(在 80列方式中为 0 ~3)。出口参数:在屏幕上显示出指定显示页的字符(只对文本方式有效)   06H 功能——窗口上滚入口参数: AL=上滚行数, AL=0初始化窗口。 BH=填充行的字符属性, CH/ CL=窗口左上角行/列号     DH/ DL=窗口右下角行/列号

出口参数:无

68

   07H 功能——窗口下滚入口参数: AL=下滚行数, AL=0初始化窗口。 BH=填充行的字符属性, CH/ CL=窗口左上角行/列号     DH/ DL=窗口右下角行/列号出口参数:无   08H 功能——读光标位置的字符和属性入口参数: BH=页号 出口参数: AL=字符的 ASCII 码, AH=属性

69

  09H 功能——在光标位置写字符和属性入口参数: AL=字符的 ASCII 码 BH /BL=页号/字符属性 CX=重复写字符的个数出口参数:无  0AH 功能——在光标位置写字符入口参数: AL=字符的 ASCII 码 BH = 页号 CX=重复写字符的个数出口参数:无  0EH 功能——显示一个字符 (与 DOS 系统的 2 号功能相同)入口参数: AL=字符的 ASCII 码

出口参数:无

70

   13H 功能——显示字符串入口参数: AL=0 ~3

BH/ BL=页号/属性 CX=字符个数(串长度) DH/ DL=字符串显示的起始行/列号 ES : BP=字符串的首地址出口参数:无说明: AL=0表示:串仅含 ASCII 码,属性由 BL 决定,光标返回调用前位置 AL=1 表示:串仅含 ASCII 码,属性由 BL 决定,光标停留在字符串尾 AL=2 表示:串中含 ASCII 码和属性,光标返回调用前位置 AL=3 表示:串中含 ASCII 码和属性,光标停留在字符串尾

71

分类:简单分支、复合分支、多分支。

6 . 5 分支程序

判断条件

语句 1 语句 2

Y N判断条件

语句 1 语句 2 语句 n……

图: 简单分支 图: 多分支

72

采用 IF—THEN—ELSE结构实现:即对两个操作数进行算术或逻辑运算,然后根据运算结果对标志位Z、 S 、 P 、 O、 P 、C 的影响来产生分支。 基本程序分支程序实现举例:   ( 1 ) 用比较指令CMP DEST, SRC ;比较两个操作数JE EQUL ;如果 DEST≠SRC ,则顺序执行下一条指令, EQUL:┇ ;否则转到标号 EQUL 处。或 JB EQUL ;无符号数 DEST﹤SRC时,转移或 JL EQUL ;有符号数 DEST﹤SRC时,转移

1 .简单分支

73

( 2 ) 用测试指令TEST DEST, SR : DEST和 SRC 进行逻辑与测试JNZ ONE ;如果相与结果为 0,则顺序执行下一条指令,ONE:┇ ;否则转到标号 ONE处。

( 3 )用逻辑指令 RCL DEST, CL ;对 DEST进行带进位的循环左移JC NEXT ;如果 CF=0,则顺序执行下一条指令, NEXT:┇ ;否则转到标号 NEXT处。

74

将 BX寄存器的内容以二进制数格式显示在屏幕上。设计思想:将 BX寄存器左移一位,判进位标志,若为 0。屏幕显示‘ 0’,若为 1 ,屏幕显示‘ 1’。处理流程:

【例 6.5.1 】二进制数显示程序(书 P.99)

CX=0

DL=‘0’

BX 的最高位→ CF

CF=1

显示‘ 0’ DL=‘1’

显示‘ 1’

返回 DOS

Y

N

N Y

75

在一个分支中又嵌套着另一个分支 【例 6.5.2 】设 NUMBER单元的数 X以及数值 N1 , N2均为单字节无符号数,请判断X的大小,并根据判断结果分别显示:N1<=X<=N2 ,或 X<N1,X>N2.(书 P.100) 处理流程:

2 .复合分支

X≥N1

显示 X<N1

X≤N2

显示 X>N2 显示 N1≤X≤N2

分支结束

N

YY

N

76

即多路开关,通常根据某个寄存器或某单元的内容进行程序的转移。

常采用转移地址表法:在存储区设置一地址表,将多个分支程序的地址

(语句标号)顺序放在表中,供程序在条件选择某一分支程序时使用。格式: JMP [ 地址表的首地址 +元素下标 ×2]

【例 6.5.3 】多分支的段内转移示例(书 P.100)。

3 .多分支

77

循环结构程序是经常用到的,主要由以下 4 个部分组成:( 1 )初始化部分( 2 )循环体( 3 )参数修改部分( 4 )循环控制部分常用寄存器或内存操作数作为循环计数器。 循环程序结构分为:单重循环和多重循环

6 . 6 循环程序

78

REPEAT—UNTIL结构:先执行循环体再判断条件。循环程序结构如图 6.5 ( a )( P.102 )

REPEAT—UNTIL 循环结构程序举例:( 1 )   MOV CX , COUNT ;设置

循环初值 AGAIN: ┇ ;循环程序入口

LOOP AGAIN ;循环控制

( 2 )    MOV CL, COUNT ;设置循环初值 AGAIN: ┇ ;循环程序入口

DEC CL ;计数器减 1JNZ AGAIN ;循环控制

【例 6.6.1_1 】找最大数解法 1 (书 P.101 )。 找最大数的程序框图如图 6.6

1 .单重循环程序

79

WHILE—DO结构:先判断循环条件,满足条件才进入循环体。WHILE—DO循环结构程序举例: ( 1 ) MOV CX, COUNT ;设置循环计数初值 AGAIN: JZ NEXT ; CX=0,退出循环

┇DEC CX ;修改循环计数值JMP AGAIN

NEXT: ┇( 2 ) AGAIN: CMP DEST, SRC ;入口,比较两个操作数

JE EXIT ;如果 DEST=SRC ,退出循环。

┇JMP AGAIN

EXIT: ┇【例 6.6.1_2 】找最大数解法 2 (书 P.103 )。

80

循环程序中嵌套循环程序。双重循环结构如图 6.5(b) ( P.102 ) 在使用多重循环时要特别注意以下几点:( 1 )内循环应完整地包含在外循环内,内外循环不能相互交叉。( 2 )内循环在外循环中的位置可根据需要任意设置,在分析程序流程时要避免出现混乱。( 3 )内循环既可以嵌套在外循环中,也可以几个循环并列存在。可以从内循环直接跳到外循环,但不能从外循环直接跳到内循环。( 4 )防止出现死循环,无论是内循环还是外循环,不要使循环回到初始化部分,否则将出现死循环。( 5 )每次完成外循环再次进入内循环时,初始条件必须重新设置。

2 .多重循环

81

1 .子程序的定义:  过程名 PROC属性

┇RET

过程名 ENDP由所处位置来确定属性:是段间或段内子程序。2 .调用指令CALL 过程名 ;段内调用CALL FAR 过程名 ;段间调用

6 . 7 子程序及其调用

82

1

5 、

83

1

5 、

84

1

5 、

85

1

5 、