第三章: 8086 汇编语言程序设计

123
1 主主主主 主主主 主主主8086 主主主主主主主主

description

第三章: 8086 汇编语言程序设计. 主讲教师:范新民. 1. 2. 3.2.1 汇编语言源程序的格式. 3.2.2 常量、标识符和表达式. 3.2.3 指示性语句. 3. 4. 3.2.4 指令性语句. 5. 3.2.5 宏指令. 8086 汇编语言程序设计. 8086 汇编语言程序设计. 3.2.1 汇编语言源程序的格式. 一、基本概念. 1 、机器语言、汇编语言和高级语言. 机器语言:用 0 、 1 代码表示的机器指令形式,是机器硬件 唯一能识别和执行的语言。 - PowerPoint PPT Presentation

Transcript of 第三章: 8086 汇编语言程序设计

Page 1: 第三章: 8086 汇编语言程序设计

1

主讲教师:范新民

第三章: 8086汇编语言程序设计第三章: 8086汇编语言程序设计

Page 2: 第三章: 8086 汇编语言程序设计

2

3.2.1 汇编语言源程序的格式1

3.2.2 常量、标识符和表达式2

3.2.3 指示性语句3

8086汇编语言程序设计8086汇编语言程序设计

3.2.4 指令性语句4

3.2.5 宏指令5

Page 3: 第三章: 8086 汇编语言程序设计

3

8086汇编语言程序设计8086汇编语言程序设计

3.2.1 汇编语言源程序的格式一、基本概念

1 、机器语言、汇编语言和高级语言

机器语言:用 0 、 1 代码表示的机器指令形式,是机器硬件 唯一能识别和执行的语言。 例:机器指令 0100 0000   ; 表示( AX )+ 1→AX汇编语言 :用符号表示指令的操作码、操作数。又称符号 语言。 例: INC AX ;增 1 指令

Page 4: 第三章: 8086 汇编语言程序设计

4

汇编语言和机器语言都是面向机器的语言,即不同的机器有不同的指令系统。机器指令与机器代码是一一对应的。

汇编语言机器语言均属于低级语言。

高级语言: 接近人的自然语言和数学表达式。用高级语言编写的程序是脱离机器的、面向过程或面向对象的语言。如:C 语言, Java 语言等。

汇编语言源程序的格式

Page 5: 第三章: 8086 汇编语言程序设计

5

2 、汇编语言的特点代码长度短,执行速度最快可直接有效的控制机器的运行准确掌握机器运行时间可最有效的利用 CPU 、内存、 I/O 资源

直接控制机器运行的场合 汇编语言常用于: 需要准确控制运行时间的场合 运行速度要求很高的场合

汇编语言源程序的格式

Page 6: 第三章: 8086 汇编语言程序设计

6

汇编语言源程序的格式

3 、语句的类别与结构分段结构:最多可由 4 种段组成:代码段、数据段、堆栈段、附加段。语句类别:

( 1 )指令语句: 由汇编程序汇编成相应的能被 CPU 直接识别并执行的目的码,或称机器代码。

( 2 )宏指令语句: 允许用户为多次重复使用的程序段命名的一个名字。即将一个程序段定义为一宏指令。

Page 7: 第三章: 8086 汇编语言程序设计

7

第三章:汇编语言程序设计

( 3 )伪指令语句: 伪指令语句是一种指示性语句,这类语句向汇编程序提供汇编过程要求的一些辅助信息,如给变量分配内存单元地址、定义各种符号、实现分段等。

伪指令与指令性语句的区别:伪指令语句经汇编后不产生任何机器代码,而指令性语句经汇编后会产生相应的机器代码;伪指令语句所指示的操作是在程序汇编时就完成了的,而指令性语句的操作必须在程序运行时才能完成。

Page 8: 第三章: 8086 汇编语言程序设计

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

汇编语言源程序的格式

Page 9: 第三章: 8086 汇编语言程序设计

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

汇编语言源程序的格式

Page 10: 第三章: 8086 汇编语言程序设计

10

二、指令性语句[ 标号: ] 操作码 [ 操作数 ] [; 注释项 ]

操作码:指明操作的性质,说明计算机要执行的具体指明操作的性质,说明计算机要执行的具体操 作。用助记符表示。操作数:操作数:指明指令执行过程中所需的数据。可有指明指令执行过程中所需的数据。可有 00 个、个、 11

个个 或者多个表达式组成,并由它提供执行指定操作或者多个表达式组成,并由它提供执行指定操作 所需要的操作数或地址。所需要的操作数或地址。注释项:必须以分号开头,主要用来说明程序或重要语句 的功能。

汇编语言源程序的格式

Page 11: 第三章: 8086 汇编语言程序设计

11

标号:对应的标识符后面必须跟有冒号,标号在汇编以 后分配有地址。标号又称为符号地址,可作为转 移指令或子程序调用的目标地址。

汇编语言源程序的格式

Page 12: 第三章: 8086 汇编语言程序设计

12

汇编语言源程序的格式

三、指示性语句 指示性语句是主要由命令构成的语句,用来指示汇编程序进行汇编操作。格式:

[ 名字 / 变量 ] 命令 参数       [; 注释项 ]

命令:指示汇编程序进行某种汇编操作参数:汇编操作有关的数据

Page 13: 第三章: 8086 汇编语言程序设计

13

汇编语言源程序的格式

3.2.2  常量、标识符和表达式3.2.2  常量、标识符和表达式

1 、常量 :数字常量可以是二进制数、八进制数、十进制数或十六进制数表示。字符常量是用单引号‘ ’括起来的 ASCII 字符其值是该字符的 ASCII 代码值。例: MOV AX,‘A’ ;AX=41H 符号常量是用符号定义的常量。例:采用符号定义语句 PORTA EQU 80H MOV AL , PORTA 与指令 MOV AL , 80H 等价

Page 14: 第三章: 8086 汇编语言程序设计

14

标识符可用作符号常量、名字、变量和标号等。 组成标识符有如下规定:

组成标识符的字符有: 大写字母: A ~ Z ;文小写字母: a ~ z ; 数字 0~ 9 ;字符 ? 、 @ 、 _ 、 $ ;

字符长度不超过 3l个;首字符不能是数字;  ? 不能单独作为一个标识符; 不能把保留字用作标识符,保留字包括助记符、寄存

器名等。

2 、标识符

汇编语言源程序的格式

Page 15: 第三章: 8086 汇编语言程序设计

15

3 、表达式 由常数、变量、标号通过运算符或操作符连接而成的,可分为数值表达式和地址表达式。

汇编语言源程序的格式

数值表达式:由算术运算符、关系运算符和逻辑运算符连接常数组成的有意义的式子,它的运算结果是数值常数,只有大小,没有属性。

地址表达式:由变量、标号、常数、寄存器(BP 、 BX 、 SI 、 DI) 的内容和操作符组成的有意义的式子,它的运算结果不是一个普通的数值,总是和存储器地址相联系。如各种存储器寻址方式的汇编表示都属于简单的地址表达式

Page 16: 第三章: 8086 汇编语言程序设计

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

表达式中的运算符:

Page 17: 第三章: 8086 汇编语言程序设计

17

汇编语言源程序的格式

3.2.3 指示性语句( 5条)

程序开始和结束语句段定义语句过程定义语句数据定义语句符号定义语句

Page 18: 第三章: 8086 汇编语言程序设计

18

( 1 )给程序模块命名 NAME 命令 格式: NAME   名字 名字是程序员按标识符规定所取的程序模块名。( 2 )标题命名语句 TITLE 命令 格式: TITLE  名字

名字作为每页标题打印出来,标题名字符不大于 60个( 3 )程序结束 END命令

格式: END  [ 标号 ]    标号指示程序开始执行的起始地址的标号。

1 、程序开始和结束语句

汇编语言源程序的格式

Page 19: 第三章: 8086 汇编语言程序设计

19

说明:如果程序中没有 NAME 伪指令,可使用 TITLE 伪指令。程序中既无 NAME也无 TITLE 伪指令,汇编程序将用源程序名作为模块名。一般情况下使用 TITLE 伪指令,可在列表文件中能打印出来END 伪指令中,如果程序中第一句指令性语句有标号,则 END 语句的标号应与其相同否则可无标号。

汇编语言源程序的格式

Page 20: 第三章: 8086 汇编语言程序设计

20

2 、段定义伪指令

存储器的物理地址是由段地址和偏移地址组合而成的,而存储器又可以为多个段,汇编程序是按段来组织程序和使用存储器,在把源程序转换为目标程序时,必须确定标号和变量的偏移地址,并且需要把有关信息通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起形成一个可执行程序。为此,需要用到段定义伪指令。

汇编语言源程序的格式

Page 21: 第三章: 8086 汇编语言程序设计

21

( 1 )段定义伪指令 SEGMENT

格式: 段名 SEGMENT [ 定位类型 ] [ 组合类型 ][‘ 类别’ ]

段名 ENDS

段名由程序员定义,汇编时由系统为该段分配一个段基值。参数用来设定该段在内存中的位置和在汇编、连接时,当该段与其它段组合在一起时该段同其它段的连接关系。

汇编语言源程序的格式

Page 22: 第三章: 8086 汇编语言程序设计

22

一般情况下,定位类型、组合类型和类别说明可以不用。

注意: SEGMENT和 ENDS语句必须成对使用。

例:定义一数据段 DATA    DATA SEGMENT         A  DB  '1234'       B  DW   12H    DATA  ENDS

汇编语言源程序的格式

Page 23: 第三章: 8086 汇编语言程序设计

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

$$ -表示汇编地址计数器的当前值

汇编语言源程序的格式

Page 24: 第三章: 8086 汇编语言程序设计

24

( 3 )指定段址伪指令格式:   ASSUME  段寄存器:段名 [ ,段寄存器:段名, ...]

功能:指明段和段寄存储器的对应关系,且段名必须是 由 SEGMENT定义的段名。说明:

ASSUME伪指令只是指明段和段寄存器的对应关系,并没有把段地址装入段寄存器中。但是,代码段段寄存器 CS的值是由系统负责设置的。ASSUME指令必须跟在 SEGMENT语句之后。

汇编语言源程序的格式

Page 25: 第三章: 8086 汇编语言程序设计

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                    

汇编语言源程序的格式

Page 26: 第三章: 8086 汇编语言程序设计

26

3. 过程定义伪指令格式为:过程名 PROC  [NEAR/FAR]        …        RET 过程名 ENDP功能:过程定义伪指令用于定义子程序。段内调用使用      NEAR属性,段间调用使用 FAR属性。省略为NEAR

汇编语言源程序的格式

Page 27: 第三章: 8086 汇编语言程序设计

27

CODE  SEGMENTCOUNT PROC NEAR      ADD CX, 1      RETCOUNT ENDPSTART:MOV  AX, 100       ┊       CALL COUNT       ┊       CALL COUNT       ┊       HLTCODE   ENDS        END  START

COUNT PROCE

     RET

子程序:

汇编语言源程序的格式

Page 28: 第三章: 8086 汇编语言程序设计

28

4. 数据定义伪指令格式: [ 变量名 ]  数据定义伪指令 操作数项表功能:定义数据存储区,其类型由伪指令指定。数据定义伪指令常用的有以下五种:

[ 变量名 ] DB 操作数项表;定义字节[ 变量名 ] DW 操作数项表;定义字[ 变量名 ] DD 操作数项表;定义双字[ 变量名 ] DQ 操作数项表;定义 8 个字节[ 变量名 ] DT 操作数项表;定义 10 个字节

操作数项表可以是常数或表达式、字符串、?和带DUP的表达式。

汇编语言源程序的格式

Page 29: 第三章: 8086 汇编语言程序设计

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

汇编语言源程序的格式

Page 30: 第三章: 8086 汇编语言程序设计

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:

汇编语言源程序的格式

Page 31: 第三章: 8086 汇编语言程序设计

31

③ ③  用?号预留内存单元用?号预留内存单元例例 : SUB1: SUB1 DBDB ? ;? ;预留一个字节单元预留一个字节单元 RESURESU DWDW ? ? ;;预留二个字节单元预留二个字节单元

?SUB1:

RESU:

汇编语言源程序的格式

Page 32: 第三章: 8086 汇编语言程序设计

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 。

重复次数重复次数 重复装入的内容重复装入的内容

?、数值、 ?、数值、 数值表达式 数值表达式 字符等 字符等

汇编语言源程序的格式

Page 33: 第三章: 8086 汇编语言程序设计

33

汇编语言源程序的格式

5 、符号定义语句( 1 ) EQU——赋值伪指令格式:变量名 EQU   表达式功能:将右边表达式的值赋给左边的变量。表达式可以是 常数、变量、标号、指令助记符、数值表达式、地 址表达式。

例: PORT1 EQU 100 ;符号 PORT1代表常数100    CONT  EQU CX  ;为 CX重新命名 ABDR  EQU PORT1+1    ABC   EQU DAA注:同一程序中,不能重复定义

Page 34: 第三章: 8086 汇编语言程序设计

34

( 2 )=——等号伪指令格式:符号名 = 表达式功能:与 EQU基本相同,两者的区别在于“=”伪指令可对 同一标识符作重新定义。例: EMP = 12 ;定义 EMP 等于 12

EMP = EMP+1

       可以对同一个符号名重复定义。

汇编语言源程序的格式

Page 35: 第三章: 8086 汇编语言程序设计

35

( 3 ) PURGE 命令 格式 : PUREG 名字 功能:用来撤消已定义的符号常量。可同时撤消几个己 定义的名字 例 3-10 : COUNT EQU 20

┇MOV AL,COUNT

┇PURGE COUNTCOUNT EQU 10MOV BL,COUNT

汇编语言源程序的格式

Page 36: 第三章: 8086 汇编语言程序设计

36

( 1 )名字 名字包括文件名、标题名、段名、过程名和符号常量名等,

是程序员在编程中按标识符规定命名的,目的是方便编程和读程。段命

在段定义语句中命名取定,定义后的段名可以作为段基值来使用,用来对段寄存器赋值。

例: MOV AX , DATA

MOV DS , AX

6 、名字与变量

汇编语言源程序的格式

Page 37: 第三章: 8086 汇编语言程序设计

37

过程名

在过程定义语句中定义,指向过程中第一条指令所在的内存单元的地址(入口地址),有 NEAR 和 FAR之分。 符号常量

由符号定义语句 EQU 、 = 来定义,对符号常量给以赋值。

例 3-13

汇编语言源程序的格式

Page 38: 第三章: 8086 汇编语言程序设计

38

( 2 )变量 变量的定义和属性 变量由数据定义语句 DB/DW/DD/DQ/DT来定义

变量有三属性:段属性、偏移属性和类型属性: 段属性表示变量所在段的起始地址。偏移属性表示变量在段内的偏移地址。用 16位无符号表示偏移地址。类型属性表示该变量能存放的数据长度。长度为 1B

的变量,类型为 BYTE ,长度为 2B 的变量,类型为 WORD 等。

汇编语言源程序的格式

Page 39: 第三章: 8086 汇编语言程序设计

39

分析运算符( 5 个)  用于把变量的三个属性分别取出来作为操作数。

① OFFSET——取偏移地址操作符格式: OFFSET 变量或标号功能:返回该变量或标号在其段内的偏移地址。例:MOV  SI,OFFSET  BUF

将 BUF在数据段内的偏移地址作为立即数送到 SI中。

汇编语言源程序的格式

Page 40: 第三章: 8086 汇编语言程序设计

40

②SEG——取段址操作符。格式: SEG 变量或标号功能:返回变量或标号所在段的段基址。 例: MOV  AX, SEG  BUF

汇编语言源程序的格式

Page 41: 第三章: 8086 汇编语言程序设计

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 。

汇编语言源程序的格式

Page 42: 第三章: 8086 汇编语言程序设计

42

④取变量所含的数据存储单元个数操作符 LENGTH

格式: LENGTH  变量功能:只对变量起作用,取值根据定义该变量时数据定义 伪指令后面第一个表达式的形式而定。如为重复子 句“ n DUP(表达式 )”,返回外层重复因子 n,其他形

式 的表达式,则返回 1 。 

汇编语言源程序的格式

Page 43: 第三章: 8086 汇编语言程序设计

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

汇编语言源程序的格式

Page 44: 第三章: 8086 汇编语言程序设计

44

⑤取变量所含的数据存储区大小操作符 SIZE

格式: SIZE  变量功能:汇编程序用该操作符返回的值表示该变量所分配的 总字节数。 例: A2  DW  10 DUP(1),1234H

MOV  CX,SIZE  A2 汇编后相当于有指令: MOV  CX,14H

汇编语言源程序的格式

SIZE=LENGTH×TYPE

Page 45: 第三章: 8086 汇编语言程序设计

45

合成运算符① 属性定义操作符 PTR

格式:类型 PTR  地址表达式功能: PTR操作符的作用是将地址表达式的原类型属性临

时修改成 PTR操作符前面所指定的类型。指定的类 型可以是 BYTE、WORD或DWORD。可用来指定内存操作数的类型

例:MOV  BYTE  PTR [SI], 20H    ;占一个字节 或 MOV  WORD  PTR [SI], 20H    ;占两个字节

汇编语言源程序的格式

Page 46: 第三章: 8086 汇编语言程序设计

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

           都是合法的。

汇编语言源程序的格式

Page 47: 第三章: 8086 汇编语言程序设计

47

格式 :   [ 标号: ]  操作码 [ 操作数 ] [,操作数 ] [;注释 ] 一、标号 标号是一条指令在内存中的符号地址。标号一定要用‘:’结束。标号具有三种属性: 段属性:表示标号所在段的段基值

格式: SEG 标号

3.2.4 指令型语句

汇编语言源程序的格式

Page 48: 第三章: 8086 汇编语言程序设计

48

汇编语言源程序的格式

偏移量属性:表示标号所在位置的偏移地址 格式: OFFSET 标号 类型属性:表示标号所在指令是允许段内跳转还是 段间跳转 格式: TYPE 标号当标号的属性为 NEAR 属性时, TYPE=-1 。当标号的属性为 FAR 属性时, TYPE=-2 。

Page 49: 第三章: 8086 汇编语言程序设计

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 、操作数

汇编语言源程序的格式

Page 50: 第三章: 8086 汇编语言程序设计

50

宏定义:格式: 宏指令名 MACRO  [形式参数表 ]                  ┆                   ┆                 ENDM宏调用:格式: 宏指令名 [ 实际参数,… ]

宏指令体

宏指令——源程序中一个能多次可重复使用的具有独立功能 的代码段。

1 、宏指令的定义和使用 宏指令的使用过程有宏定义、宏调用、宏展开。

3.2.5 宏指令

汇编语言源程序的格式

Page 51: 第三章: 8086 汇编语言程序设计

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

汇编语言源程序的格式

Page 52: 第三章: 8086 汇编语言程序设计

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

汇编语言源程序的格式

Page 53: 第三章: 8086 汇编语言程序设计

53

2 、宏指令与子程序(过程)的区别:宏指令调用无返回地址,执行速度略快。通过形参、实参结合传递函数宏指令不能压缩目标代码长度,占用内存较子程大。

汇编语言源程序的格式

Page 54: 第三章: 8086 汇编语言程序设计

54

3.3.1 概述 3.3.2 顺序程序 3.3.3 分支程序  3.3.4 循环程序 3.3.5 子程序 3.3.6 汇编语言程序举例 3.3.7 系统功能调用

3.3 汇编语言程序设计基础

Page 55: 第三章: 8086 汇编语言程序设计

55

3.3.7  常用的DOS与 BIOS中断功能调用

1. DOS中断   DOS除了给用户提供了命令行服务以外,还为汇编

语言程序员提供了大量的子程序,这些子程序包含了从基本输入输出到内存管理、磁盘读写、文件系统等各个方面,使用这些子程序,使得汇编语言程序员不必搞清大量的设备接口、数据结构等细节,即可完成所需功能,简化了汇编语言的编程。由于 DOS提供的这些子程序被看作是DOS系统功能的一部分,因而人们把对这些子程序的调用又称为 DOS功能调用。

一、DOS中断与系统功能调用

Page 56: 第三章: 8086 汇编语言程序设计

56

DOS提供的这些子程序位于DOS的基本系统文件IBMBIO.COM和 IBMDOS.COM中,随着DOS的加载而进入内存,即只要能启动DOS就可以使用。DOS的这些子程序是以中断的方式向系统及应用程序提供服务的,故必须采用软中断指令 INT进行调用。 随着DOS的发展,所提供的功能 ( 子程序 ) 越来越多,不可能每一个子程序都占用一个中断号,于是采用让它们共用一个中断号,即 21H号的办法,进入这一个中断后,DOS再根据应用户程序中子程序编号的设置来确定用户程序到底想调用哪一个子功能。

常用的DOS与 BIOS中断功能调用

Page 57: 第三章: 8086 汇编语言程序设计

57

2. DOS系统功能调用 ( 1 )DOS功能调用的方法

设置入口参数,如果所调用的子程序不需参数,则可省略此步。

欲调用的子程序编号→ AH。 发中断调用指令 INT 21H。

常用的DOS与 BIOS中断功能调用

Page 58: 第三章: 8086 汇编语言程序设计

58

( 2 )DOS基本 I/O功能调用 01 功能——键盘输入 入口参数:无

出口参数:所读取的字符 ASCII码在 AL内。功能:扫描键盘,若有按键按下,将字符 ASCII码放入AL

中,同时在屏幕上显示这个字符,然后返回。若 无键按下,该调用等待直到有键按下为止。例: MOV  AH , 01

     INT  21H

常用的DOS与 BIOS中断功能调用

Page 59: 第三章: 8086 汇编语言程序设计

59

08 功能——键盘输入。入口参数:无

出口参数:所读取的字符 ASCII 码在 AL 内。 功能:同 01号类似,但是不在屏幕上显示输入的字 符,在读取密码时常用本功能。

例: MOV  AH , 08     INT  21H

常用的DOS与 BIOS中断功能调用

Page 60: 第三章: 8086 汇编语言程序设计

60

 10号功能——字符串输入入口参数:DS:DX指向输入缓冲区。输入缓冲区具有如下格式:

第一个字节:指明准备接收的最大字符数,包括回车符。

第二个字节保留,由DOS在功能调用结束后填入实际输入的字符个数 ( 不包括最后的回车符 ) 。

用户输入的字符串从第三个单元开始存放出口参数:用户实际输入字符个数在缓冲区第二个单元中

常用的DOS与 BIOS中断功能调用

Page 61: 第三章: 8086 汇编语言程序设计

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中断功能调用

Page 62: 第三章: 8086 汇编语言程序设计

62

02H功能——显示字符(一个字符) 调用方法:DL←要显示的字符或其 ASCⅡ代码 AH←02H INT  21H 注:如果字符是控制符,则实际执行相应的功能。 例:在屏幕上显示一个换行符 (0AH)

MOV  DL, 0AH

MOV  AH, 02

INT  21H       ;实际上将光标转到下一行上去。

常用的DOS与 BIOS中断功能调用

Page 63: 第三章: 8086 汇编语言程序设计

63

 09H功能——字符串输出显示 调用方法:DX←要显示的字符串首地址 AH←09H(调用号) INT  21H注:预先将字符串存放于DX表示的首地址区域,字符串

必须以“ $”作为结束符

常用的DOS与 BIOS中断功能调用

Page 64: 第三章: 8086 汇编语言程序设计

64

4CH功能——终止当前程序并返回操作系统。 调用方法: MOV AH, 4CH INT  21H

常用的DOS与 BIOS中断功能调用

Page 65: 第三章: 8086 汇编语言程序设计

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 功能调用举例

Page 66: 第三章: 8086 汇编语言程序设计

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 功能调用举例

Page 67: 第三章: 8086 汇编语言程序设计

67

3.3.1 概述程序:是完成特定功能的一组指令的有序集合一、程序设计的步骤

分析课题确定算法画流程图编写程序上机调试、修改

二、程序的基本结构

顺序结构、分支结构、循环结构和子程序结构。

汇编语言程序设计基础

Page 68: 第三章: 8086 汇编语言程序设计

68

3.3.2 顺序程序设计 程序有 3 种基本结构,即顺序结构、分支结构和循环结构。任何复杂的程序都是由基本结构组成的。顺序程序是最简单程序设计。

特点:这种程序不使用分支、循环结构,程序按顺序执行,只能完成相对简单的操作。

硬件支持是 IP 自动加 1 ,从内存取出一个指令字节, IP 自动加 1 。

顺序程序设计

Page 69: 第三章: 8086 汇编语言程序设计

69

例 3-17  查表求平方值例 3-17  查表求平方值

程序分析:

( 1 )在内存中建平方表 TABL;在 XX单元放置0~15的数;在 YY单元预留存储平方值的单元。

( 2 )计算表启始地址的偏移量

( 3 )计算所查数值在表中的偏移地址,从该地址取出单元的内容送 YY单元。

Page 70: 第三章: 8086 汇编语言程序设计

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 查表求平方值

Page 71: 第三章: 8086 汇编语言程序设计

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                                                

                            

顺序程序设计举例顺序程序设计举例

Page 72: 第三章: 8086 汇编语言程序设计

72

例 31 :从键盘输入两个一位数,在屏幕显示它们的积。

程序分析:

( 1 )从键盘上输入两个数,调用 DOS 01 功能。

( 2 )把 AL 中的 ASCII 码转换为数值。

( 3 )两数相乘,把积用 ASCII 码表示。 ( 除 10 )

( 4 )把积显示在屏幕上,调用 02 功能。

顺序程序设计举例顺序程序设计举例

Page 73: 第三章: 8086 汇编语言程序设计

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

顺序程序设计举例顺序程序设计举例

Page 74: 第三章: 8086 汇编语言程序设计

74

ADD AX,3030H

MOV BX,AXMOV DL,BLMOV AH,02HINT 21HMOV DL,BHINT 21HMOV AH,4CHINT 21H

CODE ENDSEND BEGIN

顺序程序设计举例顺序程序设计举例

Page 75: 第三章: 8086 汇编语言程序设计

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

Page 76: 第三章: 8086 汇编语言程序设计

76

1. 分支程序二要素

(1) 判断:运算结果的状态标志 CF, PF, ZF, SF,

OF;

(2) 转移 :主要是条件转移指令 Jcc 

单标志位判断…… JC, JZ, JO, JP, JS, JAE等 ;

多标志位判断…… JA, JG, JGE等。

3.3.3 分支结构程序

分支结构程序分支结构程序

Page 77: 第三章: 8086 汇编语言程序设计

77

分支结构程序分支结构程序

2. 采用比较指令和转移指令实现分支

CMP  Dest, src; Dest-src

    Jcc   标号

Page 78: 第三章: 8086 汇编语言程序设计

78

例:在字节存储单元 X 、 Y 中各有一个无符号数。根据这两个无符号数的大小,在屏幕显示 X≥Y 或 X < Y 。

分析:用 CMP 指令比较两个无符号数大小,根据其对标志位的影响用无符号条件转移指令实现转移。1 、比大小: X→AL ,比较 AL 与 Y 的大小。2 、调用 02 功能显示比较结果。

分支结构程序举例分支结构程序举例

Page 79: 第三章: 8086 汇编语言程序设计

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

分支结构程序举例分支结构程序举例

Page 80: 第三章: 8086 汇编语言程序设计

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

分支结构程序举例分支结构程序举例

Page 81: 第三章: 8086 汇编语言程序设计

81

例 3-20 :数据块传送程序

程序分析:( 1 )用字符串传送指令MOVSB实现数据块传送。        目的串偏移地址送DI,源串偏移地址送 SI。( 2 )如何判断源数据块与目的数据块是否有交叠: 两数据块不交叠的条件是: 源数据块末地址 < 目的数据块首地址 不重叠DF置 0 ,重叠从末地址开始传送DF置 1

分支结构程序举例分支结构程序举例

Page 82: 第三章: 8086 汇编语言程序设计

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 :数据块传送程序

分支结构程序举例分支结构程序举例

Page 83: 第三章: 8086 汇编语言程序设计

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

分支结构程序举例分支结构程序举例

Page 84: 第三章: 8086 汇编语言程序设计

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

分支结构程序举例分支结构程序举例

Page 85: 第三章: 8086 汇编语言程序设计

85

在内存中连续存放的一系列跳转地址、跳转指令或关键字组成一个决定程序分支的跳转表。

主要问题是计算表地址

表地址 = 表基地址 + 偏移量

3 、利用跳转表实现分支

分支结构程序举例分支结构程序举例

Page 86: 第三章: 8086 汇编语言程序设计

86

例 3-21 :某工厂有 8 种产品的加工程序 R0~R7, 分别放在以 SBR0 、 SBR1…

SBR7 为首地址的内存区域中 ,8 个地址的偏移地址放在以 BASE 为首地址的跳转表内。

跳转地址组成的跳转表:

分支结构程序举例分支结构程序举例

Page 87: 第三章: 8086 汇编语言程序设计

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                                                           

分支结构程序举例分支结构程序举例

Page 88: 第三章: 8086 汇编语言程序设计

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                                                       

分支结构程序举例分支结构程序举例

Page 89: 第三章: 8086 汇编语言程序设计

89

3.3.4 循环结构程序

在进行程序设计时,会出现某段程序反复多次执行的情况,则可用循环程序结构来实现。采用循环程序结构不仅使程序变得简洁清晰,而且减少程序对内存的占用。

1 、循环程序的结构 循环程序一般由 4部分构成:

循环结构程序循环结构程序

Page 90: 第三章: 8086 汇编语言程序设计

90

( 1 )初始化部分 为循环程序作准备工作,如置循环次数、地址指针或关键字,寄存器置初值及标志位设置等。( 2 ) 循环工作部分 是循环结构的主体。

( 3 ) 参数调整部分 地址指针或循环次数的修改等,以便继续循环。( 4 )循环控制部分 循环条件的检查,以判断是否继续循环。

循环结构程序循环结构程序

Page 91: 第三章: 8086 汇编语言程序设计

91

(a) 先工作后判断循环条件 (b) 先判断循环条件后工作

循环结构程序循环结构程序

2 、循环程序结构

Page 92: 第三章: 8086 汇编语言程序设计

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=

循环结构程序循环结构程序

Page 93: 第三章: 8086 汇编语言程序设计

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

循环结构程序循环结构程序

Page 94: 第三章: 8086 汇编语言程序设计

94

例 3-4 统计数组中负元素的个数分析:( 1 )在数据段中放入若干个带符号数,并计算个数。( 2 )设计一个计数器( 2 )从数据段中取数并判断是否负数,若是计数器加 1 。 设计成循环程序。         初始化:计数器清 0 ,用 OFFSET取偏移地址,置循 环次数。 与 0 相比,用带符号跳转指令 JGE判正负,满足条 件,计数器加 1 ,修改参数。否则直接修改参数 。

循环结构程序循环结构程序

Page 95: 第三章: 8086 汇编语言程序设计

95

数据块的定义如下:DATA SEGMENTD1 DB  -1,-3,5,6,-9 ; 定义数组COUNT EQU  $ -D1RS DW ? ; 存放负数个数DATA  ENDS

                                             

循环结构程序循环结构程序

Page 96: 第三章: 8086 汇编语言程序设计

96

代码段程序为:CODESEGMENT

ASSUME CS:CODE, DS:DATA

MOV AX,DATA

MOV DS,AX

MOV BX,OFFSET D1 ; 建立数据指针 MOV CX, COUNT ; 设置计数器初值

MOV DX,0 ; 设置结果初值

循环结构程序循环结构程序

Page 97: 第三章: 8086 汇编语言程序设计

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

Page 98: 第三章: 8086 汇编语言程序设计

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’ 的个数

循环结构程序循环结构程序

Page 99: 第三章: 8086 汇编语言程序设计

99

3.3.5  子程序定义及结构一、概述1 、子程序结构( 1 )结构:子程序的第一条语句前有过程名——入口地址的符 号表示出口是返回指令 RET。 ( 2 )调用与返回:主程序用 CALL指令调用子程序,子程序

用        RET指令返回主程序( 3 )子程序文件:子程序说明与子程序清单。

子程序定义及结构

Page 100: 第三章: 8086 汇编语言程序设计

100

子程序说明:

①功能描述:包括子程序名称、功能以及性能指标 ( 如执行时间 ) 等;

②所用寄存器和存储单元;

③子程序的入口、出口参数;

④子程序中又调用的其它子程序;

⑤调用实例 ( 可无 ) 。

子程序定义及结构

Page 101: 第三章: 8086 汇编语言程序设计

101

主程序与子程序的连接

寄存器和工作单元中内容的保护,即保护现场,用PUSH 指令和 POP 指令,可以安排在子程序中,也可以安排在主程序中。通常安排在子程序中。

参数的传递,即主程序如何把入口参数带入子程序,子程序又如何把出口参数带回主程序。

子程序应用中应注意的问题:

子程序定义及结构

Page 102: 第三章: 8086 汇编语言程序设计

102

主程序名为MAIN,子程序名为 SUM。采用堆栈传递参数 ,即主程序把参数压入栈,子程序出栈。

( 1 )在存储器中开辟一个 20个字的堆栈段,并计算栈顶偏移地址:

STACK SEGMENT PARA STACK

SPAE DW 20 DUP(?)

TOP EQU LENGTH SPAE

STACK ENDS

例 3-28 求数组之和

子程序定义及结构

Page 103: 第三章: 8086 汇编语言程序设计

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 ,预留求和单元并计算数组的长度。

子程序定义及结构

Page 104: 第三章: 8086 汇编语言程序设计

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 )数据求和主程序

子程序定义及结构

Page 105: 第三章: 8086 汇编语言程序设计

105

MOV AX,SIZE ARY2

PUSH AX

MOV AX,OFFSET ARY2

PUSH AX

CALL SUM

HLT

MAIN ENDS

END STR                                                 

子程序定义及结构

Page 106: 第三章: 8086 汇编语言程序设计

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 )求和子程序

子程序定义及结构

Page 107: 第三章: 8086 汇编语言程序设计

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

子程序定义及结构

Page 108: 第三章: 8086 汇编语言程序设计

108

恢复现场返回主程序:POPFPOP BPPOP CXPOP BXPOP AXRET

SUM ENDPRPOCE ENDS

子程序定义及结构

Page 109: 第三章: 8086 汇编语言程序设计

109

汇编语言程序举例 汇编语言程序举例

3.2.6 汇编语言程序举例例 3-30 将 ASCII码表示的两位十进制数转换成一字节二进

制数。( 37H, 39H)分析: 39H 是个位,用减法指令 SUB 减 30 即可得。

37H 是十位, 70=7X ( 23+2 )可得。

把所得的十位和个位数相加即可。

Page 110: 第三章: 8086 汇编语言程序设计

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 )定义数据段和代码段:

汇编语言程序举例 汇编语言程序举例

Page 111: 第三章: 8086 汇编语言程序设计

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 )

汇编语言程序举例 汇编语言程序举例

Page 112: 第三章: 8086 汇编语言程序设计

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→ 二进制数,两数相加。

汇编语言程序举例 汇编语言程序举例

Page 113: 第三章: 8086 汇编语言程序设计

113

算法:二进制→十进制→ ASCII。

二进制→十进制:

二进制数反复减 100,够减计数器加 1 ,直到不够减为止。计数器中的数就是 100的个数,即百位数。

十位数相同。

最后一次的结果(差)为负,要加 10以恢复原值,这就是 个位数 。 然 后 将 这 三 个 数 (百、十、 个 ) 转换成ASCII码。

例 3-32 将一字节二进制数转换成三位 ASCII 码表示的十进制数。

汇编语言程序举例 汇编语言程序举例

Page 114: 第三章: 8086 汇编语言程序设计

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 )、定义代码段,并初始化

汇编语言程序举例 汇编语言程序举例

Page 115: 第三章: 8086 汇编语言程序设计

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

汇编语言程序举例 汇编语言程序举例

Page 116: 第三章: 8086 汇编语言程序设计

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

汇编语言程序举例 汇编语言程序举例

Page 117: 第三章: 8086 汇编语言程序设计

117

MOV [DI],BLINC DIMOV [DI],AHINC DIMOV [DI],AL

( 6 )把转换好的 ASCII 码送存储器中

MOV AH,4CH

INT 21H

CODE ENDS

END START

( 7 )程序结束

汇编语言程序举例 汇编语言程序举例

Page 118: 第三章: 8086 汇编语言程序设计

118

有一个若干个字节的数据表,存放在数据段中,首地址为 TAB,表内各数已按升序排列好。今给定一关键字,试编程从表内查找该关键字,若有,则结束;若无,将该关键字顺序插入表中,并修改表长(表长在 LTH中)。算法:

   将给定关键字依次同数据表中的数据比较,若大于表中的数据,则继续同下一个数据比较,若小于表中数据,则先将从该数据开始的数据全部下移一个地址,然后将关键字插入表中空格,并将表长数加 1 。

例 3-36  查找例 3-36  查找

汇编语言程序举例 汇编语言程序举例

Page 119: 第三章: 8086 汇编语言程序设计

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               

汇编语言程序举例 汇编语言程序举例

Page 120: 第三章: 8086 汇编语言程序设计

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   

汇编语言程序举例 汇编语言程序举例

Page 121: 第三章: 8086 汇编语言程序设计

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

汇编语言程序举例 汇编语言程序举例

Page 122: 第三章: 8086 汇编语言程序设计

122

汇编语言程序举例 汇编语言程序举例

Page 123: 第三章: 8086 汇编语言程序设计

123

www.1ppt.com