43
汇汇汇汇 汇汇汇汇 5 5 5.1 8086 5.1 8086 汇汇汇汇汇汇 汇汇汇汇汇汇 5.1.1 5.1.1 汇汇汇汇汇汇汇汇 汇汇汇汇汇汇汇汇 5.1.2 5.1.2 汇汇汇汇汇汇 汇汇汇汇汇汇 5.1.3 5.1.3 汇汇汇汇汇 汇汇汇汇汇 5.1.4 5.1.4 汇汇汇汇汇 汇汇汇汇汇 5.2 5.2 汇汇汇汇汇汇汇汇 汇汇汇汇汇汇汇汇 5.2.1 5.2.1 汇汇汇汇汇汇 汇汇汇汇汇汇 5.2.2 5.2.2 汇汇汇汇汇汇 汇汇汇汇汇汇 5.2.3 5.2.3 汇汇汇汇汇汇 汇汇汇汇汇汇 5.2.4 5.2.4 汇汇汇汇汇 汇汇汇汇汇 5.2.5 DOS 5.2.5 DOS 汇汇汇汇 汇汇汇汇

第 5 章

Embed Size (px)

DESCRIPTION

第 5 章. 汇编语言. 5.1 8086 汇编语言基础 5.1.1 汇编语言基本语法 5.1.2 汇编语言语句 5.1.3 伪指令语句 5.1.4 宏指令语句. 5.2 汇编语言程序设计 5.2.1 顺序程序设计 5.2.2 分支程序设计 5.2.3 循环程序设计 5.2.4 子程序设计 5.2.5 DOS 功能调用. 8086 汇编语言基础. 5.1. 汇编语言的处理过程 : ( 1 )编写汇编语言源程序,生成扩展名为 ASM 的汇编源源文件。 ( 2 )对汇编源程序进行编译。 - PowerPoint PPT Presentation

Citation preview

汇编语言汇编语言第第 55 章章

5.1 80865.1 8086 汇编语言基础汇编语言基础

5.1.1 5.1.1 汇编语言基本语法汇编语言基本语法

5.1.2 5.1.2 汇编语言语句汇编语言语句

5.1.3 5.1.3 伪指令语句伪指令语句

5.1.4 5.1.4 宏指令语句宏指令语句

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

5.2.1 5.2.1 顺序程序设计顺序程序设计

5.2.2 5.2.2 分支程序设计分支程序设计

5.2.3 5.2.3 循环程序设计循环程序设计

5.2.4 5.2.4 子程序设计子程序设计

5.2.5 DOS5.2.5 DOS 功能调用功能调用

●● 汇编语言的处理过程汇编语言的处理过程 ::

(( 11 )编写汇编语言源程序,生成扩展名为)编写汇编语言源程序,生成扩展名为 ASMASM 的汇编源源文的汇编源源文

件。 件。

(( 22 )对汇编源程序进行编译。 )对汇编源程序进行编译。

(( 33 )对目标文件进行连接 。)对目标文件进行连接 。

教学进程教学进程

5.15.1 80868086 汇编语言基汇编语言基础础

●●

●●

11 )效率低(与人们描述计算过程的需要差距大);)效率低(与人们描述计算过程的需要差距大);

22 )机器硬件的具体结构联系过于紧密——在一种结构的机器上开发)机器硬件的具体结构联系过于紧密——在一种结构的机器上开发

的程序极难移植到另一种不同结构的机器上去。 的程序极难移植到另一种不同结构的机器上去。

教学进程教学进程

5.15.1 80868086 汇编语言基础汇编语言基础

汇编语言进行程序设计的优点汇编语言进行程序设计的优点

11 )充分利用机器的硬件功能和结构特点,加快程序的执行速度,)充分利用机器的硬件功能和结构特点,加快程序的执行速度,

减少目标程序所占用的存储空间; 减少目标程序所占用的存储空间;

22 )用来编写实时控制程序、实时通信程序,有时也用来编制某些)用来编写实时控制程序、实时通信程序,有时也用来编制某些

系统软件程序。 系统软件程序。

汇编语言进行程序设计缺点汇编语言进行程序设计缺点

教学进程教学进程

宏指令语句是由编程者按照一定的规则来定义的一种较宏指令语句是由编程者按照一定的规则来定义的一种较

“宏大”的指令,可包括多条指令或伪指令。 “宏大”的指令,可包括多条指令或伪指令。

汇编语言基本语法 汇编语言基本语法

在在 80868086 汇编中使用的语句可以分成汇编中使用的语句可以分成 33 种类型种类型

这类指令能够产生目标代码,是这类指令能够产生目标代码,是 CPUCPU 可以执行的能够完可以执行的能够完

成特定功能的语句,主要由机器指令组成。在汇编时一条成特定功能的语句,主要由机器指令组成。在汇编时一条

指令语句被翻译成对应的机器码,对应着特定的操作。指令语句被翻译成对应的机器码,对应着特定的操作。

指令语句:指令语句:

伪指令语句:伪指令语句: 伪指令语句是为汇编程序和连接程序提供一些必要控制的伪指令语句是为汇编程序和连接程序提供一些必要控制的

管理性语句,它不产生目标代码,仅仅在汇编过程中告诉管理性语句,它不产生目标代码,仅仅在汇编过程中告诉

汇编程序应如何汇编,并完成相应的伪操作。汇编程序应如何汇编,并完成相应的伪操作。

宏指令语句:宏指令语句:

5.1.15.1.1

教学进程教学进程

汇编语言源程序中的语句可以由四项组成,格式如下:汇编语言源程序中的语句可以由四项组成,格式如下:

[[ 名字名字 ] ] 操作符操作符 [[ 操作数操作数 ] [] [ ;注释;注释 ]]

汇编语言语句 汇编语言语句 5.1.25.1.2

(( 22 )操作符可以是指令、伪指令或宏指令的助记符。 )操作符可以是指令、伪指令或宏指令的助记符。

(( 33 )操作数字段是操作符的操作对象。 )操作数字段是操作符的操作对象。

(( 44 )注释字段是以“;”开头的说明部分,可以用英文或者中文书)注释字段是以“;”开头的说明部分,可以用英文或者中文书

写。写。

(( 11 )名字项是程序设计人员自己定义的符号, 用于代表内存单元的)名字项是程序设计人员自己定义的符号, 用于代表内存单元的

地址,表示本条语句的符号地址。一般来说,名字可以是标号和 地址,表示本条语句的符号地址。一般来说,名字可以是标号和

变量,统称为标识符。 变量,统称为标识符。

●● 1.1. 汇编语言格式汇编语言格式

5.1.2 5.1.2 汇编语言语句 汇编语言语句

教学进程教学进程

●● 1.1. 汇编语言格式汇编语言格式

标号标号:标号在代码段中定义,后面跟着冒号标号。:标号在代码段中定义,后面跟着冒号标号。

变量变量:变量在数据段或附加数据段中定义,后面不跟冒号。:变量在数据段或附加数据段中定义,后面不跟冒号。标识符标识符

标号和变量都有三个属性标号和变量都有三个属性

段属性:标号所代表的段的值,可用段属性:标号所代表的段的值,可用 SEGSEG 算符得到。算符得到。偏移量属性:标号所代表的偏移量的值,可用偏移量属性:标号所代表的偏移量的值,可用 OFFSETOFFSET 算符得到。算符得到。类型属性:标号所代表的内存单元所存放的数据或指令代码的类型。类型属性:标号所代表的内存单元所存放的数据或指令代码的类型。

组成标号的字符:组成标号的字符: AA 〜〜 ZZ ,, aa 〜〜 zz ,, 00 〜〜 99 ,, ?? ,, @@ ,, $$ ,和,和_(_(下划线下划线 ));;

标号的最大长度为标号的最大长度为 3l3l (字符个数);(字符个数); 标号的第一个字符不能是标号的第一个字符不能是 00〜〜 99的数字;的数字; 机器指令语句中标号必须以冒号结束,伪指令语句中的标号不允机器指令语句中标号必须以冒号结束,伪指令语句中的标号不允

许有冒号。 许有冒号。

名字项的组成规则名字项的组成规则

●●

算术操作符有算术操作符有 ++ 、、 -- 、、 ** 、、 / / 和 和 MODMOD 以及以及 SHLSHL (左移)、(左移)、 SHSH

RR (右移)。其中(右移)。其中 MODMOD 运算是取模运算,即除法之后所得的余运算是取模运算,即除法之后所得的余

数。 数。

5.1.2 5.1.2 汇编语言语句 汇编语言语句

2. 2.

例例 : : MOVMOV ALAL ,, 10MOD310MOD3 ;; AL=1AL=1

ADDADD ALAL ,, 11HSHR111HSHR1 ;; AL=8AL=8

MOVMOV AXAX ,, (9-1) * 2(9-1) * 2 ;; AX=0FH AX=0FH

教学进程教学进程

算术操作符算术操作符

逻辑操作符包括逻辑操作符包括 ANDAND 、、 OROR 、、 XORXOR 、、 NOTNOT ,逻辑操作符是按位,逻辑操作符是按位

操作的,只能用于数字表达式。操作的,只能用于数字表达式。

5.1.2 5.1.2 汇编语言语句 汇编语言语句

例例 ::

ANDAND DXDX ,, PORT_VAL ANDPORT_VAL AND ;; DX=DX AND DX=DX AND PORT_VAL ANDPORT_VAL AND

MOV MOV ALAL ,, 00H AND 0FH00H AND 0FH ;; AL=00HAL=00H

MOV MOV CXCX ,, 08FH OR F8H08FH OR F8H ;; CX=0FFHS CX=0FFHS

教学进程教学进程

● ● 3. 3. 逻辑操作符逻辑操作符

●● 求变量或标号类型值求变量或标号类型值

格式:格式: TYPE TYPE 变量或标号变量或标号

功能功能:若为变量,则程序将回送该变量以字节数表示的类型:若为变量,则程序将回送该变量以字节数表示的类型 ::

DBDB 为为 11 ,, DWDW 为为 22 ,, DDDD为为 44 ,, DQDQ 为为 88 ,, DTDT 为为 1010 。。

若为标号,则程序将回送代表该标号类型的数值若为标号,则程序将回送代表该标号类型的数值 : : NEARNEAR

为为 -1-1 ,, FRAFRA 为为 -2-2 。。

5.1.2 5.1.2 汇编语言语句 汇编语言语句

例例 ::

ARRAYARRAY DW 1DW 1 ,, 22 ,, 33

MOVMOV AX AX ,, 05H05H

ADD ADD AXAX ,, TYPE ARRAYTYPE ARRAY ;; AX=5+2=7 AX=5+2=7

教学进程教学进程

● ● 4.4. 数值回送操作符数值回送操作符

●●

格式:格式: OFFSETOFFSET 变量或标号 变量或标号 功能:返回变量或标号所在段的段内偏移地 功能:返回变量或标号所在段的段内偏移地

例例 : MOV AX OFFSET LABEL: MOV AX OFFSET LABEL ;;

AX=0001H AX=0001H

5.1.2 5.1.2 汇编语言语句 汇编语言语句

●●取段基地址取段基地址

格式:格式: SEG SEG 变量或标号变量或标号

功能:返回变量或标号所在段的段地址功能:返回变量或标号所在段的段地址

例 例 : : MOV DX SEG LABELMOV DX SEG LABEL ;;

AX=1000HAX=1000H

教学进程教学进程

4.4. 数值回送操作符数值回送操作符●●

取地址的偏移量取地址的偏移量

●●

格式:格式: LENGTH LENGTH 变量变量

功能:如果变量是用功能:如果变量是用 DUPDUP 说明,则返回说明,则返回 DUPDUP 定义变量的定义变量的

重重

复次数,否则,返回值为 复次数,否则,返回值为 11 。 。 ●● 取变量字节数取变量字节数

格式:格式: SIZE BIANL1SIZE BIANL1

功能:返回变量的字节数,等于功能:返回变量的字节数,等于 LENGTHLENGTH 与与 TYPETYPE 的乘积。的乘积。

例例: : BUFFER1 DB 10 DUPBUFFER1 DB 10 DUP (( 10H10H)) BUFFER2 DW 20 DUPBUFFER2 DW 20 DUP (( 20H20H)) MOV AXMOV AX ,, LENGTH BUFFER1LENGTH BUFFER1 ;; AX=10AX=10 MOV BXMOV BX ,, SIZE BUFFER2 SIZE BUFFER2 ;; BX=20 BX=20

教学进程教学进程

5.1.2 5.1.2 汇编语言语句 汇编语言语句 4.4. 数值回送操作符数值回送操作符●●

取变量单元数取变量单元数

5.1.25.1.2 汇编语言语句 汇编语言语句

●● PTRPTR 操作符操作符 格式:类型格式:类型 PTR PTR 符号名符号名 功能:该操作符用于指定操作数的类型。功能:该操作符用于指定操作数的类型。

属性操作符属性操作符

教学进程教学进程

5.5.

●● THISTHIS 操作符操作符

格式:格式: THIS THIS 类型类型

功能:把它后面指定的类型或距离属性赋给当前的变量、标号或定 功能:把它后面指定的类型或距离属性赋给当前的变量、标号或定 制表达式。 制表达式。

●● 段操作符段操作符

格式:段寄存器名:地址表达式格式:段寄存器名:地址表达式

功能:用来表示变量或地址表达式的段属性。功能:用来表示变量或地址表达式的段属性。

●●

格式:格式: SHORT SHORT 标号标号

功能:用来修饰转移指令的目标地址的属性,偏移量为功能:用来修饰转移指令的目标地址的属性,偏移量为 88位。 位。

●● 分类运算符分类运算符

格式:格式: HIGH HIGH 表达式表达式 LOW LOW 表达式表达式

功能:从表达式种分离出高字节、低字节。 功能:从表达式种分离出高字节、低字节。

运算符运算符 : : EQEQ (相等)、(相等)、 NENE (不等于)、(不等于)、 LTLT (小于)、(小于)、 GTGT (大(大于)、于)、 LELE (小于或等于)、(小于或等于)、 GEGE (大于或等于),当关系成立时,(大于或等于),当关系成立时, 运算结果为 运算结果为 11 (( FFHFFH或或 FFFFHFFFFH)) ,, 否则为否则为 00 。 。

格式:表达式格式:表达式 1 1 关系运算符 表达式关系运算符 表达式 2 2

SHORTSHORT 操作符操作符

教学进程教学进程

5.1.2 5.1.2 汇编语言语句 汇编语言语句 属性操作符属性操作符5.5.

6.6.关系运算符关系运算符

优先级 运算符(操作符) 高       

括号中的表达式LENGTH , SIZE , WIDTH , MASKPRT , OFFSET , SEG , TYPE , THIS ,段前缀HIGH , LOW

* , / , MOD , SHL , SHR

+ , -

EQ , NE , LT , TE , GT , GE

NOT

OR , XOR

SHORT

5.1.25.1.2 汇编语言语句 汇编语言语句

运算的优先级别运算的优先级别

教学进程教学进程

7.7.

●● EQU EQU 等价伪指令等价伪指令

格式:符号名 格式:符号名 EQU EQU 表达式表达式

功能:用来定义一个符号,用该符号代表机器指令助记符、伪功能:用来定义一个符号,用该符号代表机器指令助记符、伪

指令助记符、寄存器名字、各种运算符号、常数等。 指令助记符、寄存器名字、各种运算符号、常数等。

伪指令语句伪指令语句

例例 : : VALVAL EQUEQU 100100 JIAJIA EQUEQU ADDADD ADRADR EQU EQU [SI+BX+1000H][SI+BX+1000H] MOV MOV ALAL ,, VALVAL JIAJIA ALAL ,, 1010 MOVMOV ADR ADR ,, AL AL

1. 1. 符号定义伪指令符号定义伪指令

教学进程教学进程

5.1.35.1.3

●● 等号伪指令等号伪指令

格式:符号名=表达式格式:符号名=表达式

功能:等号伪指令用来定义一个符号,用该符号代表表达式、功能:等号伪指令用来定义一个符号,用该符号代表表达式、

常数等。 常数等。

5.1.35.1.3

教学进程教学进程

伪指令语句伪指令语句 (( 续续 ))

1. 1. 符号定义伪指令符号定义伪指令

●● 解除符号定义伪指令解除符号定义伪指令

格式:格式: PURGEPURGE 符号符号 11 ,符号,符号 22 ,……,……

功能:用来解除之前引用符号的定义。 功能:用来解除之前引用符号的定义。

数据定义伪指令有数据定义伪指令有五种五种:: DBDB 、、 DWDW 、、 DDDD、、 DQDQ 、、 DTDT 和和 DUPDUP 。。

格式格式: 变量名: 变量名 DB DB 表达式;定义字节表达式;定义字节

变量名变量名 DW DW 表达式;定义字表达式;定义字

变量名变量名 DD DD 表达式;定义双字表达式;定义双字

变量名变量名 DQ DQ 表达式;定义表达式;定义 88 个字节个字节

变量名变量名 DT DT 表达式;定义表达式;定义 1010 个字节个字节

复制次数 复制次数 DUP DUP 表达式 表达式

功能功能:其中,:其中, DTDT 伪操作指令用来定义伪操作指令用来定义 1010 个字节,其后的每个操作个字节,其后的每个操作

数占有数占有 1010 个字节,形成压缩的个字节,形成压缩的 BCDBCD 码;码; DUPDUP 指令可以为若指令可以为若

干重复数据分配内存单元。 干重复数据分配内存单元。

 

5.1.3 5.1.3 伪指令语句伪指令语句

数据定义伪指令数据定义伪指令

教学进程教学进程

2.2.

格式:格式:

5.1.3 5.1.3 伪指令语句伪指令语句

段定义伪指令 段定义伪指令

教学进程教学进程

3.3.

段名段名 SEGMENTSEGMENT

…… ……

段名段名 ENDSENDS

段定义时,必须将段和段寄存器自之间建立对应关系,可以用段定义时,必须将段和段寄存器自之间建立对应关系,可以用

ASSUMEASSUME 伪操作来实现,其格式为:伪操作来实现,其格式为:

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

例: 例: * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * *     data_seg1 segmentdata_seg1 segment ;;定义数据段定义数据段  ……  ……     data_seg1 endsdata_seg1 ends * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * *     code_seg segmentcode_seg segment ;;定义代码段 定义代码段 assumeassume dsds :: data_seg1data_seg1 , , eses :: data_seg1data_seg1   assume assume cscs :: code_seg code_seg      startstart :: ; ;程序执行的起始地址程序执行的起始地址         mov mov      axax , , data_seg1 data_seg1    ; ;数据段地址 数据段地址          mov mov      dsds , , ax ax ;;存入存入 DSDS 寄存器寄存器         mov mov      axax , , data_seg1data_seg1 ;;附加段地址附加段地址         mov mov      eses , , axax ;;存入存入 ESES 寄存器寄存器   …… ……          code_seg ends code_seg ends                   ; ;代码段结束代码段结束     * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * *     end end      start start

5.1.3 5.1.3 伪指令语句伪指令语句

教学进程教学进程

段定义伪指令举例段定义伪指令举例

格式:格式:

功能:完成过程定义,在过程体功能:完成过程定义,在过程体

中实现过程的操作功能。 中实现过程的操作功能。

过程名 PROC

…… 过程体

RET

过程名 ENDP

5.1.3 5.1.3 伪指令语句伪指令语句

过程定义伪指令过程定义伪指令

教学进程教学进程

4.4.

例: CODE SEGMENT

APRC PROC NEAR

ADD AX , BX

……

RET

APRC ENDP

START : MOV AX , CX

CALL APOC

……

CODE ENDS

END START

条件汇编有多种伪操作指令:条件汇编有多种伪操作指令:(( 11 )) IF IF 表达式表达式 功能:表达式为功能:表达式为 11 ,汇编程序段,汇编程序段 11 ,否则跳过。,否则跳过。(( 22 )) IFE IFE 表达式表达式 功能:表达式为功能:表达式为 00 ,汇编程序段,汇编程序段 11 ,否则跳过。,否则跳过。(( 33 )) IFB IFB 参数参数 功能:参数为空格,汇编程序段功能:参数为空格,汇编程序段 11 ,否则跳过。,否则跳过。

5.1.3 5.1.3 伪指令语句伪指令语句

格式:格式: IFIF ×× ×× 表达式表达式 …… …… 程序段程序段 11

ELSEELSE

…… …… 程序段程序段 22

ENDIFENDIF

5. 5.

教学进程教学进程

条件汇编伪指令条件汇编伪指令

(( 44 )) IFNB IFNB 参数参数

功能:参数不为空格,汇编程序段功能:参数不为空格,汇编程序段 11 ,否则跳过。,否则跳过。

(( 55 )) IFIDN IFIDN 参数参数 11 ,参数,参数 22

功能:字符串参数功能:字符串参数 11 与字符串参数与字符串参数 22 相同,汇编程序相同,汇编程序 11 ,否则跳过。,否则跳过。

5.1.3 5.1.3 伪指令语句伪指令语句

例: 例: AAAA EQUEQU 10H10H…………

IFIF AA-10HAA-10HMOVMOV CLCL ,, 44SALSAL ALAL ,, CLCLELSEELSEMOVMOV CLCL ,, 44SARSAR ALAL ,, CLCLEND IFEND IF

教学进程教学进程

条件汇编有多种伪操作指令(续)条件汇编有多种伪操作指令(续)5. 5. 条件汇编伪指令条件汇编伪指令

格式:宏指令名 格式:宏指令名 MACRO [MACRO [ 形式参数形式参数 11 ,形式参数,形式参数 22 ,…,…

…… ]]

…………

ENDMENDM

其中,其中, MACROMACRO 和和 ENDMENDM 是一对伪操作。是一对伪操作。

宏指令语句宏指令语句

1.1. 宏指令的定义宏指令的定义

教学进程教学进程

5.1.45.1.4

5.1.45.1.4 宏指令语句 宏指令语句

………… MIN CLMIN CL ,, [SI][SI] ,, [DI][DI] ;把由;把由 SISI 和和 DIDI 间接寻址的两个内间接寻址的两个内存单元中存单元中 ;不带符号数中小的送入;不带符号数中小的送入 CLCL …… ……汇编后展开:汇编后展开:

…………++ PUSH PUSH AXAX++ MOV MOV ALAL ,, [SI][SI] ;实参;实参 [SI][SI] 替换形参替换形参 SR1SR1++ CMP CMP ALAL ,, [DI][DI] ;实参;实参 [DI][DI] 替换形参替换形参 SR2SR2++ JNB JNB ??00??00 ;符合地址;符合地址 ADDRADDR 被被 ??00??00 替换替换++ MOV MOV ALAL ,, [DI][DI]++ ??00??00 : : MOV MOV CLCL ,, ALAL ;实参;实参 CLCL替换形参替换形参 DESDES++ POP POP AXAX

…………+号代表宏展开的语句。+号代表宏展开的语句。

教学进程教学进程

宏调用宏调用举举例例

5.1.45.1.4 宏指令语句 宏指令语句

格式:格式: LOCALLOCAL 符号地址符号地址 11 ,符号地址,符号地址 22 ,……,……

●● 这些符号地址在宏展开时,由汇编程序重新命名。这些符号地址在宏展开时,由汇编程序重新命名。

局域符号定义局域符号定义

●●例:例:宏定义可以无参数宏定义可以无参数宏定义:宏定义:SAVEREG SAVEREG MACROMACRO

PUSH PUSH AXAXPUSHPUSH BX BXPUSHPUSH CX CXPUSHPUSH DX DXENDMENDM

宏调用:宏调用:SAVEREGSAVEREG

3. 3. 宏指令举例 宏指令举例

教学进程教学进程

2.2.

● ● 例:宏定义参数可以时操作码例:宏定义参数可以时操作码 宏定义:宏定义: REGINCREGINC MOCROMOCRO P1P1 ,, P2P2 ,,P3P3

MOV AXMOV AX ,, P1P1P2P2 P3P3ENDMENDM

宏调用:宏调用:REGINCREGINC IVAR1IVAR1 ,,

INCINC ,, AXAX 宏展开:宏展开: ++ MOV AXMOV AX ,, IVAR1IVAR1 ++ INCINC AX AX

5.1.45.1.4 宏指令语句 宏指令语句

●● 伪操作伪操作 PURGEPURGE 可以取消宏定义可以取消宏定义

宏定义:宏定义:

ADD2ADD2 MACROMACRO OPTR1OPTR1 ,, OPTR2OPTR2 ,,

RESULTRESULT

MOVMOV AX AX ,, OPTR1OPTR1

ADDADD AX AX ,, OPTR2OPTR2

MOV MOV RESULTRESULT ,, AXAX

ENDMENDM

宏调用:宏调用:

ADD2ADD2 XXXX ,, YYYY,, ZZZZ

PURGEPURGE ADD2 ADD2

教学进程教学进程

伪操作伪操作 PURGEPURGE

汇编语言程序设计汇编语言程序设计 5.2.15.2.1 顺序程序设计 顺序程序设计

● ● 例:计算例:计算 Y=5X+8Y=5X+8 ,设,设 XX 为无符号字节数据,且在为无符号字节数据,且在 ARGXARGX 单元单元存放。计算结果,存入存放。计算结果,存入 RLTYRLTY单元。单元。

教学进程教学进程

5.25.2

SSEGSSEG SEGMENT SEGMENT STACKSTACK ;堆栈段开始;堆栈段开始 STKSTK DB DB 20 DUP(0)20 DUP(0) SSEGSSEG ENDS ENDS ;堆栈段结束;堆栈段结束 DSEGDSEG SEGMENT SEGMENT ;数据段开始;数据段开始 ARGXARGX DB DB 1515 RLTYRLTY DW DW 00 DSEGDSEG ENDS ENDS ;数据段结束;数据段结束 CSEGCSEG SEGMENT SEGMENT ;代码段开始;代码段开始 ASSUMEASSUME CSCS :: CSEGCSEG ,, DSDS :: DSEGDSEG ASSUMEASSUME SSSS :: SSEGSSEG

CALCCALC :: MOVMOV AXAX ,, DSEGDSEG MOVMOV DSDS ,, AXAX MOVMOV AXAX ,, SSEGSSEG MOVMOV SSSS ,, AXAX MOVMOV SPSP ,, LENGTH STKLENGTH STK MOVMOV ALAL ,, ARGXARGX ;取原始数;取原始数 MOVMOV BLBL ,, 0505 MULMUL BLBL ;计算;计算 5x5x MOVMOV BXBX ,, 0808 ADDADD AXAX ,, BXBX ;再加上;再加上 88 MOVMOV RLTYRLTY,, AXAX ;保存结果;保存结果 MOVMOV AXAX ,, 4C00H4C00H INTINT 21H21HCSEGCSEG ENDS ENDS ENDEND CALC CALC

教学进程教学进程

顺序程序设计举例顺序程序设计举例 (( 续续 ))

●● 分支程序设计举分支程序设计举例:设内存中有三个互不相等的无符号字数据,分例:设内存中有三个互不相等的无符号字数据,分别存放在别存放在 ARGARG 开始的字单元,编制程序将其中最大值存入开始的字单元,编制程序将其中最大值存入 MAXMAX 单元。单元。

分支程序设计分支程序设计

教学进程教学进程

5.2.25.2.2

SSEGSSEG SEGMENTSEGMENT STACKSTACK

STKSTK DBDB 2020 DUP(0)DUP(0)

SSEGSSEG ENDSENDS

DSEGDSEG SEGMENTSEGMENT

ARGARG DWDW 7138H7138H ,, 84A6H84A6H ,, 29EH29EH

MAXMAX DWDW ??

DSEGDSEG ENDSENDS

CSEGCSEG SEGMENTSEGMENT

ASSUMEASSUME CSCS ::CSEGCSEG ,, DSDS :: DSEGDSEG

ASSUMEASSUME SSSS :: SSEG SSEG

STARTSTART :: MOVMOV AXAX ,, DSEGDSEG MOVMOV DSDS ,, AXAX MOVMOV AXAX ,, SSEGSSEG MOVMOV SSSS ,, AXAX MOVMOV SPSP ,, SIZESTKSIZESTK

LEALEA SISI,, ARGARG ;取数据首址;取数据首址 MOVMOV AXAX ,[,[ SISI ]] ;取第;取第 11 个数个数 MOVMOV BXBX ,[,[ SI+2SI+2]];取第;取第 22 个数个数

CMPCMP AXAX ,, BXBX ;两数比较;两数比较 JAEJAE FMAX1FMAX1 ;; AXAX 中的数大中的数大

MOVMOV AXAX ,, BXBX ;大数送;大数送 AXAXFMAX1FMAX1 :: CMPCMP AXAX ,[,[ SI+4SI+4 ]];大数与第;大数与第 33 个数比个数比

较较 JAEJAE FMAX2FMAX2 ;; AXAX 中的数大中的数大 MOVMOV AXAX ,[,[ SI+4SI+4]];第;第 33 个数大个数大FMAX2FMAX2 :: MOV MOV MAXMAX ,, AXAX ;保存最大;保存最大

值值 MOVMOV AXAX ,, 4C00H4C00H INTINT 21H 21HCSEG ENDSCSEG ENDSENDFENDF START START

教学进程教学进程

分支程序设计举例分支程序设计举例 (( 续续 ))

循环程序设计循环程序设计

11 、循环的结构形式 、循环的结构形式

教学进程教学进程

5.2.35.2.3

循环控制条件

NN

YY

(a) DO_WHILE(a) DO_WHILE 结构结构

循环初试状态

循环体

循环控制条件循环控制条件NN

YY

(b) DO_UNTIL(b) DO_UNTIL 结构结构

循环初试状态循环初试状态

循环体循环体

5.2.35.2.3 循环程序设计 循环程序设计

例例 :: 内存内存 DATADATA 开始存放开始存放 100100 个单字节数据。编写程序统计这些数据个单字节数据。编写程序统计这些数据

内所有为内所有为 ““ 11”” 的位的个数,将结果存入的位的个数,将结果存入 NUMBNUMB 单元。单元。

完成此例需要统计每一个字节数据中“完成此例需要统计每一个字节数据中“ 11”” 的个数,可以用右移指令把的个数,可以用右移指令把

该数据的各位逐个移到进位标志位该数据的各位逐个移到进位标志位 CFCF 中,当中,当 CF=1CF=1 ,计数器值加,计数器值加 11 ,,

直到直到 100100 个数据检查完毕。个数据检查完毕。

22 、、

教学进程教学进程

循环程序的设计方法循环程序的设计方法

5.2.35.2.3 循环程序设计 循环程序设计

源代码清单:源代码清单:SSEGSSEG SEGMENTSEGMENT STACK STACK 开始开始STACK DW STACK DW 100 DUP(0) 100 DUP(0) SSEGSSEG ENDS ENDS DSEGDSEG SEGMENTSEGMENTASSUME ASSUME CSCS :: CSEGCSEG ,, DSDS :: DSEGDSEGASSUME ASSUME SSSS :: SSEG SSEG STARTSTART : : MOVMOV AXAX ,, DSEG DSEG MOVMOV DSDS ,, AXAX MOVMOV AXAX ,, SSEGSSEG MOVMOV SSSS ,, AXAX

MOVMOV SPSP ,, SIZE STACKSIZE STACK MOVMOV SISI,, OFFSET DATAOFFSET DATA MOVMOV CLCL ,, 100100 XORXOR ALAL ,, ALAL

教学进程教学进程

5.2.35.2.3 循环程序设计 循环程序设计

LOOP2LOOP2 : : MOVMOV CHCH ,, 08H08H

XORXOR BHBH ,, BHBH

MOV MOV AHAH ,[,[ SISI]]LOOP1LOOP1 :: RORROR AHAH ,, 11

JNCJNC CHT1CHT1INCINC BHBH

CHT1CHT1 :: DECDEC CHCHJNZJNZ LOOP1LOOP1INCINC SISIDECDEC CHCHJNZJNZ LOOP2LOOP2MOVMOV DNUMBDNUMB ,, BHBHMOVMOV AHAH ,, 4CH4CHINTINT 21H21H

CSEGCSEG ENDSENDSENDEND START START

教学进程教学进程

格式:格式:

过程名过程名 PROC PROC 属性属性

…… ……

过程名过程名 ENDPENDP

●● 过程名为标识符,它又是子程序入口的符号地址,与标号的作用相同。过程名为标识符,它又是子程序入口的符号地址,与标号的作用相同。

●● 属性(属性( AttributeAttribute )是指类型属性,可以是)是指类型属性,可以是 NEARNEAR 或或 FARFAR 。。

用户对过程属性的确定原则很简单,即:用户对过程属性的确定原则很简单,即:

(( 11 )如果调用程序和过程在同一个代码段中,则使用)如果调用程序和过程在同一个代码段中,则使用 NEARNEAR 属性。属性。

(( 22 )如果调用程序和过程不在同一个代码段中,则使用)如果调用程序和过程不在同一个代码段中,则使用 FARFAR 属性。属性。

一般子程序有五部分组成 一般子程序有五部分组成 ::

子程序设计子程序设计

1.1. 过程定义 过程定义

教学进程教学进程

5.2.45.2.4

5.2.45.2.4 子程序设计 子程序设计

●●现场——主程序在调用子程序前可能在现场——主程序在调用子程序前可能在 CPUCPU 寄存器和内存中存有寄存器和内存中存有

一一

些有用的数据,这些数据就是调用前的现场, 些有用的数据,这些数据就是调用前的现场,

●●现场保护——在子程序的执行过程中很可能会改表这些单元的内容。现场保护——在子程序的执行过程中很可能会改表这些单元的内容。

因此在子程序开始执行前,把主程序中有用的数据先保 因此在子程序开始执行前,把主程序中有用的数据先保

存到堆栈中,这向工作称为现场保护。 存到堆栈中,这向工作称为现场保护。

●●恢复——为使子程序返回到主程序后,主程序能够在原有环境下继恢复——为使子程序返回到主程序后,主程序能够在原有环境下继

续执行,必须将现场保护时保存在堆栈中的现场数据重 续执行,必须将现场保护时保存在堆栈中的现场数据重

新恢复。 新恢复。

2.2.

教学进程教学进程

现场的保存与恢复现场的保存与恢复

5.2.45.2.4 子程序设计 子程序设计

● ● 子程序调用除一般的简单调用外,还可以嵌套调用、递归调用。子程序调用除一般的简单调用外,还可以嵌套调用、递归调用。

● ● 在子程序执行完毕后,必须回到调用它的主程序。因此,在每在子程序执行完毕后,必须回到调用它的主程序。因此,在每

个子程序结束时必须有返回指令,返回指令为个子程序结束时必须有返回指令,返回指令为 RETRET 。 。

3.3.

教学进程教学进程

子程序的调用和返回子程序的调用和返回

5.2.45.2.4 子程序设计 子程序设计

4.4.

例:十进制到十六进制数转换程序。程序要求从键盘取得一个十进例:十进制到十六进制数转换程序。程序要求从键盘取得一个十进 制数,然后把该数以十六进制形式在屏幕上显示出来。 制数,然后把该数以十六进制形式在屏幕上显示出来。

采用子程序结构,用一个子程序采用子程序结构,用一个子程序 DECIBINDECIBIN实现从键盘取得十进实现从键盘取得十进

制数并把它转换为二进制数;另一个子程序制数并把它转换为二进制数;另一个子程序 BINIHEXBINIHEX 把此二进把此二进

制数以十六进制数的形式在屏幕上显示出来。各个子程序之间用制数以十六进制数的形式在屏幕上显示出来。各个子程序之间用

BXBX 寄存器来传送信息。 寄存器来传送信息。 CSEGCSEG      segmentsegment     ssume ssume    CSCSEGCSCSEG main main      procproc farfar ; 程序的主要部分; 程序的主要部分STARTSTART :: call call      decibindecibin ;; 调用子程序调用子程序 decibindecibin         call call      crlfcrlf ;; 调用子程序调用子程序 crlfcrlf         call call      binihex binihex ;; 调用子程序调用子程序 binihexbinihex

教学进程教学进程

程序举例程序举例

call    crlf      jmp    repeat main   endp decibin   proc near ; 子程序 decibin     mov bx , 0 newchar : mov ah , 1      int 21h ; 从键盘接收单个字符 ; 非 0〜 9之间的数退出     sub al , 30h      jl exit      cmp al , 9d      jg exit      cbw ; al 扩展到 ax ; BX 中的数乘以 10 xchg ax , bx      mov cx , 10d      mul cx      xchg ax , bx

5.2.4 5.2.4 子程序设计 子程序设计

教学进程教学进程

4.4. 程序举例程序举例 (( 续续 ))

addadd bxbx ,, ax ax              jmpjmp newchar newchar      ; 接收下一个字符; 接收下一个字符exitexit :: ret ret decibindecibin    endp endp Binihex procBinihex proc near near ; 子程序; 子程序 binihexbinihex movmov chch ,, 4 4 rotaterotate :: movmov clcl ,, 4 4          rolrol bxbx ,, cl cl          movmov alal ,, bl bl          andand alal ,, 0fh 0fh          addadd alal ,, 30h 30h          cmp cmp alal ,, 3ah 3ah              jljl printit printit              add add alal ,, 7h 7h printitprintit :  :  movmov dldl ,, al al     mov mov ahah ,, 2 2              intint 21h 21h              decdec ch ch              jnzjnz rotate rotate              ret ret

教学进程教学进程

5.2.4 5.2.4 子程序设计 子程序设计 4.4. 程序举例程序举例 (( 续续 ))

binihexbinihex    endpendp

             crlfcrlf procproc near near  ; 子程序 ; 子程序 crlfcrlf

     ; 显示回车 ; 显示回车              movmov dldl ,, 0dh 0dh

             movmov ahah ,, 2 2

             intint 21h 21h

     ; 显示换行 ; 显示换行             movmov dldl ,, 0ah 0ah

             movmov ahah ,, 2 2

             intint 21h 21h

             ret ret

    crlf crlf     endpendp

    CSEG endsCSEG ends

         end end      main main

教学进程教学进程

5.2.4 5.2.4 子程序设计 子程序设计 4.4. 程序举例程序举例 (( 续续 ))

● ● 返回系统(功能号:返回系统(功能号: 4CH4CH))

功能:在程序结束后,将对微机的控制权交换给操作系统。功能:在程序结束后,将对微机的控制权交换给操作系统。

●● 显示字符串(功能号:显示字符串(功能号: 09H09H))

功能:可以将内存缓冲区中的字符串输出到显示器,缓冲区的字符功能:可以将内存缓冲区中的字符串输出到显示器,缓冲区的字符

串以 串以 $$作为结束符,缓冲区首地址在寄存器作为结束符,缓冲区首地址在寄存器 DXDX 中。 中。

DOSDOS 功能调用功能调用

教学进程教学进程

5.2.55.2.5

●● 第第 55 章 汇编语言章 汇编语言

●● —— —— 重要知识点重要知识点

教学进程教学进程

小结小结

5.1 80865.1 8086 汇编语言基础汇编语言基础

●● 5.1.1 5.1.1 汇编语言基本语法汇编语言基本语法

●● 5.1.2 5.1.2 汇编语言语句汇编语言语句

●● 5.1.3 5.1.3 伪指令语句伪指令语句

●● 5.1.4 5.1.4 宏指令语句宏指令语句

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

●● 5.2.1 5.2.1 顺序程序设计顺序程序设计

●● 5.2.2 5.2.2 分支程序设计分支程序设计

●● 5.2.3 5.2.3 循环程序设计循环程序设计

●● 5.2.4 5.2.4 子程序设计子程序设计

5.2.5 DOS5.2.5 DOS 功能调用功能调用