第三章: 8086 汇编语言程序设计
description
Transcript of 第三章: 8086 汇编语言程序设计
1
主讲教师:范新民
第三章: 8086汇编语言程序设计第三章: 8086汇编语言程序设计
2
3.2.1 汇编语言源程序的格式1
3.2.2 常量、标识符和表达式2
3.2.3 指示性语句3
8086汇编语言程序设计8086汇编语言程序设计
3.2.4 指令性语句4
3.2.5 宏指令5
3
8086汇编语言程序设计8086汇编语言程序设计
3.2.1 汇编语言源程序的格式一、基本概念
1 、机器语言、汇编语言和高级语言
机器语言:用 0 、 1 代码表示的机器指令形式,是机器硬件 唯一能识别和执行的语言。 例:机器指令 0100 0000 ; 表示( AX )+ 1→AX汇编语言 :用符号表示指令的操作码、操作数。又称符号 语言。 例: INC AX ;增 1 指令
4
汇编语言和机器语言都是面向机器的语言,即不同的机器有不同的指令系统。机器指令与机器代码是一一对应的。
汇编语言机器语言均属于低级语言。
高级语言: 接近人的自然语言和数学表达式。用高级语言编写的程序是脱离机器的、面向过程或面向对象的语言。如:C 语言, Java 语言等。
汇编语言源程序的格式
5
2 、汇编语言的特点代码长度短,执行速度最快可直接有效的控制机器的运行准确掌握机器运行时间可最有效的利用 CPU 、内存、 I/O 资源
直接控制机器运行的场合 汇编语言常用于: 需要准确控制运行时间的场合 运行速度要求很高的场合
汇编语言源程序的格式
6
汇编语言源程序的格式
3 、语句的类别与结构分段结构:最多可由 4 种段组成:代码段、数据段、堆栈段、附加段。语句类别:
( 1 )指令语句: 由汇编程序汇编成相应的能被 CPU 直接识别并执行的目的码,或称机器代码。
( 2 )宏指令语句: 允许用户为多次重复使用的程序段命名的一个名字。即将一个程序段定义为一宏指令。
7
第三章:汇编语言程序设计
( 3 )伪指令语句: 伪指令语句是一种指示性语句,这类语句向汇编程序提供汇编过程要求的一些辅助信息,如给变量分配内存单元地址、定义各种符号、实现分段等。
伪指令与指令性语句的区别:伪指令语句经汇编后不产生任何机器代码,而指令性语句经汇编后会产生相应的机器代码;伪指令语句所指示的操作是在程序汇编时就完成了的,而指令性语句的操作必须在程序运行时才能完成。
8
例 3-1 :对 10 个字节数据 a1 ~ a10 求和。DATA SEGMENT AT 2000HARRAY DB a 1 , a 2 , a 3 ,… , a 10COUNT EQU $ - ARRAYSUM DW ?DATA ENDSSTACK SEGMENT PARA STACK ‘STACK’STAK DB 10 DUP ( ?)TOP EQU LENGTH STAKSTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK
汇编语言源程序的格式
9
START : MOV AX , DATA MOV DS , AX MOV AX ,0 MOV DI , OFFSET SUM MOV BX , OFFSET ARRAY MOV CX , COUNT
LOP : ADD AL ,[ BX ] ADC AH ,0 INC BX LOOP LOP MOV [ DI ] , AX MOV AH , 4CH INT 21H
CODE ENDS END START
汇编语言源程序的格式
10
二、指令性语句[ 标号: ] 操作码 [ 操作数 ] [; 注释项 ]
操作码:指明操作的性质,说明计算机要执行的具体指明操作的性质,说明计算机要执行的具体操 作。用助记符表示。操作数:操作数:指明指令执行过程中所需的数据。可有指明指令执行过程中所需的数据。可有 00 个、个、 11
个个 或者多个表达式组成,并由它提供执行指定操作或者多个表达式组成,并由它提供执行指定操作 所需要的操作数或地址。所需要的操作数或地址。注释项:必须以分号开头,主要用来说明程序或重要语句 的功能。
汇编语言源程序的格式
11
标号:对应的标识符后面必须跟有冒号,标号在汇编以 后分配有地址。标号又称为符号地址,可作为转 移指令或子程序调用的目标地址。
汇编语言源程序的格式
12
汇编语言源程序的格式
三、指示性语句 指示性语句是主要由命令构成的语句,用来指示汇编程序进行汇编操作。格式:
[ 名字 / 变量 ] 命令 参数 [; 注释项 ]
命令:指示汇编程序进行某种汇编操作参数:汇编操作有关的数据
13
汇编语言源程序的格式
3.2.2 常量、标识符和表达式3.2.2 常量、标识符和表达式
1 、常量 :数字常量可以是二进制数、八进制数、十进制数或十六进制数表示。字符常量是用单引号‘ ’括起来的 ASCII 字符其值是该字符的 ASCII 代码值。例: MOV AX,‘A’ ;AX=41H 符号常量是用符号定义的常量。例:采用符号定义语句 PORTA EQU 80H MOV AL , PORTA 与指令 MOV AL , 80H 等价
14
标识符可用作符号常量、名字、变量和标号等。 组成标识符有如下规定:
组成标识符的字符有: 大写字母: A ~ Z ;文小写字母: a ~ z ; 数字 0~ 9 ;字符 ? 、 @ 、 _ 、 $ ;
字符长度不超过 3l个;首字符不能是数字; ? 不能单独作为一个标识符; 不能把保留字用作标识符,保留字包括助记符、寄存
器名等。
2 、标识符
汇编语言源程序的格式
15
3 、表达式 由常数、变量、标号通过运算符或操作符连接而成的,可分为数值表达式和地址表达式。
汇编语言源程序的格式
数值表达式:由算术运算符、关系运算符和逻辑运算符连接常数组成的有意义的式子,它的运算结果是数值常数,只有大小,没有属性。
地址表达式:由变量、标号、常数、寄存器(BP 、 BX 、 SI 、 DI) 的内容和操作符组成的有意义的式子,它的运算结果不是一个普通的数值,总是和存储器地址相联系。如各种存储器寻址方式的汇编表示都属于简单的地址表达式
16
高
优先级
低
1 括号中的项,即(…)和 […]
2 LENGTH , SIZE , WIDTH , MASK
3 PTR , OFFSET , SEG , TYPE , THIS
4 * , / , MOD
5 + , -
6 EQ , NE , L , LE , GT , GE
7 NOT
8 AND
9 OR , XOR
表达式中的运算符:
17
汇编语言源程序的格式
3.2.3 指示性语句( 5条)
程序开始和结束语句段定义语句过程定义语句数据定义语句符号定义语句
18
( 1 )给程序模块命名 NAME 命令 格式: NAME 名字 名字是程序员按标识符规定所取的程序模块名。( 2 )标题命名语句 TITLE 命令 格式: TITLE 名字
名字作为每页标题打印出来,标题名字符不大于 60个( 3 )程序结束 END命令
格式: END [ 标号 ] 标号指示程序开始执行的起始地址的标号。
1 、程序开始和结束语句
汇编语言源程序的格式
19
说明:如果程序中没有 NAME 伪指令,可使用 TITLE 伪指令。程序中既无 NAME也无 TITLE 伪指令,汇编程序将用源程序名作为模块名。一般情况下使用 TITLE 伪指令,可在列表文件中能打印出来END 伪指令中,如果程序中第一句指令性语句有标号,则 END 语句的标号应与其相同否则可无标号。
汇编语言源程序的格式
20
2 、段定义伪指令
存储器的物理地址是由段地址和偏移地址组合而成的,而存储器又可以为多个段,汇编程序是按段来组织程序和使用存储器,在把源程序转换为目标程序时,必须确定标号和变量的偏移地址,并且需要把有关信息通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起形成一个可执行程序。为此,需要用到段定义伪指令。
汇编语言源程序的格式
21
( 1 )段定义伪指令 SEGMENT
格式: 段名 SEGMENT [ 定位类型 ] [ 组合类型 ][‘ 类别’ ]
…
段名 ENDS
段名由程序员定义,汇编时由系统为该段分配一个段基值。参数用来设定该段在内存中的位置和在汇编、连接时,当该段与其它段组合在一起时该段同其它段的连接关系。
汇编语言源程序的格式
22
一般情况下,定位类型、组合类型和类别说明可以不用。
注意: SEGMENT和 ENDS语句必须成对使用。
例:定义一数据段 DATA DATA SEGMENT A DB '1234' B DW 12H DATA ENDS
汇编语言源程序的格式
23
(2)偏移地址定位语句 ORG
格式:ORG 数值表达式功能:指定在它之后的程序段或数据块所存放的起始地 址的偏移量。无 ORG 语句时,段偏移地址从 0000H 开始。
例1 . DATA SEGMENT ORG 100H
X DB 12HY DW ?Z DD 1122HDATA ENDS 00
00
11H
22H
??
12HDS: 0100
0101
0102
0103
0104
0105
0106
0107
$$ -表示汇编地址计数器的当前值
汇编语言源程序的格式
24
( 3 )指定段址伪指令格式: ASSUME 段寄存器:段名 [ ,段寄存器:段名, ...]
功能:指明段和段寄存储器的对应关系,且段名必须是 由 SEGMENT定义的段名。说明:
ASSUME伪指令只是指明段和段寄存器的对应关系,并没有把段地址装入段寄存器中。但是,代码段段寄存器 CS的值是由系统负责设置的。ASSUME指令必须跟在 SEGMENT语句之后。
汇编语言源程序的格式
25
例:DATA SEGMENT X DB 12H DATA ENDS STACK SEGMENT DW 100 DUP(?) STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA, SS:STACK START:MOV AX,DATA MOV DS, AX MOV AX, STACK MOV SS, AX ┆ CODE ENDS
汇编语言源程序的格式
26
3. 过程定义伪指令格式为:过程名 PROC [NEAR/FAR] … RET 过程名 ENDP功能:过程定义伪指令用于定义子程序。段内调用使用 NEAR属性,段间调用使用 FAR属性。省略为NEAR
汇编语言源程序的格式
27
CODE SEGMENTCOUNT PROC NEAR ADD CX, 1 RETCOUNT ENDPSTART:MOV AX, 100 ┊ CALL COUNT ┊ CALL COUNT ┊ HLTCODE ENDS END START
COUNT PROCE
RET
子程序:
汇编语言源程序的格式
28
4. 数据定义伪指令格式: [ 变量名 ] 数据定义伪指令 操作数项表功能:定义数据存储区,其类型由伪指令指定。数据定义伪指令常用的有以下五种:
[ 变量名 ] DB 操作数项表;定义字节[ 变量名 ] DW 操作数项表;定义字[ 变量名 ] DD 操作数项表;定义双字[ 变量名 ] DQ 操作数项表;定义 8 个字节[ 变量名 ] DT 操作数项表;定义 10 个字节
操作数项表可以是常数或表达式、字符串、?和带DUP的表达式。
汇编语言源程序的格式
29
① 给变量赋初值或指定变量类型 例: COUNT DB 100 ARRAY DW -1,1024
04
00
FF
FF
64存储形式:COUNT→ ARRAY→
100
-1
1024
0000H
0001H
0002H
0003H
0004H
0005H
0006H
汇编语言源程序的格式
30
②定义一个 ASCⅡ码的字符串②定义一个 ASCⅡ码的字符串 为字符串的每个字符分配一个存储单元,为字符串的每个字符分配一个存储单元,并从左到右将字符的 ASCⅡ码按地址递增顺序存放在内存中。
例例 1: STR DB ‘ABCD’ 1: STR DB ‘ABCD’ 例例 2: STR1 DW ‘AB’2: STR1 DW ‘AB’
44H
42H
41H
43H
STR :
41H
42HSTR1:
汇编语言源程序的格式
31
③ ③ 用?号预留内存单元用?号预留内存单元例例 : SUB1: SUB1 DBDB ? ;? ;预留一个字节单元预留一个字节单元 RESURESU DWDW ? ? ;;预留二个字节单元预留二个字节单元
?
?
?SUB1:
RESU:
汇编语言源程序的格式
32
④ ④ 用用 DUPDUP 重复因子初始化一个数据区重复因子初始化一个数据区格式:格式: N DUP N DUP (表达式)(表达式)
例 1: DA1 DB 2 DUP(0) DA2 DB 2 DUP(‘AB’) DA3 DW 2 DUP(1)
例 1: DA1 DB 2 DUP(0) DA2 DB 2 DUP(‘AB’) DA3 DW 2 DUP(1)
00
01
00
01
42
41
42
41
00
00DA1DA2
DA3
例 2 :DUP的嵌套使用 DATA DB 10 DUP(10 DUP(0)) 定义了 100个字节全部初始化为0 。
重复次数重复次数 重复装入的内容重复装入的内容
?、数值、 ?、数值、 数值表达式 数值表达式 字符等 字符等
汇编语言源程序的格式
33
汇编语言源程序的格式
5 、符号定义语句( 1 ) EQU——赋值伪指令格式:变量名 EQU 表达式功能:将右边表达式的值赋给左边的变量。表达式可以是 常数、变量、标号、指令助记符、数值表达式、地 址表达式。
例: PORT1 EQU 100 ;符号 PORT1代表常数100 CONT EQU CX ;为 CX重新命名 ABDR EQU PORT1+1 ABC EQU DAA注:同一程序中,不能重复定义
34
( 2 )=——等号伪指令格式:符号名 = 表达式功能:与 EQU基本相同,两者的区别在于“=”伪指令可对 同一标识符作重新定义。例: EMP = 12 ;定义 EMP 等于 12
EMP = EMP+1
可以对同一个符号名重复定义。
汇编语言源程序的格式
35
( 3 ) PURGE 命令 格式 : PUREG 名字 功能:用来撤消已定义的符号常量。可同时撤消几个己 定义的名字 例 3-10 : COUNT EQU 20
┇MOV AL,COUNT
┇PURGE COUNTCOUNT EQU 10MOV BL,COUNT
汇编语言源程序的格式
36
( 1 )名字 名字包括文件名、标题名、段名、过程名和符号常量名等,
是程序员在编程中按标识符规定命名的,目的是方便编程和读程。段命
在段定义语句中命名取定,定义后的段名可以作为段基值来使用,用来对段寄存器赋值。
例: MOV AX , DATA
MOV DS , AX
6 、名字与变量
汇编语言源程序的格式
37
过程名
在过程定义语句中定义,指向过程中第一条指令所在的内存单元的地址(入口地址),有 NEAR 和 FAR之分。 符号常量
由符号定义语句 EQU 、 = 来定义,对符号常量给以赋值。
例 3-13
汇编语言源程序的格式
38
( 2 )变量 变量的定义和属性 变量由数据定义语句 DB/DW/DD/DQ/DT来定义
变量有三属性:段属性、偏移属性和类型属性: 段属性表示变量所在段的起始地址。偏移属性表示变量在段内的偏移地址。用 16位无符号表示偏移地址。类型属性表示该变量能存放的数据长度。长度为 1B
的变量,类型为 BYTE ,长度为 2B 的变量,类型为 WORD 等。
汇编语言源程序的格式
39
分析运算符( 5 个) 用于把变量的三个属性分别取出来作为操作数。
① OFFSET——取偏移地址操作符格式: OFFSET 变量或标号功能:返回该变量或标号在其段内的偏移地址。例:MOV SI,OFFSET BUF
将 BUF在数据段内的偏移地址作为立即数送到 SI中。
汇编语言源程序的格式
40
②SEG——取段址操作符。格式: SEG 变量或标号功能:返回变量或标号所在段的段基址。 例: MOV AX, SEG BUF
汇编语言源程序的格式
41
③TYPE——取类型操作符格式: TYPE 变量或标号功能:当 TYPE置于变量前面时,返回变量的类型数字。 即DB为 1 ,DW为 2 ,DD为 4 ,DT为 10。 当 TYPE置于标号前面时,返回标号的类型属性值; 当该标号为NEAR属性时,返回值为- 1 ,标号为FAR
属性时,返回值为- 2 。例:数据段中有如下定义: DATA DW
75H, 134H。 执行: ADD SI, TYPE DATA。 该语句在汇编后相当于指令 ADD SI, 2 。
汇编语言源程序的格式
42
④取变量所含的数据存储单元个数操作符 LENGTH
格式: LENGTH 变量功能:只对变量起作用,取值根据定义该变量时数据定义 伪指令后面第一个表达式的形式而定。如为重复子 句“ n DUP(表达式 )”,返回外层重复因子 n,其他形
式 的表达式,则返回 1 。
汇编语言源程序的格式
43
MOV AL,LENGTH A1
MOV CX,LENGTH A2
MOV BX, LENGTH A3
MOV DX,LENGTH A4
汇编后相当于指令:MOV AL,1
MOV CX,10
MOV BX,1
MOV DX,5
例 : DATA SEGMENTA1 DB ‘ABCD',5 DUP(0)A2 DW 10 DUP(1),1234HA3 DW 10,20 DUP(?)A4 DW 5 DUP(3 DUP(2),5)
DATA ENDS
汇编语言源程序的格式
44
⑤取变量所含的数据存储区大小操作符 SIZE
格式: SIZE 变量功能:汇编程序用该操作符返回的值表示该变量所分配的 总字节数。 例: A2 DW 10 DUP(1),1234H
MOV CX,SIZE A2 汇编后相当于有指令: MOV CX,14H
汇编语言源程序的格式
SIZE=LENGTH×TYPE
45
合成运算符① 属性定义操作符 PTR
格式:类型 PTR 地址表达式功能: PTR操作符的作用是将地址表达式的原类型属性临
时修改成 PTR操作符前面所指定的类型。指定的类 型可以是 BYTE、WORD或DWORD。可用来指定内存操作数的类型
例:MOV BYTE PTR [SI], 20H ;占一个字节 或 MOV WORD PTR [SI], 20H ;占两个字节
汇编语言源程序的格式
46
用于临时改变变量或标号的类型属性 例如: BUFW DW 1234H, 5678H
MOV AX, BUFW
MOV AL , BYTE PTR BUFW
可用 EQU 和 PTR 定义一个新的变量 例如 : BUFW DW 1234H , 5678H
BUFB EQU BYTE PTR BUFW
则 MOV AX , BUFW 和 MOV AL , BUFB
都是合法的。
汇编语言源程序的格式
47
格式 : [ 标号: ] 操作码 [ 操作数 ] [,操作数 ] [;注释 ] 一、标号 标号是一条指令在内存中的符号地址。标号一定要用‘:’结束。标号具有三种属性: 段属性:表示标号所在段的段基值
格式: SEG 标号
3.2.4 指令型语句
汇编语言源程序的格式
48
汇编语言源程序的格式
偏移量属性:表示标号所在位置的偏移地址 格式: OFFSET 标号 类型属性:表示标号所在指令是允许段内跳转还是 段间跳转 格式: TYPE 标号当标号的属性为 NEAR 属性时, TYPE=-1 。当标号的属性为 FAR 属性时, TYPE=-2 。
49
操作数可以用段名、符号常量、变量、属性表达式、过程名和标号等。例如:MOV AX , DATA ;DATA是段名MOV CX , COUNT ; COUNT 是符号常量MOV BL , BUFFER ; BUFFER 是变量MOV SI , OFFSET ARRAY;OFFSET ARRAY是属
;性表达式CALL SBRT1 ; SBRT1 是过程名JMP DONE ; DONE 是标号
2 、操作数
汇编语言源程序的格式
50
宏定义:格式: 宏指令名 MACRO [形式参数表 ] ┆ ┆ ENDM宏调用:格式: 宏指令名 [ 实际参数,… ]
宏指令体
宏指令——源程序中一个能多次可重复使用的具有独立功能 的代码段。
1 、宏指令的定义和使用 宏指令的使用过程有宏定义、宏调用、宏展开。
3.2.5 宏指令
汇编语言源程序的格式
51
例:完成AX的内容乘以2X的宏定义及宏调用定义宏:MULX MACRO PX 形式参数 宏指令名 MOV CL,PX
SAL AX,CL
ENDM
宏调用: ┆ MULX 2 ; ┆ MULX 4 ; ┆ MULX 5 ;
实际参数
AX← ( AX ) *22
AX← ( AX ) *24
AX← ( AX ) *25
汇编语言源程序的格式
52
宏调用: ┆ ┆ MULT 120,BL,SAVE
┆
宏展开:在汇编宏指令时,宏汇编程序将宏指令体插入到宏指令所在的位置,并用实际参数代替形式参数。
例:两数相乘,返回积。宏定义: MULT MACRO OPR1 , OPR2 , RESULT MOV AL , OPR1 IMUL OPR2 MOV RESULT , AX ENDM
MOV AL , 120 IMUL BL MOV SAVE , AX
汇编语言源程序的格式
53
2 、宏指令与子程序(过程)的区别:宏指令调用无返回地址,执行速度略快。通过形参、实参结合传递函数宏指令不能压缩目标代码长度,占用内存较子程大。
汇编语言源程序的格式
54
3.3.1 概述 3.3.2 顺序程序 3.3.3 分支程序 3.3.4 循环程序 3.3.5 子程序 3.3.6 汇编语言程序举例 3.3.7 系统功能调用
3.3 汇编语言程序设计基础
55
3.3.7 常用的DOS与 BIOS中断功能调用
1. DOS中断 DOS除了给用户提供了命令行服务以外,还为汇编
语言程序员提供了大量的子程序,这些子程序包含了从基本输入输出到内存管理、磁盘读写、文件系统等各个方面,使用这些子程序,使得汇编语言程序员不必搞清大量的设备接口、数据结构等细节,即可完成所需功能,简化了汇编语言的编程。由于 DOS提供的这些子程序被看作是DOS系统功能的一部分,因而人们把对这些子程序的调用又称为 DOS功能调用。
一、DOS中断与系统功能调用
56
DOS提供的这些子程序位于DOS的基本系统文件IBMBIO.COM和 IBMDOS.COM中,随着DOS的加载而进入内存,即只要能启动DOS就可以使用。DOS的这些子程序是以中断的方式向系统及应用程序提供服务的,故必须采用软中断指令 INT进行调用。 随着DOS的发展,所提供的功能 ( 子程序 ) 越来越多,不可能每一个子程序都占用一个中断号,于是采用让它们共用一个中断号,即 21H号的办法,进入这一个中断后,DOS再根据应用户程序中子程序编号的设置来确定用户程序到底想调用哪一个子功能。
常用的DOS与 BIOS中断功能调用
57
2. DOS系统功能调用 ( 1 )DOS功能调用的方法
设置入口参数,如果所调用的子程序不需参数,则可省略此步。
欲调用的子程序编号→ AH。 发中断调用指令 INT 21H。
常用的DOS与 BIOS中断功能调用
58
( 2 )DOS基本 I/O功能调用 01 功能——键盘输入 入口参数:无
出口参数:所读取的字符 ASCII码在 AL内。功能:扫描键盘,若有按键按下,将字符 ASCII码放入AL
中,同时在屏幕上显示这个字符,然后返回。若 无键按下,该调用等待直到有键按下为止。例: MOV AH , 01
INT 21H
常用的DOS与 BIOS中断功能调用
59
08 功能——键盘输入。入口参数:无
出口参数:所读取的字符 ASCII 码在 AL 内。 功能:同 01号类似,但是不在屏幕上显示输入的字 符,在读取密码时常用本功能。
例: MOV AH , 08 INT 21H
常用的DOS与 BIOS中断功能调用
60
10号功能——字符串输入入口参数:DS:DX指向输入缓冲区。输入缓冲区具有如下格式:
第一个字节:指明准备接收的最大字符数,包括回车符。
第二个字节保留,由DOS在功能调用结束后填入实际输入的字符个数 ( 不包括最后的回车符 ) 。
用户输入的字符串从第三个单元开始存放出口参数:用户实际输入字符个数在缓冲区第二个单元中
常用的DOS与 BIOS中断功能调用
61
DATA SEGMENTBUF DB 8 ;指明最大字符数 DB ? ;保留,供DOS填入实际字符数 DB 8 DUP(?) ;用户输入的字符存放区DATA ENDSCODE SEGMENT ASSUME CS:CODE , DS:DATASTART: MOV AX , DATA MOV DS , AX MOV DX , OFFSET BUF MOV AH , 10 INT 21H … … ; 其他操作 MOV AH , 4CH INT 21HCODE END
常用的DOS与 BIOS中断功能调用
62
02H功能——显示字符(一个字符) 调用方法:DL←要显示的字符或其 ASCⅡ代码 AH←02H INT 21H 注:如果字符是控制符,则实际执行相应的功能。 例:在屏幕上显示一个换行符 (0AH)
MOV DL, 0AH
MOV AH, 02
INT 21H ;实际上将光标转到下一行上去。
常用的DOS与 BIOS中断功能调用
63
09H功能——字符串输出显示 调用方法:DX←要显示的字符串首地址 AH←09H(调用号) INT 21H注:预先将字符串存放于DX表示的首地址区域,字符串
必须以“ $”作为结束符
常用的DOS与 BIOS中断功能调用
64
4CH功能——终止当前程序并返回操作系统。 调用方法: MOV AH, 4CH INT 21H
常用的DOS与 BIOS中断功能调用
65
例:编一段程序先提示用户输入一个字符串,然后读取用户的输入,并将用户输入的数据在下行输出。程序如下:DATA SEGMENTMESSAGE DB ‘PLEASE INPUT A STRING: $’ ; 定义输入提示BUF DB 10 , ? , 10 DUP(? ) DATA ENDS
MOV DX , OFFSET MESSAGE MOV AH , 9 INT 21H ; 显示输入提示信息
CODE SEGMENT ASSUME CS: CODE , DS: DATASTART: MOV AX , DATA MOV DS , AX
DOS 功能调用举例
66
MOV DX , OFFSET BUFMOV AH , 10INT 21H ;接收用户输入
MOV AH , 4CHINT 21HCODE ENDSEND START
MOV DX , OFFSET BUF+2 ;用户实际输入字符起始处→DXMOV AH , 9INT 21H ;显示用户输入的字符
MOV BL , BUF+1 ;用户实际输入字符数→ BLMOV BH , 0 ;将 BX高 8 位清 0 ,使 BX=用户实际输入字符数MOV BYTE PTR BUF+2[BX],'$’;在用户输入的字符结束处放置一个“ $”
MOV AH , 2MOV DL , 0AH ;0AH为换行符 ASCII码INT 21H ; 屏幕换行
DOS 功能调用举例
67
3.3.1 概述程序:是完成特定功能的一组指令的有序集合一、程序设计的步骤
分析课题确定算法画流程图编写程序上机调试、修改
二、程序的基本结构
顺序结构、分支结构、循环结构和子程序结构。
汇编语言程序设计基础
68
3.3.2 顺序程序设计 程序有 3 种基本结构,即顺序结构、分支结构和循环结构。任何复杂的程序都是由基本结构组成的。顺序程序是最简单程序设计。
特点:这种程序不使用分支、循环结构,程序按顺序执行,只能完成相对简单的操作。
硬件支持是 IP 自动加 1 ,从内存取出一个指令字节, IP 自动加 1 。
顺序程序设计
69
例 3-17 查表求平方值例 3-17 查表求平方值
程序分析:
( 1 )在内存中建平方表 TABL;在 XX单元放置0~15的数;在 YY单元预留存储平方值的单元。
( 2 )计算表启始地址的偏移量
( 3 )计算所查数值在表中的偏移地址,从该地址取出单元的内容送 YY单元。
70
DATA SEGMENTTABL DB 0,1,4,9,16,25,36,49,64,81
DB 100,121,144,169,196,225XX DB X ; X 为 0~15 的正整数YY DB ?DATA ENDSSTACK SEGMENT PARA STACK’STACK’
DB 50 DUP(?)STACK ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK
顺序程序设计举例顺序程序设计举例
例 3-17 查表求平方值
71
BEGIN : MOV AX,DATAMOV DS,AXMOV BX,OFFSET TABLMOV AH,0MOV AL,XXADD BX,AXMOV AL,[BX]MOV YY,ALMOV AH,4CHINT 21H
CODE ENDSEND BEGIN
顺序程序设计举例顺序程序设计举例
72
例 31 :从键盘输入两个一位数,在屏幕显示它们的积。
程序分析:
( 1 )从键盘上输入两个数,调用 DOS 01 功能。
( 2 )把 AL 中的 ASCII 码转换为数值。
( 3 )两数相乘,把积用 ASCII 码表示。 ( 除 10 )
( 4 )把积显示在屏幕上,调用 02 功能。
顺序程序设计举例顺序程序设计举例
73
CODE SEGMENT
ASSUME CS : CODE
BEGIN : MOV AH , 1
INT 21H
MOV BL , AL
INT 21H
SUB AL,30H
SUB BL,30H
MUL BL
MOV BL,10
DIV BL
顺序程序设计举例顺序程序设计举例
74
ADD AX,3030H
MOV BX,AXMOV DL,BLMOV AH,02HINT 21HMOV DL,BHINT 21HMOV AH,4CHINT 21H
CODE ENDSEND BEGIN
顺序程序设计举例顺序程序设计举例
75
例 : 字节存储单元DAT中有 2 位数据为 65H,要求将该数据显示到屏幕上。DATA SEGMENTDAT DB 65HDATA ENDSCODE SEGMENT
ASSUME CS: CODE,DS:DATASTART: MOV AX,DATA
MOV DS,AX MOV DL,DAT MOV BL,DL ;暂存至 AL寄存器 MOV CL,4 SHR DL,CL ADD DL,30H ;高位十六进制数据‘ 6’转换为
ASCII码 MOV AH,02H INT 21H ;显示 MOV DL,BL AND DL,0FH OR DL,30H ;低位十六进制数据‘ 5’转换为
ASCII码 INT 21H ;显示 MOV AH, 4CH INT 21H
CODE ENDS END START
76
1. 分支程序二要素
(1) 判断:运算结果的状态标志 CF, PF, ZF, SF,
OF;
(2) 转移 :主要是条件转移指令 Jcc
单标志位判断…… JC, JZ, JO, JP, JS, JAE等 ;
多标志位判断…… JA, JG, JGE等。
3.3.3 分支结构程序
分支结构程序分支结构程序
77
分支结构程序分支结构程序
2. 采用比较指令和转移指令实现分支
CMP Dest, src; Dest-src
Jcc 标号
78
例:在字节存储单元 X 、 Y 中各有一个无符号数。根据这两个无符号数的大小,在屏幕显示 X≥Y 或 X < Y 。
分析:用 CMP 指令比较两个无符号数大小,根据其对标志位的影响用无符号条件转移指令实现转移。1 、比大小: X→AL ,比较 AL 与 Y 的大小。2 、调用 02 功能显示比较结果。
分支结构程序举例分支结构程序举例
79
DATA SEGMENT
X DB 98H
Y DB 0A0H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV AL,X
CMP Y,AL ;比较JA YGX ;Y 大于 X则转 YGEX
MOV AL,'≥'
JMP DISP
分支结构程序举例分支结构程序举例
80
YGX : MOVAL,' < 'DISP : MOV DL,'X' ;显示比较结果
MOV AH,2 INT 21HMOV DL,ALINT 21HMOV DL,'Y'INT 21HMOV AH,4CHINT 21H
CODE ENDS END START
分支结构程序举例分支结构程序举例
81
例 3-20 :数据块传送程序
程序分析:( 1 )用字符串传送指令MOVSB实现数据块传送。 目的串偏移地址送DI,源串偏移地址送 SI。( 2 )如何判断源数据块与目的数据块是否有交叠: 两数据块不交叠的条件是: 源数据块末地址 < 目的数据块首地址 不重叠DF置 0 ,重叠从末地址开始传送DF置 1
分支结构程序举例分支结构程序举例
82
DATA SEGMENTSTRG DB 1000 DUP (?)STG1 EQU STRG+7STG2 EQU STRG+25STRSE EQU 50DATA ENDSSTACK SEGMENT PARA STACK ‘STACK’STARN DB 100 DUP (?)STACK ENDS
例 3-20 :数据块传送程序
分支结构程序举例分支结构程序举例
83
COSEG SEGMENT
ASSUME CS:COSEG, DS:DATA,ES:DATA , SS:STACK
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV CX,STRSE
MOV SI,OFFSET STG1
MOV DI,OFFSET STG2
CLDPUSH SIADD SI,STRSE - 1
分支结构程序举例分支结构程序举例
84
CMP SI,DIPOP SIJB OKSTD ; 减量方式传送
ADD DI,STRSE - 1 ; 指向数据块底部ADD SI,STRSE - 1
OK: REP MOVSB ; 重复传送 50个数据MOV AH,4CHINT 21H
CODE ENDSEND BEGIN
分支结构程序举例分支结构程序举例
85
在内存中连续存放的一系列跳转地址、跳转指令或关键字组成一个决定程序分支的跳转表。
主要问题是计算表地址
表地址 = 表基地址 + 偏移量
3 、利用跳转表实现分支
分支结构程序举例分支结构程序举例
86
例 3-21 :某工厂有 8 种产品的加工程序 R0~R7, 分别放在以 SBR0 、 SBR1…
SBR7 为首地址的内存区域中 ,8 个地址的偏移地址放在以 BASE 为首地址的跳转表内。
跳转地址组成的跳转表:
分支结构程序举例分支结构程序举例
87
DATA SEGMENT
BASE DW SBR0, SBR1, SBR2, SBR3
DW SBR4, SBR5, SBR6, SBR7
BN DB X ;X 为 0~7 之间的正整数DATA ENDS
COSEG SEGMENT
ASSUME CS:COSEG, DS:DATA
MOV AX,DATA
MOV DS,AX
MOV AL,BN
分支结构程序举例分支结构程序举例
88
MOV AH,0
ADD AL,AL
MOV BX,OFFSET BASE
ADD BX,AX
MOV AX,[BX]
JMP AX
MOV AL,4CH
INT 21H
CODEG ENDS
END BEGIN
分支结构程序举例分支结构程序举例
89
3.3.4 循环结构程序
在进行程序设计时,会出现某段程序反复多次执行的情况,则可用循环程序结构来实现。采用循环程序结构不仅使程序变得简洁清晰,而且减少程序对内存的占用。
1 、循环程序的结构 循环程序一般由 4部分构成:
循环结构程序循环结构程序
90
( 1 )初始化部分 为循环程序作准备工作,如置循环次数、地址指针或关键字,寄存器置初值及标志位设置等。( 2 ) 循环工作部分 是循环结构的主体。
( 3 ) 参数调整部分 地址指针或循环次数的修改等,以便继续循环。( 4 )循环控制部分 循环条件的检查,以判断是否继续循环。
循环结构程序循环结构程序
91
(a) 先工作后判断循环条件 (b) 先判断循环条件后工作
循环结构程序循环结构程序
2 、循环程序结构
92
DATA SEGMENT
TABLE DW a1, a2, a3, a4, a5, a6,a7, a8, a9, a10
DW a11, a21,……………………..a20
…….
DW a91,a92,…………………… a100
YY DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS : CODE , DS : DATA
MOV AX , DATA
MOV DS , AX
3 、循环程序举例
100
1i
ai i=1 , 2 ,…, 100例 3-23 计算 Y=
循环结构程序循环结构程序
93
MOV AX , 0
MOV BX , OFFSET TABL
MOV CX , 100
LOP : ADD AX , [BX]
INC BX
INC BX
DEC CX
JNZ LOP
MOV YY ,AX
MOV AH ,4CH
INT 21H
CODE DEGMENT
END BEGIN
循环结构程序循环结构程序
94
例 3-4 统计数组中负元素的个数分析:( 1 )在数据段中放入若干个带符号数,并计算个数。( 2 )设计一个计数器( 2 )从数据段中取数并判断是否负数,若是计数器加 1 。 设计成循环程序。 初始化:计数器清 0 ,用 OFFSET取偏移地址,置循 环次数。 与 0 相比,用带符号跳转指令 JGE判正负,满足条 件,计数器加 1 ,修改参数。否则直接修改参数 。
循环结构程序循环结构程序
95
数据块的定义如下:DATA SEGMENTD1 DB -1,-3,5,6,-9 ; 定义数组COUNT EQU $ -D1RS DW ? ; 存放负数个数DATA ENDS
循环结构程序循环结构程序
96
代码段程序为:CODESEGMENT
ASSUME CS:CODE, DS:DATA
MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET D1 ; 建立数据指针 MOV CX, COUNT ; 设置计数器初值
MOV DX,0 ; 设置结果初值
循环结构程序循环结构程序
97
LOP1: MOV AL,[BX]
CMP AL,0
JGE JUS
INC DX
JUS: INC BX
DEC CX
JNZ LOP1 ; 或 LOOP LOP1
MOV RS,DX
MOV AH,4CH
INT 21H
CODE SEGMENT
END BEGIN
98
MOV CX , 0
LOP : AND AX , AX
JZ STP
SAL AX , 1
JNC LOP
INC CX
JMP LOP
STP : HLT
这是一个 ” 先判断后执行 “的结构。
例 3-25 统计寄存器 AX 中‘ 1’ 的个数
循环结构程序循环结构程序
99
3.3.5 子程序定义及结构一、概述1 、子程序结构( 1 )结构:子程序的第一条语句前有过程名——入口地址的符 号表示出口是返回指令 RET。 ( 2 )调用与返回:主程序用 CALL指令调用子程序,子程序
用 RET指令返回主程序( 3 )子程序文件:子程序说明与子程序清单。
子程序定义及结构
100
子程序说明:
①功能描述:包括子程序名称、功能以及性能指标 ( 如执行时间 ) 等;
②所用寄存器和存储单元;
③子程序的入口、出口参数;
④子程序中又调用的其它子程序;
⑤调用实例 ( 可无 ) 。
子程序定义及结构
101
主程序与子程序的连接
寄存器和工作单元中内容的保护,即保护现场,用PUSH 指令和 POP 指令,可以安排在子程序中,也可以安排在主程序中。通常安排在子程序中。
参数的传递,即主程序如何把入口参数带入子程序,子程序又如何把出口参数带回主程序。
子程序应用中应注意的问题:
子程序定义及结构
102
主程序名为MAIN,子程序名为 SUM。采用堆栈传递参数 ,即主程序把参数压入栈,子程序出栈。
( 1 )在存储器中开辟一个 20个字的堆栈段,并计算栈顶偏移地址:
STACK SEGMENT PARA STACK
SPAE DW 20 DUP(?)
TOP EQU LENGTH SPAE
STACK ENDS
例 3-28 求数组之和
子程序定义及结构
103
DATA SEGMENT
ARY1 DB 100 DUP(?)
SUM1 DW ?
ARY2 DB 150 DUP(?)
SUM2 DW ?
COUNT1 EQU SUM1-ARY1
COUNT2 EQU SUM2-ARY2
DATA ENDS
( 2 )在内存数据段中放置两个数组 ARY1 , ARY2 ,预留求和单元并计算数组的长度。
子程序定义及结构
104
定义代码段:MAIN SEGMENT
ASSUME CS: MAIN, DS: DATA, SS: STACK MOV AX,DATA MOV DS,AX
传递参数调用子程序: MOV AX,SIZE ARY1 PUSH AX MOV AX,OFFSET ARY1 PUSH AX CALL SUM
( 3 )数据求和主程序
子程序定义及结构
105
MOV AX,SIZE ARY2
PUSH AX
MOV AX,OFFSET ARY2
PUSH AX
CALL SUM
HLT
MAIN ENDS
END STR
子程序定义及结构
106
求数组之和求数组之和
定义子程序代码段并保护现场:PROCE SEGMENT
ASSUME CS:PROCE,DS:DATA,SS:STACK
SUM PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH BP
PUSHF
MOV BP,SP
( 4 )求和子程序
子程序定义及结构
107
通过堆栈传递数组的个数和偏移地址:MOV CX, [BP+16]
MOV BX, [BP+14]
数组求和:MOV AX,0
ADN: ADD AL,[BX]
INC BX
ADC AH,0
LOOP ANDMOV [BX],AX
子程序定义及结构
108
恢复现场返回主程序:POPFPOP BPPOP CXPOP BXPOP AXRET
SUM ENDPRPOCE ENDS
子程序定义及结构
109
汇编语言程序举例 汇编语言程序举例
3.2.6 汇编语言程序举例例 3-30 将 ASCII码表示的两位十进制数转换成一字节二进
制数。( 37H, 39H)分析: 39H 是个位,用减法指令 SUB 减 30 即可得。
37H 是十位, 70=7X ( 23+2 )可得。
把所得的十位和个位数相加即可。
110
DATA SEGMENT
ASDEC DB 37H , 39H
BIN DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS : CODE , DS : DATA
START : MOV AX , DATA
MOV DS , AX
( 1 )定义数据段和代码段:
汇编语言程序举例 汇编语言程序举例
111
MOV SI , OFFSET ASDEC
MOV AL , [SI] ;取第一个数(十位数)SUB AL , 30H ;十进制数← ASCII
SAL AL , 1 ;乘 2
MOV BL , AL ; BL=7X2
MOV CL , 2
SAL AL , CL ; 7X23
ADD BL , AL ; 7X2+7X23=70
( 2 )取第一个数并转为 2 进制数
方法: 37H→07H →70=7X ( 23+2 ) + ( 39H →09H )
汇编语言程序举例 汇编语言程序举例
112
INC SI MOV AL , [SI] ;取第二个数(个位数) SUB AL , 30H ;二进制数← ASC
ADD AL , BL ;十位数 + 个位数 MOV BIN , AL ;存入 BIN
MOV AH , 4CH
INT 21H
CODE ENDS
END START
( 3 )取第二个数, ASCII→ 二进制数,两数相加。
汇编语言程序举例 汇编语言程序举例
113
算法:二进制→十进制→ ASCII。
二进制→十进制:
二进制数反复减 100,够减计数器加 1 ,直到不够减为止。计数器中的数就是 100的个数,即百位数。
十位数相同。
最后一次的结果(差)为负,要加 10以恢复原值,这就是 个位数 。 然 后 将 这 三 个 数 (百、十、 个 ) 转换成ASCII码。
例 3-32 将一字节二进制数转换成三位 ASCII 码表示的十进制数。
汇编语言程序举例 汇编语言程序举例
114
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
( 1 )定义数据段,把需转换的数放入内存 BIN 单元DATA SEGMENT
BIN DB 01111111B
ASDEC DB 3 DUP (?)
DATA ENDS
( 2 )、定义代码段,并初始化
汇编语言程序举例 汇编语言程序举例
115
MOV DI,OFFSET ASDEC
MOV AL,BIN
( 3 )取需转换的数送 AL 中
( 4 )求二进制数所含十进制数百位数的个数
MOV BL,0
AGAIN1: SUB AL,100
JB NEXT1
INC BL
JMP AGAIN1
NEXT1: ADD AL,100
汇编语言程序举例 汇编语言程序举例
116
MOV AH , 0
AGAIN2: SUB AL,10
JB NEXT
INC AH
JMP AGAIN2
NEXT: ADD AL,10
( 4 )求十位数的个数
( 5 )把百、十、个位数转换为 ASCII 码ADD BL,30H
ADD AH,30H
ADD AL,30H
汇编语言程序举例 汇编语言程序举例
117
MOV [DI],BLINC DIMOV [DI],AHINC DIMOV [DI],AL
( 6 )把转换好的 ASCII 码送存储器中
MOV AH,4CH
INT 21H
CODE ENDS
END START
( 7 )程序结束
汇编语言程序举例 汇编语言程序举例
118
有一个若干个字节的数据表,存放在数据段中,首地址为 TAB,表内各数已按升序排列好。今给定一关键字,试编程从表内查找该关键字,若有,则结束;若无,将该关键字顺序插入表中,并修改表长(表长在 LTH中)。算法:
将给定关键字依次同数据表中的数据比较,若大于表中的数据,则继续同下一个数据比较,若小于表中数据,则先将从该数据开始的数据全部下移一个地址,然后将关键字插入表中空格,并将表长数加 1 。
例 3-36 查找例 3-36 查找
汇编语言程序举例 汇编语言程序举例
119
( 1 )在数据段中放置数据表及需查找的数据并计算表长DATA SEGMENT TAB DB 0FH , 12H , 14H ,… TEM DB 57H LTH EQU TEM-TAB DATA ENDS
( 2 )定义代码段并初始化
CODE SEGMENT ASSUME CS:CODE , DS:DATA , ES:DATA START : MOV AX,DATA MOV DS,AX MOV ES,AX
汇编语言程序举例 汇编语言程序举例
120
( 3 )循环初始化(取偏移地址、次数,取需查找的字)MOV BX , OFFSET TAB
MOV CX , LTHMOV AL , TEM
( 4 )用循环程序实现查找关键字
LOP : CMP AL , [BX] JE SOP JL INST INC BX LOOP LOP
JMP JUST
汇编语言程序举例 汇编语言程序举例
121
( 4 )把关键字插入表中(插入位置后的数据依次后移)INST : MOV DI , OFFSET TAB STD
ADD DI , LTH MOV SI , DI DEC SI REP MOVSB
( 5 )把关键字按顺序插入数据表中并修改表长JUST : MOV [BX] , AL
INC LTH
( 6 )程序结束SOP : MOV AH , 4CH INT 21HCODE ENDS END START
汇编语言程序举例 汇编语言程序举例
122
汇编语言程序举例 汇编语言程序举例
123
www.1ppt.com