第4章 汇编语言程序设计

4.1 汇编语言程序格式

4.1.1 汇编语言的程序结构

1)  指令语句(Instructions)

指令语句是功能性语句,由Intel 8086/8088 CPU提供的指令形成,实现一定的操作功能,能够被编译成机器代码。

2)  伪指令语句(Directives)

伪指令语句也叫指示性语句,只是为汇编程序在翻译汇编语言源程序时提供有关信息,并不产生机器代码。

如:
BUF1 DB 34H
BUF2 DB 2AH
SUM DB ?

4.1.2 汇编语言的语句格式

1.名字

  1. 名字的标识符
    可由下列符号组成:
    (1) 英文字母(A~Z,a~z);
    (2) 数字(0~9);
    (3) 特殊符号(?、@、_等)。

  2. 名字的定义规则
      (1) 数字不能作为名字的第一个符号;
      (2) 单独的问号(?)不能作为名字;
      (3) 一个名字的最大有效长度为31,超过31的部分计算机不再识别;
      (4) 汇编语言中有特定含义的保留字,如操作码、寄存器名等,不能作为名字使用。
      名字为了便于记忆,应该做到见名知义,如用BUFFER表示缓冲区、SUM表示累加和等。

  3. 名字的两种主要形式
    (1) 标号:
    标号有三种属性:段基值、段内偏移量(或相对地址)和类型属性。
    段基值(SEG)属性:是标号所在逻辑段的段基值,即段起始地址的前16位。此值必须在一个段寄存器中,而标号的段则总是在CS寄存器中。
    段内偏移量(OFFSET)属性:是标号距离段起始地址的字节数,对于16位段是16位无符号数;对于32位段则是32位无符号数。
      类型(TYPE)属性:类型表示该标号所代表的指令的转移范围,分为NEAR和FAR两种。如果为NEAR型,则标号只能在段内引用;如果为FAR型,则标号可以在段间引用。
    (2) 变量:
    BYTE(DB,1个字节长)、WORD(DW,2个字节长)、DWORD(DD,4个字节长)、FWORD(DF,6个字节长)、QWORD(DQ,8个字节长)、TBYTE(DT,10个字节长)。

2. 指令助记符

指令助记符用来指明不同的操作指令。如MOV,ADD等都是指令助记符。

3. 操作数

4.注释

由分号(;)开始

续行符用(&)

4.1.3 汇编语言的运算符

1.分析运算符

(1) SEG:返回变量或标号所在段的段基值
OFFSET:返回变量或标号的段内偏移量。
(2)TYPE:返回变量或标号的类型属性值
在这里插入图片描述
(3) LENGTH:返回变量数据区分配的数据项总数。
SIZE:返回变量数据区分配的字节个数。

2. 组合运算符

(1)PTR: 对已分配的存储器地址临时赋予另一种类型属性,但不改变操作数本身的类型属性,同时保留存储器地址的段基址和段内偏移量的属性。
(2)THIS:用来定义一个新类型的变量或标号。

3. 分离运算符

(1)  LOW运算符。
格式:LOW 表达式
功能:取表达式的低字节返回。
(2)  HIGH运算符。
格式:HIGH 表达式
功能:取表达式的高字节返回。

例如:
MOV AL,LOW 2238H ;AL←38H
MOV AH,HIGH 2238H ;AH←22

4.2 伪指令

4.2.1 定义符号的伪指令

1. 等值伪指令EQU

2. 等号伪指令“=”

3. 解除定义伪指令PURGE

格式:PURGE <符号1,符号2,…,符号N>
功能:解除指定符号的定义。解除符号定义后,可用EQU重新进行定义。

如:
Y1 EQU 7 ;定义Y1的值为7
PURGE Y1 ;解除Y1的定义
Y1 EQU 36 ;重新定义Y1的值为36

4.2.2 定义数据的伪指令

BYTE(DB,1个字节长)、
WORD(DW,2个字节长)、
DWORD(DD,4个字节长)、
FWORD(DF,6个字节长)、
QWORD(DQ,8个字节长)、
TBYTE(DT,10个字节长)。

4.2.3 定义程序开始和结束的伪指令

开始部分:可以用NAME或TITLE为模块命名

NAME MODULE_NAME
TITLE TEXT(可指定列表文件的每一页上打印的标题)

结束部分

END [LABEL]
(标号(LABEL)指示程序开始执行的起始地址)

4.2.4 指令集选择伪指令

(1) .8086:选择8086指令系统。
(2) .286:选择80286指令系统。
(3) .286P:选择保护方式下的80286指令系统。
(4) .386:选择80386指令系统。
(5) .386P:选择保护方式下的80386指令系统。
(6) .486:选择80486指令系统。
(7) .486P:选择保护方式下的80486指令系统。
(8) .586:选择Pentium指令系统。
(9) .586P:选择保护方式下的Pentium指令系统。

4.2.5 地址计数器与对准伪操作

1. 地址计数器——$

2. ORG伪操作

ORG伪操作用来设置当前地址计数器的值

如:
VECTORS SEGMENT
ORG 10
VECT1 DW 47A5H
ORG 20
VECT2 DW 0C596H
VECTORS ENDS
则VECT1的偏移地址值为0AH,而VECT2的偏移地址值为14H。

3. EVEN伪操作

使下一个变量或指令开始于偶数字节地址。

4. ALIGN伪操作

为保证双字类型数组边界从4的倍数开始创造了条件,其格式为
ALIGN BOUNDARY
其中,BOUNDARY必须是2的幂

例如:
.DATA

ALIGN 4
ARRAY DB 100 DUP(?)

就可保证ARRAY的值为4的倍数。当然,ALIGN 2和EVEN是等价的。

4.3 汇编语言源程序结构

1.例程

例如,下面是一个的对应关系标准的汇编源程序段定义。
DATE_SEG1  SEGMENT		;定义数据段
...
DATE_SEG1  ENDS		;数据段结束 
DATA_SEG2  SEGMENT		;定义数据附加段
  	     ...
DATA_SEG2  ENDS		;数据附加段结束 
CODE_SEG	  SEGMENT		;定义代码段
		  ASSUME  CS:CODE_SEG,DS:DATA_SEG1,ES:DATA_SEG2
START:				;开始执行的入口地址
;设置DS寄存器为当前数据段
		MOV	AX,DATA_SEG1  ;将数据段地址赋予DS
		MOV	DS,AX			
;设置ES寄存器为当前附加段
		MOV	AX,DATA_SEG2  ;将附加数据段地址赋予ES
		MOV	ES,AX			
CODE_SEG	ENDS			   ;代码段定义结束
		END		START	   ;源程序结束

4.4 汇编语言程序的上机过程

在计算机上运行汇编语言程序的步骤是:
(1) 用编辑程序建立 .ASM源文件;
(2) 用MASM程序把 .ASM文件汇编成 .OBJ文件;
(3) 用LINK程序把 .OBJ文件连接成.EXE文件;
(4) 用DOS命令直接键入文件名就可执行该程序。

4.5 汇编语言程序设计

4.5.1 流程图(Flowchart)的组成

在这里插入图片描述

4.5.6 BIOS功能调用

1)BIOS中断调用方法

例如 MOV AH,0 ;分功能号为0
MOV AL,10H ;置入口参数
INT 1AH ;1AH为中断号,功能为读时间计数器的值

2) BIOS打印功能

MOV AH,0 ;请求打印
MOV AL,CHAR ;写入打印字符
MOV DX,0 ;设置0#打印口
INT 17H ;调用BIOS

MOV AH,01 ;初始化打印机
MOV DX,0 ;设置0#打印口
INT 17H ;调用BIOS

4.5.7 DOS功能调用

1) DOS软中断(INT 20H~INT 27H)指令

在这里插入图片描述

宏调用

MICRO

INPUT MACRO ;定义一条从键盘输入一个字符的宏指令INPUT
LF MACRO ;定义一条换行宏指令LF

4.6 程序设计举例

猜你喜欢

转载自blog.csdn.net/William__Ma/article/details/128908327
今日推荐