微型计算机原理及其应用 —— 第四章:汇编语言程序设计

66
1 微微微微微微微微微微微 ——微微微 微微微微微微微微 微微微微微微微微微微微微微微

Upload: durin

Post on 27-Jan-2016

154 views

Category:

Documents


0 download

DESCRIPTION

微型计算机原理及其应用 —— 第四章:汇编语言程序设计. 合肥工业大学计算机与信息学院. 第四章:汇编语言程序设计. 汇编语言的基本要素 伪指令 汇编语言程序设计. 第四章:汇编语言程序设计. 汇编语言的基本要素 伪指令 汇编语言程序设计. 第四章:汇编语言程序设计 —— 汇编语言的基本要素. 汇编语言的格式 汇编语言中的常数 汇编语言中的运算符和表达式. 第四章:汇编语言程序设计 —— 汇编语言的基本要素. 汇编语言的格式 汇编语言中的常数 汇编语言中的运算符和表达式. 第四章:汇编语言程序设计 —— 汇编语言的基本要素. 汇编语言的格式 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

1

微型计算机原理及其应用——第四章:汇编语言程序设计

合肥工业大学计算机与信息学院

Page 2: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

2

第四章:汇编语言程序设计1. 汇编语言的基本要素2. 伪指令3. 汇编语言程序设计

Page 3: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

3

第四章:汇编语言程序设计1. 汇编语言的基本要素2. 伪指令3. 汇编语言程序设计

Page 4: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

4

第四章:汇编语言程序设计——汇编语言的基本要素1. 汇编语言的格式2. 汇编语言中的常数3. 汇编语言中的运算符和表达式

Page 5: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

5

第四章:汇编语言程序设计——汇编语言的基本要素1. 汇编语言的格式2. 汇编语言中的常数3. 汇编语言中的运算符和表达式

Page 6: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

6

第四章:汇编语言程序设计——汇编语言的基本要素 汇编语言的格式 由汇编语言编写的源程序是由许多语句 ( 也可称为汇编指令 ) 组成的。

每个语句由 1~4 个部分组成,其格式是: [ 标号 ] 指令助记符 [ 操作数 ] [ ;注解 ]

1. 标识符:给指令或某一存储单元地址所起的名字。可由下列字符组成: 字母: A ~ z ; 数字: 0 ~ 9 ; 特殊字符: ?、 · 、@、一、 $ 。

数字不能作标识符的第一个字符,而圆点仅能用作第一个字符。标识符最长为 31 个字符。当标识符后跟冒号时,表示是标号。它代表该行指令的起始地址;当标识符后不带冒号时,表示变量;伪指令前的标识符不加冒号。

2. 指令助记符:表示不同操作的指令,可以是 8086 的指令助记符,也可以是伪指令。

3. 操作数: 指令执行的对象。依指令的要求,可能有一个、两个或者没有。4. 注解:该项可有可无,是为源程序所加的注解,用于提高程序的可读性。

Page 7: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

7

第四章:汇编语言程序设计——汇编语言的基本要素1. 汇编语言的格式2. 汇编语言中的常数3. 汇编语言中的运算符和表达式

Page 8: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

8

第四章:汇编语言程序设计——汇编语言的基本要素 汇编语言中的常数 汇编语言中的常数可以分数值常数和字符串常数两类。数值常数

按其基数的不同,可有二进制数、八进制数、十进制数、十六进制数等几种不同的表示形式,汇编语言中采用不同的后缀加以区分。

B :表示二进制数。例如, 10100101B 。 D :表示十进制数。例如, 278D 或 278 。 Q :表示八进制数。例如, 567Q , 263Q 。 H :表示十六进制数。例如, 9AH , 5678H 。

字符串常数是由单引号括起来的一串字符。例如:‘ THIS IS A STUDENT!’‘12345’

要指出的是,此处的’ 12345’ 其值并非是十进制数 12345 ,而是代表它们所对应的 ASCII 码,即 31H, 32H, 33H, 34H,35H 。

Page 9: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

9

第四章:汇编语言程序设计——汇编语言的基本要素 汇编语言中的运算符和表达式 在表达式中,运算符充当着重要的角色。 8086 宏汇编有算术运

算符、逻辑运算符、关系运算符、数值回送操作符和属性操作符共 5种。

数值回送 (Value_returning) 操作符可以把一些特征或存储器地址的一部分作为数值回送。共有 5 个: SEG( 求段基值 ) 、OFFSET( 求偏移量 ) 、 TYPE( 求变量类型 ) 、 LENGTH( 求字节数 ) 和 SIZE( 求字节数 ) 。其中 LENGTH和 SIZE 只对数据存储器地址操作数有效。

属性操作符可以用来建立和临时改变变量或标号的类型以及存储器操作数的存储单元类型,而忽略当前的属性。共有 6 个: PTR 、段属性前缀、 SHORT、 THIS、HIGH和 LOW 。

Page 10: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

10

第四章:汇编语言程序设计——汇编语言的基本要素 汇编语言中的运算符和表达式

算术运算符 逻辑运算符 关系运算符 数值回送运算符 属性运算符+( 加法 ) AND(与 ) EQ( 相等 ) TYPE PTR

-( 减法 ) OR(或 ) NE( 不等 ) LENGTH THIS

*( 乘法 ) XOR( 异或 )

LT( 小于 ) SIZE SHORT

/( 除法 ) NOT(非 ) GT( 大于 ) OFFSET HIGH

MOD( 求余 )

LE( 小于等于 )

SEG LOW

GE( 大于等于 )

Page 11: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

11

第四章:汇编语言程序设计——汇编语言的基本要素 汇编语言中的运算符和表达式——数值回送操作符 SEG 运算符:利用运算符 SEG 可以得到一个标号或变量的段基址 格式: SEG 变量名或标号名 例如:已知数据段 DATA 从存储器实际地址 03000H 开始,作如下定

义后,用 SEG 运算符求变量所在的段基址。

DATA SEGMENT ; 定义数据段VAR1 DB 10H,18H,25H,34H ; 定义字节数据VAR2 DW 2300H,1200H ; 定义字数据VAR3 DD 11002200H,33004400H ; 定义双字数据

DATA ENDS ; 数据段结束

MOV BX,SEG VAR1 汇编成: MOV BX,0300H MOV CX,SEG VAR2汇编成: MOV CX,0300H MOV DX,SEG VAR3 汇编成; MOV DX,0300H

Page 12: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

12

第四章:汇编语言程序设计——汇编语言的基本要素 汇编语言中的运算符和表达式——数值回送操作符 OFFSET运算符:利用运算符OFFSET可以得到一个标号或变量的偏移量。

使用格式:OFFSET 变量名或标号名

DATA SEGMENT ; 定义数据段VAR1 DB 10H,18H,25H,34H ; 定义字节数据VAR2 DW 2300H,1200H ; 定义字数据VAR3 DD 11002200H,33004400H ; 定义双字数据

DATA ENDS ; 数据段结束

MOV BX,OFFSET VAR1 汇编成: MOV BX,0000H MOV CX,OFFSET VAR2 汇编成: MOV CX,0004H MOV DX,OFFSET VAR3 汇编成: MOV DX,0008H

Page 13: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

13

汇编语言中的运算符和表达式——数值回送操作符 TYPE 运算符: TYPE 运算符可加在变量、结构或标号的前面,所求出的是这些

存储器操作数的类型部分。运算符 TYPE 的运算结果是一个数值,这个数值与存储器操作数类型属性的对应关系。

MOV BX,TYPE VAR1 汇编成: MOV BX,1MOV CX,TYPE VAR2 汇编成: MOV CX,2MOV DX,TYPE VAR3 汇编成: MOV DX,4

存储操作数类型 TYPE 返回值字节数据 BYTE(DB 定义) 1

字数据 WORD(DW 定义) 2

双字数据 DWORD(DD 定义)

4

第四章:汇编语言程序设计——汇编语言的基本要素

Page 14: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

14

第四章:汇编语言程序设计——汇编语言的基本要素 汇编语言中的运算符和表达式——数值回送操作符 LENGTH 运算符: LENGTH 运算符放在数组变量的前面,可以求出

该数组中所包含的变量的个数。

ARRAY1 DB 100DUP( ? )ARRAY2 DW 10DUP( ? ) ARRAY3 DD 10DUP( ? )

下列指令:MOV BX , LENGTH ARRAY1 汇编后: MOV BX,100MOV CX , LENGTH ARRAY2 汇编后: MOV CX,10MOV DX , LENGTH ARRAY3 汇编后: MOV DX,10

Page 15: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

15

第四章:汇编语言程序设计——汇编语言的基本要素 汇编语言中的运算符和表达式——数值回送操作符 SIZE 运算符:如果一个变量已经用重复操作符 DUP 加以说明,则利用 SIZE 运算符可以得到分配给该变量的字节总数。

ARRAY1 DB 100DUP( ? )ARRAY2 DW 10DUP( ? ) ARRAY3 DD 10DUP( ? )

下列指令:MOV BX,SIZE ARRAY1 汇编后: MOV BX,100MOV CX,SIZE ARRAY2 汇编后: MOV CX,20MOV DX,SIZE ARRAY3 汇编后: MOV DX,40

Page 16: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

16

第四章:汇编语言程序设计——汇编语言的基本要素 汇编语言中的运算符和表达式——属性操作符 PTR 运算符:用来建立一个符号地址。其本身并不分配存储器,只是

用来给已分配的存储器地址赋予另一种属性,使该地址具有另一种类型。

VAR1 DB 10H,18H,25H,34HVAR2 DW 1223H,1200HMOV AX, WORD PTR VAR1 执行后: AX=1810HMOV BL, BYTE PTR VAR2 执行后: BL=23H

Page 17: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

17

第四章:汇编语言程序设计1. 汇编语言的基本要素2. 伪指令3. 汇编语言程序设计

Page 18: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

18

第四章:汇编语言程序设计——伪指令

伪指令用来对汇编程序进行控制,对程序中的数据实现条件转移、列表、存储空间分配等处理,其格式和汇编指令一样,但一般不产生目的代码,即不直接命令 CPU去执行什么操作。

亦即它不像机器指令那样是在程序运行期间由计算机来执行的,而是在汇编程序对源程序汇编期间由汇编程序处理的操作。

Page 19: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

19

第四章:汇编语言程序设计——伪指令1. 定义数据伪指令2. 符号定义伪指令3. 段定义伪指令4. 设定段寄存器伪指令5. 定义过程的伪指令6. 宏指令7. ORG 伪指令8. 汇编结束伪指令 END

Page 20: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

20

第四章:汇编语言程序设计——伪指令1. 定义数据伪指令2. 符号定义伪指令3. 段定义伪指令4. 设定段寄存器伪指令5. 定义过程的伪指令6. 宏指令7. ORG 伪指令8. 汇编结束伪指令 END

Page 21: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

21

第四章:汇编语言程序设计——伪指令 定义数据伪指令 该类伪指令用来定义存贮空间及其所存数据的长度。 DB :定义字节,即每个数据是 1 个字节。 DW :定义字,即每个数据占 1 个字( 2 个字节)。 DD :定义双字,即每个数据占 2 个字。低字部分在低地址,高字部

分在高地址。 DQ :定义 4 字长,即每个数据占 4 个字。 DT :定义 10 个字节长,用于压缩式十进制数据。 例如: DATA1 DB 10H, 6 , 78H, 100 表示从 DATA1 单元开始连续存放 10H, 6 , 78H, 100 ,共占 4 个字节地址。

Page 22: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

22

第四章:汇编语言程序设计——伪指令 定义数据伪指令

DATA1 DB 20HDATA2 DW

0240H,1000HDATA3 DB (-1*3),

(15/5)DATA4 DD 12345HDATA5 DB '0123'DATA6 DW

'AB','C','D'DATA7 DB ?DATA8 DD ?DATA9 DB

5DUP(00)DATA10 DW

3DUP(?)

20HDATA1

40HDATA2

02H

00H

10H

FDHDATA3

05H

45HDATA4

23H

01H

00H

33HDATA5

32H

31H

30H

42HDATA6

41H

43H

00H

44H

00H

??DATA7

??DATA8

??

??

??

00DATA9

00

00

00

00

??DATA10

??

??

??

??

??

Page 23: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

23

第四章:汇编语言程序设计——伪指令1. 定义数据伪指令2. 符号定义伪指令3. 段定义伪指令4. 设定段寄存器伪指令5. 定义过程的伪指令6. 宏指令7. ORG 伪指令8. 汇编结束伪指令 END

Page 24: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

24

第四章:汇编语言程序设计——伪指令 符号定义伪指令 EQU 伪指令给符号定义一个值。在程序中,凡是出现该符号的地方,

汇编时均用其值代替,如:

COUNT EQU 100 ;COUNT 代替常数 100SUM EQU 30*25 ;SUM 代替数值表达式C EQU CX ;C 代替寄存器 CXM EQU MOV ;M 代替指令助记符 MOV

需要注意的是,一个符号一经 EQU 伪指令赋值后,在整个程序中,不允许再对同一符号重新赋值。

Page 25: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

25

第四章:汇编语言程序设计——伪指令1. 定义数据伪指令2. 符号定义伪指令3. 段定义伪指令4. 设定段寄存器伪指令5. 定义过程的伪指令6. 宏指令7. ORG 伪指令8. 汇编结束伪指令 END

Page 26: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

26

第四章:汇编语言程序设计——伪指令 段定义伪指令 段定义伪指令的用途是在汇编语言程序中定义逻辑段,

用它来指定段的名称和范围,并指明段的定位类型、组合类型及类别。常用的段定义为指令有 SEGMENT和 ENDS 。

段名 SEGMENT [ 定位类型 ] [ 组合类型 ] [ 类别 ] …(段内语句系列)段名 ENDS

Page 27: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

27

第四章:汇编语言程序设计——伪指令 段定义伪指令DATA1 SEGMENT ┇DATA1 ENDSSTACK1 SEGMENT STACK ┇STACK1 ENDSCODE1 SEGMENT ASSUME CS: CODE1,DS:DATA1, SS: STACK1 MOV AX,DATA MOV DS, AX MOV AX, STACK MOV SS, AX ┇ CODE1 ENDS

Page 28: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

28

第四章:汇编语言程序设计——伪指令1. 定义数据伪指令2. 符号定义伪指令3. 段定义伪指令4. 设定段寄存器伪指令5. 定义过程的伪指令6. 宏指令7. ORG 伪指令8. 汇编结束伪指令 END

Page 29: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

29

第四章:汇编语言程序设计——伪指令 设定段寄存器伪指令 设定段寄存器伪指令用来通知汇编程序哪一个段寄存器

是该段的段寄存器,以便对使用变量或标号的指令汇编出正确的目的代码。常用的段定义为指令有 ASSUME 。

ASSUME 段寄存器:段名 [ ,段寄存器:段名,…… ]

注意:由于 ASSUME 伪指令只指明某一个段地址应存于哪一个段寄存器中,并没有包含将段地址送入该寄存器的操作。因此要将真实段地址装入段寄存器还需用汇编指令来实现。这一步是不可缺少的。

Page 30: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

30

第四章:汇编语言程序设计——伪指令 设定段寄存器伪指令DATA1 SEGMENT ┇DATA1 ENDSSTACK1 SEGMENT STACK ┇STACK1 ENDSCODE1 SEGMENT ASSUME CS: CODE1,DS:DATA1, SS: STACK1 MOV AX,DATA MOV DS, AX MOV AX, STACK MOV SS, AX ┇ CODE1 ENDS

Page 31: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

31

第四章:汇编语言程序设计——伪指令1. 定义数据伪指令2. 符号定义伪指令3. 段定义伪指令4. 设定段寄存器伪指令5. 定义过程的伪指令6. 宏指令7. ORG 伪指令8. 汇编结束伪指令 END

Page 32: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

32

第四章:汇编语言程序设计——伪指令 定义过程伪指令 在程序设计中,可将具有一定功能的程序段看成为一个过程 ( 相当

于一个子程序 ) ,它可以被别的程序调用。一个过程由伪指令 PROC和 ENDP 来定义。

过程名 PROC [ 类型 ] 过程体 RET 过程名 ENDP

其中过程名是为过程所起的名称,不能省略,过程的类型由 FAR(远过程,为段间调用)和 NEAR(近过程,在本段内调用)来确定,如果缺省类型,则该过程就默认为近过程。 ENDP 表示过程结束。过程体内至少应有一条 RET 指令,以便返回被调用处。过程可以嵌套,也可以递归使用。

Page 33: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

33

第四章:汇编语言程序设计——伪指令 定义过程伪指令

DELAY PROC MOV BL, 10

DELY: MOV CX, 2801WAIT: LOOP WAIT

DEC BL JNZ DELY RET

DELAY ENDP

Page 34: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

34

第四章:汇编语言程序设计——伪指令1. 定义数据伪指令2. 符号定义伪指令3. 段定义伪指令4. 设定段寄存器伪指令5. 定义过程的伪指令6. 宏指令7. ORG 伪指令8. 汇编结束伪指令 END

Page 35: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

35

第四章:汇编语言程序设计——伪指令 宏指令 在汇编语言书写的源程序中,若有的程序段要多次使用,为了简化

程序书写,该程序段可以用一条宏指令来代替,而汇编程序汇编到该宏指令时,仍会产生源程序所需的代码。

宏指令的一般格式为:

宏指令名 MACRO [ 形式参量表 ] 宏体 ENDM

例如:SHIFT MACROMOV CL,4SAL AL,ClENDM

Page 36: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

36

第四章:汇编语言程序设计——伪指令1. 定义数据伪指令2. 符号定义伪指令3. 段定义伪指令4. 设定段寄存器伪指令5. 定义过程的伪指令6. 宏指令7. ORG 伪指令8. 汇编结束伪指令 END

Page 37: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

37

第四章:汇编语言程序设计——伪指令 ORG 伪指令ORG 伪指令规定了在某一段内,程序或数据代码存放的起始偏移地址。 一般格式: ORG < 表达式 >例如:

DATA SEGMENT BUFF1 DB 23,56H,‘ EOF’ ORG 2000H BUFF2 DB ‘STRING’ DATA ENDS

Page 38: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

38

第四章:汇编语言程序设计——伪指令1. 定义数据伪指令2. 符号定义伪指令3. 段定义伪指令4. 设定段寄存器伪指令5. 定义过程的伪指令6. 宏指令7. ORG 伪指令8. 汇编结束伪指令 END

Page 39: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

39

第四章:汇编语言程序设计——伪指令 汇编结束伪指令 END 该伪指令表示源程序的结束.令汇编程序停止汇编。因此,任何一

个完整的源程序均应有 END 指令。一般格式: END [ 表达式 ]其中表达式表示该汇编程序的启动地址。例如:END START ;表明该程序的启动地址为 START 。

Page 40: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

40

第四章:汇编语言程序设计1. 汇编语言的基本要素2. 伪指令3. 汇编语言程序设计

Page 41: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

41

第四章:汇编语言程序设计——汇编语言程序设计1. 汇编语言程序设计概述2.顺序程序设计3.选择程序设计4.循环程序设计5.子程序设计

Page 42: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

42

第四章:汇编语言程序设计——汇编语言程序设计1. 汇编语言程序设计概述2.顺序程序设计3.选择程序设计4.循环程序设计5.子程序设计

Page 43: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

43

第四章:汇编语言程序设计——汇编语言程序设计 汇编语言程序设计概述1 .编写源程序 在弄清问题的要求,确定方案后,汇编语言程序设计者便可依据前

面的指令系统和汇编语言的规定,逐个模块地编写汇编语言源程序。2 .源程序输入微型机 在编辑软件 EDIT.EXE 或其他编辑软件的支持下,将源程序输入到

计算机中。通常,汇编语言源程序的扩展名为 ASM 。3 .汇编 利用汇编程序(或宏汇编程序)( ASM或MASM )对汇编语言

源程序进行汇编,产生扩展名为 OBJ 的可重定位的目的代码。4 .连接 利用连接程序( LINK )可将一个或多个扩展名为 OBJ文件进行连接,生成扩展名为扩展名为 EXE 的可执行文件。

5 .调试 对于稍大一些的程序来说,经过上述步骤所获得的 . EXE 可执行文件,在运行过程中难免无错。调试汇编程序最常用的工具是动态调试程序 DEBUG 。

Page 44: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

44

第四章:汇编语言程序设计——汇编语言程序设计 汇编语言程序设计概述

汇编语言源程序 编辑程序 汇编程序

ASM MASM或连接程序

LI NK调试程序

DEBUG

修 改

出错 出错

. ASM . OBJ . EXEEDI T. EXE

Page 45: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

45

第四章:汇编语言程序设计——汇编语言程序设计1. 汇编语言程序设计概述2.顺序程序设计3.选择程序设计4.循环程序设计5.子程序设计

Page 46: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

46

第四章:汇编语言程序设计——汇编语言程序设计 顺序程序设计 对于一些简单的数据处理,只要把完成处理的各个步骤用汇编语言描述清楚,让计算机按指令编写的次序从头到尾一条条执行即可,这样的程序结构称为顺序结构。

【例 4-1】已知 X 和 Y 是数据段中的两个无符号字节单元,用程序完成表达式 Z=(X2+ Y2)/2 的计算。

Page 47: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

47

第四章:汇编语言程序设计——汇编语言程序设计 顺序程序设计 DATA SEGMENT

X DB 15Y DB 34Z DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATA

MOV DS,AX ; 初始化数据段MOV AL,X ;X 中的内容送 ALMUL AL ; 计算 X×XMOV BX,AX ;X×X 乘积送 BXMOV AL,Y ;Y 中的内容送 ALMUL AL ; 计算 Y×YADD AX,BX ; 计算 X2+ Y2

SHR AX,1 ; 计算 (X2+ Y2)/2MOV Z,AX ; 结果送 Z 单元MOV AH,4CHINT 21H ; 返回 DOS

CODE ENDSEND START ; 汇编结束

Page 48: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

48

第四章:汇编语言程序设计——汇编语言程序设计 顺序程序设计【例 4-2】从键盘读入两个一位数(按键时保证按下的是数字键),显示它们的积。先后从键盘上读取两个按键,分别减去 30H 得到它们对应的数值,然后相乘分解成十位数字与个位数字,转换成 ASCⅡ 码后依次输出即可。为了输入输出效果的直观,有必要在每次按键后回车换行。 CODE SEGMENT

ASSUME CS:CODEMAIN: MOV AH,1

INT 21H ; 读入第 1 个数字MOV BL,AL ; 保存在 BL 中MOV AH,2MOV DL,13INT 21H ; 回车MOV DL,10INT 21H ; 换行MOV AH,1INT 21H ; 读入第 2 个数字SUB AL,30H ; 第 2 个数字转换成十进制数SUB BL,30H ; 第 1 个数字转换成十进制数MUL BL ; 两个数相乘,积在 AX 中

Page 49: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

49

第四章:汇编语言程序设计——汇编语言程序设计 顺序程序设计

MOV BL,10 ;DIV BL ; 积除以 10取商送 AL ,余数在 AH 中ADD AX,3030H ; 转换成相应的 ASCⅡ 码MOV BX,AX ; 保存在 BX 中MOV AH,2MOV DL,13INT 21H ; 回车MOV DL,10INT 21H ; 换行MOV DL,BLMOV AH,2INT 21H ; 输出十位数MOV DL,BHINT 21H ; 输出个位数MOV AH,4CHINT 21H ; 返回 DOS

CODE ENDSEND MAIN ; 程序结束

Page 50: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

50

第四章:汇编语言程序设计——汇编语言程序设计1. 汇编语言程序设计概述2.顺序程序设计3.选择程序设计4.循环程序设计5.子程序设计

Page 51: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

51

第四章:汇编语言程序设计——汇编语言程序设计 选择程序设计 选择程序是利用条件转移指令,使程序执行到某一指令后,根据条件是否满足,

来改变程序执行的次序。在程序设计中经常会遇到各种判断和比较,例如“相等”和“不相等”;“正”和“负”;“大于”和“小于”;“满足条件”和“不满足条件”等等,这些判断和比较在程序中都可以组成各种不同的逻辑框,并产生相应的分支程序。

2分支程序段

3分支程序段 1分支程序段

结束

1条件

2条件

Page 52: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

52

第四章:汇编语言程序设计——汇编语言程序设计 选择程序设计 1 当 X>0【例 4-3】符号函数 Y= 0 当 X=0 (- 128≤X≤+127 )

- 1 当 X<0 设任意给定的 X 存放在 XX 单元,计算出函数 Y 值要求存放在 YY 单元。

开始

XX→ AL

-1→ AL

1→ AL

AL→ YY单元

AL≥ 0

AL=0

Y

N

结束

Page 53: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

53

第四章:汇编语言程序设计——汇编语言程序设计 选择程序设计 DATA SEGMENT

XX DB 0F0H

YY DB ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START PROC FAR

PUSH DS

SUB AX,AX

PUSH AX

MOV AX,DATA

MOV DS,AX

MOV AL,XX

CMP AL,0

JGE BIGR

MOV AL,0FFH

MOV YY,AL

RET

BIGR: JE EQUL

MOV AL,1

EQUL: MOV YY,AL

RET

START ENDP

CODE ENDS

END START

Page 54: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

54

第四章:汇编语言程序设计——汇编语言程序设计1. 汇编语言程序设计概述2.顺序程序设计3.选择程序设计4.循环程序设计5.子程序设计

Page 55: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

55

第四章:汇编语言程序设计——汇编语言程序设计 循环程序设计 循环程序是强制 CPU 重复执行某一指

令系列的一种程序结构形式,它可以使许多重复工作的程序大为简化,而且减少内存空间。被重复执行的部分称作循环体,要想把循环体多次执行,就必须在循环体的前后有相应的指令实现循环控制。

循环程序一般由 4 部分组成:初始化、循环体、循环控制和循环结束处理。

开始

初始化

循环体

循环控制

判断

结束处理

结束

开始

外循环初始化

内循环初始化

内循环体

内控制

外循环体

外控制

结束

Page 56: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

56

第四章:汇编语言程序设计——汇编语言程序设计 循环程序设计 【例 4-4】现将以 AREA1 为首地址的 100 个字节数据搬移到以 AREA2 为首地址的内存中去。

DATA SEGMENT

AREA1 DB 100 DUP (?)

AREA2 DB 100 DUP (00)

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:MOV AX,DATA

MOV DS,AX

MOV SI,OFFSET AREA1

MOV DI,OFFSET AREA2

MOV CX,100

AGAIN:MOV AL,[SI]

MOV [DI],AL

INC SI

INC DI

DEC CX

JNZ AGAIN

MOV AH,4CH

INT 21H

CODE ENDS

END START

Page 57: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

57

第四章:汇编语言程序设计——汇编语言程序设计 循环程序设计 【例 4-5】若有一串无符号数,放在 NUM 开始的单元中,要求编制汇编语言程序,将其

中的最大值找出来,且放到存储单元 MAX 中,这串数的长度已存放在 COUNT 单元。DATA SEGMENTCOUNT DW 20NUM DW

7,9,12,14,1,3,28,55,121,44,15,45,34,67,87,90,32,43,59,60MAX DW ?DATA ENDSSTACK SEGMENT PARA STACK ‘STACK’

DB 20 DUP (?)STACK ENDSCODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACKMAIN PROC FAR

PUSH DSMOV AX,0

PUSH AX

Page 58: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

58

第四章:汇编语言程序设计——汇编语言程序设计 循环程序设计

MOV AX,DATAMOV DS,AXMOV BX,OFFSET NUMMOV CX,COUNTMOV AX,[BX]INC BXINC BX

LOOP1: CMP AX,[BX]JAE LOOP2MOV AX,[BX]

LOOP2: INC BXINC BXDEC CXJNZ LOOP1MOV [MAX],AXRET

MAIN ENDPCODE ENDS

END MAIN

Page 59: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

59

第四章:汇编语言程序设计——汇编语言程序设计 循环程序设计 【例 4-6】设计一个 100ms 的软件延时程序。采用多重循环程序,内循环完成

10ms 的延时,外层循环 10次即可。CODE SENGMET

ASSUME CS:CODE

START: MOV DL,10

DELAY1:MOV CX,2800H

DELAY2:LOOP DELAY2

DEC DL

JNZ DELAY1

MOV AH,4CH

INT 21H

CODE ENDS

END START

Page 60: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

60

第四章:汇编语言程序设计——汇编语言程序设计1. 汇编语言程序设计概述2.顺序程序设计3.选择程序设计4.循环程序设计5.子程序设计

Page 61: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

61

第四章:汇编语言程序设计——汇编语言程序设计 子程序设计——格式和调用子程序名 PROC 类型 指令序列子程序名 ENDP

子程序调用与子程序返回由 CALL和 RET 指令实现。子程序调用方式有近程调用、远程调用、直接调用和间接调用。

Page 62: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

62

第四章:汇编语言程序设计——汇编语言程序设计 子程序设计——保护现场和恢复现场利用指令 PUSH保护现场,利用指令 POP恢复现场。例如: SUB1 PROC NEAR PUSH AX保护现场 PUSH BX PUSH CX PUSH DX ┇ ┇ POP DX恢复现场 POP CX POP BX POP AX RET SUB1 ENDP

Page 63: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

63

第四章:汇编语言程序设计——汇编语言程序设计 子程序设计——参数传递方法1. 利用寄存器:这是一种最常见方法,把所需传递的参数直接放在主程序

的寄存器中传递给子程序。2. 利用存储单元:这种参数传递方法,把所需传递的参数直接放在子程序调用指令代码之后。

3. 利用堆栈:这种方法将参数压入堆栈,在子程序运行时从堆栈中取参数。

Page 64: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

64

第四章:汇编语言程序设计——汇编语言程序设计 子程序设计 【例 4-7】编制程序两个 6 字节数相加。将一个字节相加的程序段设计为子程序。主程序分 3 次调用该子程序,但每次调用的参数不同。

DATA SEGMENTMYADD1 DB 0FEH,86H,7CH,35H,68H,77HMYADD2 DB 45H,0BCH,7DH,6AH,87H,90HSUM DB 6 DUP (0)COUNT DB 6DATA ENDSSTACK SEGMENT

DB 100 DUP (?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKMADD: MOV AX,DATA

MOV DS,AXMOV AX,STACKMOV SS,AXMOV SI,OFFSET MYADD1MOV DI,OFFSET MYADD2MOV BX,OFFSET SUM

Page 65: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

65

第四章:汇编语言程序设计——汇编语言程序设计 子程序设计MOV CX,COUNT ;循环初值为 6

CLC AGAIN:CALL SUBADD ;调用子程序

LOOP AGAIN ;循环调用 6 次MOV AX,4C00HINT 21H

; 子程序入口参数 :SI,DI,BX 出口参数 :SI,DI,BXSUBADD PROC ;完成一个字节相加

PUSH AX ;保护 AX 的值MOV AL,[SI] ;SI 是一个源操作数指针ADC AL,[DI] ;DI 是另一个源操作数指针MOV [BX],AL ;BX 是结果操作数指针INC SIINC DIINC BXPOP AX ;恢复 AX 的值RET

SUBADD ENDPCODE ENDS

END MADD

Page 66: 微型计算机原理及其应用 —— 第四章:汇编语言程序设计

66

第四章:汇编语言程序设计——总结 了解汇编的概念及其方法 , 掌握汇编程序的基本格式,常用运算符的使

用方法,汇编的步骤。