8086CPU的寻址方式
机器语言与汇编语言
机器语言能被计算机硬件直接识别并执行,它由二进制代码组成。
机器语言中的每一条 称为指令,计算机能够识别的所有指令的集合称为指令系统。
指令是计算机能够执行的最小 功能单位,机器语言程序就是由一条条的指令按一定顺序组织起来的指令序列。
计算机的 CPU 不同,指令系统也不同。INTEL 公司的 80X86 系列 CPU,因其硬件结构设计上的包容 性,指令系统具有兼容性,用 8088/8086CPU 的指令系统设计的程序可以在 80X86 系列的 CPU 上执行。8088/8086CPU 的指令系统常被称为 80X86 系列 CPU 的基础指令。
一条指令一般由操作码和操作数两部分组成。机器语言中操作码和操作数都是二进制代码,因而难于记忆、 书写和输入,即使对于计算机的设计者也一样难于使用。因此,对指令中的操作码和操作数 用便于记忆的符号代替,编程语言因而有了第一次发展。
汇编语言是一种符号语言。用汇编语言编制的程序称为汇编语言源程序,计算机不能直 接识别执行,必须翻译成机器语言程序。翻译的过程称为汇编,完成汇编工作的程序称为汇 编程序。汇编程序属于系统程序,是汇编语言的命令处理程序。
机器语言和汇编语言统称为低级语言。
3.2 8086CPU 寻址方式
1. 立即寻址
操作数是立即数,可以是 8 位或 16 位的二进制数,也可以是字符常数。立即数作为操作数,这个操作数的寻址方式称为立即寻址,其实它不用寻址。
MOV AX, 2000H ;2000H 是立即数操作数
注意:立即数操 作数只能作源操作数,不能作为目的操作数。
2. 直接寻址
操作数在内存中,指令中直接给出操作数所在的内存单元的偏移地址。可以是数值形式 的地址,也可以用符号表示。
MOV BL, [2000H]
MOV BX, [3200H] //将偏移地址为3200H为首地址的连续两个内存单元的内容传送给BX寄存器。
汇编语言中常常用一个符号代替数值,如 BUFF 代替 3200H.BUFF 称为符号地址。BUFF 需要在程序开始处予以定义.
MOV BX, [BUFF] ;或写为 MOV BX, BUFF
注意:,CPU 读写内存时使用段基址和段内偏移地址,上面指令中的[2000H]和[3200H],都是段内偏移地址。在通常情况 下,存储器操作数的默认在数据段,段基址在 DS。
如果操作数的段基址不是 DS 段,指令要特别说明。例如在 ES 段,指令应书写为:
MOV BL, ES:[2000H]
这种用法称为段超越,逻辑地址为 ESX10H+2000H。
3. 寄存器寻址
操作数在 CPU 内部的寄存器中。
ADD AX, BX ;源和目的操作数的寻址方式都是寄存器寻址。
4. 寄存器间接寻址
操作数在内存中,内存单元的偏移地址存放在寄存器中。
MOV AX, [SI] ;操作数[SI]的寻址方式为寄存器间接寻址。取出连续两个内存单元的数据传送给AX
注意:8086CPU 中能够作为寄存 器间接寻址方式使用的寄存器只有 4 个:BX、BP、SI、DI。。BP 在作为间址寄存器时, 段基址默认为 SS;其它 3 个的默认段基址为 DS。但都可以段超越。例:
MOV DX, ES:[DI]
5. 寄存器相对寻址
操作数在内存中,内存单元的偏移地址一部分由间接寻址寄存器提供,一部分是指令给 定的 8 位或 16 位地址位移量,二者相加形成操作数的有效地址。
MOV AX, [BX+DATA] ;将以BX+DATA为首地址的连续两个内存单元的 数据传送给 AX。
//书写方式很灵活,下面都是正确的
MOV AX, [BX]+DATA
MOV AL, 20H [SI]
MOV CX, DATA [DI]
MOV DX, DATA+ [BP]
这种寻址方式可用于存取数据表中的数据,用间址寄存器存放数据表首地址,地址位移 量指明要存取表中的哪一个数据,可以方便地存取数据表中的任何数据。
6. 基址变址寻址
操作数在内存中,基址寄存器和变址寄存器相加作为操作数的偏移地址。
MOV AX, [BX][SI] ;将 BX+SI 为首地址的连续两个内存单元的数据送给 AX。
注意:8086CPU 中寄存器 BX 和 BP 为基址寄存器, SI 和 DI 为变址寄存器。这种寻址方式中, 一个基址寄存器加一个变址寄存器构成操作数,操作数的形式只有 4 种:
[BX][SI]
[BX][DI]
[BP][SI]
[BP][DI]
基址变址寻址方式的主要用途是寻址存储器数组中的元素。将数组的首地址装入基址寄 存器,而把要存取的元素的序号存入变址寄存器中,通过修改变址寄存器的内容来访问数组 中的各个元素,它比寄存器相对寻址更加灵活
7. 基址变址相对寻址
操作数在内存中,操作数的地址由基址寄存器加上变址寄存器再加上地址位移量构成。
MOV AX, DATA[BX][SI]
MOV AX, [BP][DI] DATA
指令也可以书写为:
MOV AX, [DATA+BX+SI]
MOV AX, [DATA+BX][SI]
MOV AX, DATA[BX+SI]
这种寻址方式主要用于二维数组操作。地址位移量作为数组首地址,基址寄存器寻址行, 变址寄存器寻址列,可以很方便实现数据阵列检索。
8. 隐含寻址
MUL BL ;AL 乘以 BL,结果存在 AX 中。
MOVSB ;把 DS:SI 指明的内存单元的数据传送到 ES:DI 指明的内存单元