学习要求
● 掌握 16位指令系统中常用指令的使用。
● 掌握源程序中常用的伪指令。
● 掌握宏汇编源程序的结构及其编程方法。
● 掌握宏汇编语言上机调试过程。
3.1 16位汇编程序设计概述
在 DOS下用汇编语言开发程序的工具是
Masm和 Tasm。 Masm常用的有 Masm611
和 Masm614两个版本,Tasm是 Borland
公司提供的工具。
用 Masm.exe来将源程序生成目标文件。
ML.exe既可以产生目标文件,也可以产生可执行文件。调试可执行文件用
Debug.exe或 CV.exe。
汇编语言程序的特点
编程的第一步是编写源程序。
用记事本等一切可以以纯文本方式编辑保存文件的工具进行。文件必须保存为扩展名为 asm的文件,且文件名不能超过
8个 ASCII码字符。
汇编语言程序的特点
源程序中要使用指令,指令是最小的代码单元。指令分为两种,一种叫硬指令,
另一种叫伪指令。
硬指令是机器事实上存在的指令例如,MOV AX,1234
在源程序中写下这条指令,生成可执行文件后,反汇编仍然存在这条指令。
汇编语言程序的特点
伪指令是告诉编译器的一些说明性语句,
编译器承认,而 CPU中无此指令。
例如,X1 DW 0
这是一条用伪指令 DW定义字变量的语句,编译器会将它在数据段中产生一个字的空间且初始化为 0。程序中并没有
X1这个变量,其它指令操作该变量都会被编译成从 X1的地址读写数据。
指令寻址方式
从 8086的机器代码格式入手,论述:
立即数寻址方式
寄存器寻址方式
存储器寻址方式
进而熟悉 8086汇编语言指令格式,尤其是其中操作数的表达方法;为展开 8086指令系统做好准备指令的组成
指令由操作码和操作数两部分组成
操作码 说明计算机要执行哪种操作,如传送、运算、
移位、跳转等操作,它是指令中不可缺少的组成部分
操作数 是指令执行的参与者,即各种操作的对象
有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有 3个甚至 4个操作数操作码 操作数指令的操作码和操作数
每种指令的 操作码,
用一个唯一的助记符表示(指令功能的英文缩写)
对应着机器指令的一个二进制编码
指令中的 操作数,
可以是一个具体的数值
可以是存放数据的寄存器
或指明数据在主存位置的存储器地址寻址方式
指令系统设计了多种操作数的来源
寻找操作数的过程就是操作数的寻址
操作数采取哪一种寻址方式,会影响机器运行的速度和效率标准机器代码示例
mov ax,[BP+0] ;机器代码是 8B 46 00
前一个字节 8B是操作码(含 w= 1表示字操作)
中间一个字节 46( 01 000 110)是,mod reg
r/m”字节
reg= 000表示目的操作数为 AX
mod= 01和 r/m= 110表示源操作数为 [BP+D8]
最后一个字节就是 8位位移量 〔 D8= 〕 00
1/2字节 0/1字节 0/1/2字节 0/1/2字节操作码 mod reg r/m 位移量 立即数其它机器代码形式
mov al,05 ;机器代码是 B0 05
前一个字节 B0是操作码(含一个操作数 AL),
后一个字节 05是立即数
mov ax,0102H ;机器代码是 B8 02 01
前一个字节 B8是操作码(含一个操作数
AX),后两个字节 02 01是 16位立即数(低字节 02在低地址)
操作码 操作数指令的助记符格式操作码 操作数 1,操作数 2 ; 注释
操作数 2,称为 源操作数 src,它表示参与指令操作的一个对象
操作数 1,称为 目的操作数 dest,它不仅可以作为指令操作的一个对象,还可以用来存放指令操作的结果
分号后的内容是对指令的解释示例传送指令 MOV的格式
MOV dest,src ; dest←src
MOV指令的功能是将源操作数 src传送至目的操作数
dest,例如:
MOV AL,05H ; AL←05H
MOV BX,AX ; BX←AX
MOV AX,[SI] ; AX←DS:[SI]
MOV AX,[BP+06H] ; AX←SS:[BP+06H]
MOV AX,[BX+SI] ; AX←DS:[BX+SI]
演示立即数寻址方式
指令中的操作数直接存放在机器代码中,紧跟在操作码之后(操作数作为指令的一部分存放在操作码之后的主存单元中)
这种操作数被称为立即数 imm
它可以是 8位数值 i8( 00H~ FFH)
也可以是 16位数值 i16( 0000H~ FFFFH)
立即数寻址方式常用来给寄存器赋值立即数寻址指令
MOV AL,05H ; AL← 05H
MOV AX,0102H; AX← 0102H
指令功能 执行过程寄存器寻址方式
操作数存放在 CPU的内部寄存器 reg中,可以是:
8位寄存器 r8:
AH,AL,BH,BL,CH,CL,DH,DL
16位寄存器 r16:
AX,BX,CX,DX,SI,DI,BP,SP
4个段寄存器 seg:
CS,DS,SS,ES
寄存器寻址指令
MOV AX,1234H; AX← 1234H
MOV BX,AX ; BX← AX
指令功能 执行过程存储器寻址方式
指令中给出操作数的主存地址信息(偏移地址,
称之为有效地址 EA),而段地址在默认的或用段超越前缀指定的段寄存器中
8086设计了多种存储器寻址方式
1、直接寻址方式
2、寄存器间接寻址方式
3、寄存器相对寻址方式
4、基址变址寻址方式
5、相对基址变址寻址方式直接寻址方式
有效地址在指令中直接给出
默认的段地址在 DS段寄存器,可使用段超越前缀改变
MOV AX,[2000H]; AX← DS:[2000H];指令代码,A10020
MOV AX,ES:[2000H]; AX← ES:[2000H];指令代码,26A10020
指令功能执行过程寄存器间接寻址方式
有效地址存放在基址寄存器 BX或变址寄存器 SI,DI中
默认的段地址在 DS段寄存器,可使用段超越前缀改变
MOV AX,[SI] ; AX← DS:[SI]
指令功能 执行过程寄存器相对寻址方式
有效地址是寄存器内容与有符号 8位或 16
位位移量之和,寄存器可以是 BX,BP或
SI,DI
有效地址= BX/BP/SI/DI+ 8/16位位移量
段地址对应 BX/SI/DI寄存器默认是 DS,
对应 BP寄存器默认是 SS;可用段超越前缀改变寄存器相对寻址指令
MOV AX,[DI+06H]; AX← DS:[DI+06H]
MOV AX,[BP+06H]; AX← SS:[BP+06H]
指令功能 执行过程基址变址寻址方式
有效地址由基址寄存器( BX或 BP)的内容加上变址寄存器( SI或 DI)的内容构成:
有效地址= BX/BP+ SI/DI
段地址对应 BX基址寄存器默认是 DS,对应 BP基址寄存器默认是 SS;可用段超越前缀改变基址变址寻址指令
MOV AX,[BX+SI]; AX← DS:[BX+SI]
MOV AX,[BP+DI]; AX← SS:[BP+DI]
MOV AX,DS:[BP+DI]; AX← DS:[BP+DI]
指令功能执行过程相对基址变址寻址方式
有效地址是基址寄存器( BX/BP)、变址寄存器( SI/DI)与一个 8位或 16位位移量之和:
有效地址= BX/BP+ SI/DI+ 8/16位位移量
段地址对应 BX基址寄存器默认是 DS,对应 BP基址寄存器默认是 SS;可用段超越前缀改变相对基址变址寻址指令
MOV AX,[BX+SI+06H]; AX← DS:[BX+SI+06H]
位移量可用符号表示同一寻址方式有多种表达形式指令功能 执行过程汇编语言指令格式
由 4部分组成:
标号,指令助记符 目的操作数,源操作数 ;注释标号表示该指令在主存中的逻辑地址每个指令助记符就代表一种指令目的和源操作数表示参与操作的对象注释是对该指令或程序段功能的说明指令操作数的表达 ( 1)
r8—— 任意一个 8位通用寄存器
AH AL BH BL CH CL DH DL
r16—— 任意一个 16位通用寄存器
AX BX CX DX SI DI BP SP
reg—— 代表 r8或 r16
seg—— 段寄存器 CS/DS/ES/SS
指令操作数的表达 ( 2)
m8—— 一个 8位存储器操作数单元(所有主存寻址方式)
m16—— 一个 16位存储器操作数单元
(所有主存寻址方式)
mem—— 代表 m8或 m16
指令操作数的表达 ( 3)
i8—— 一个 8位立即数
i16—— 一个 16位立即数
imm—— 代表 i8或 i16
dest—— 目的操作数
src—— 源操作数