320 likes | 597 Views
Chapter 3 Addressing modes. Instructor : Dr. Yu Youling. 寻址模式. 寻址模式 寻找操作数的地址 (一般指源操作数) 找数 寻找要执行的下一条指令的地址 找指令 三种寻址模式 数据寻址模式 (Data - Addressing Modes) 程序存储器寻址模式 ( Program Memory - Addressing Modes) 堆栈寻址模式 ( Stack Memory - Addressing Modes). 指令系统. 指令 —— 控制计算机完成指定操作的命令
E N D
Chapter 3Addressing modes Instructor:Dr. Yu Youling
寻址模式 • 寻址模式 • 寻找操作数的地址(一般指源操作数)找数 • 寻找要执行的下一条指令的地址 找指令 • 三种寻址模式 • 数据寻址模式(Data - Addressing Modes) • 程序存储器寻址模式( Program Memory - Addressing Modes) • 堆栈寻址模式( Stack Memory - Addressing Modes)
指令系统 • 指令——控制计算机完成指定操作的命令 • 机器指令——指令的二进制代码形式。例如:CD21H • 汇编指令——助记符形式的指令。例如:INT 21H • 指令系统——CPU所有指令及其使用规则的集合 • 8088/8086指令系统: • 指令向后兼容(x86系列) • 应用广泛,资料易于寻找
指令的基本构成 源 目的 操作码 [操作数], [操作数] 说明要执行的是什么操作 操作对象,可以有0个、1个或2个
指令的基本构成 • 示例 • 目的操作数和源操作数均可采用不同的寻址方式,但两个操作数的类型要一致。 MOV AX , BX 操作码 操作数 ADD AX,[SI+6] INC [BX] HLT
操作数 • 8088/8086的操作数分为3类 • 立即数 立即数只能用作源操作数,如 MOV AX,0FA00H ;正确 MOV 8000H,DX ;错误
操作数 • 8088/8086的操作数分为3类 • 寄存器操作数 • 放在8个通用寄存器和4个段寄存器中的操作数 段寄存器存放当前操作数的段基地址 不允许将立即数传送到段寄存器 只能存放字/双字操作数
操作数 • 8088/8086的操作数分为3类 • 存储器操作数 类型 存储单元个数 字节 字 双字 1 2 4 存储器操作数 一般不允许两个操作数同时为存储器操作数
实模式寻址方式 • 存储单元的物理地址 = 段基地址 + 偏移地址 • 若指令中没有指明所涉及的段寄存器,CPU就采用默认的段寄存器来确定操作数所在的段 • 存储器操作数的偏移地址(也称有效地址)可以通过不同的寻址方式由指令给出 例如,若(BX)=2000H, (SI)=0A00H, (DI)=2A00H,则以下指令的结果是一样的: MOV AL, [2A00H] MOV AL, [BX+0A00H] MOV AL, [BX][SI] MOV AL, [DI]
数据寻址模式(Data-Addressing Modes) • 寄存器寻址(register addressing) • 立即寻址(immediate addressing) • 存储器寻址 • 直接寻址(direct addressing) • 寄存器间接寻址(register indirect addressing) • 基址加变址寻址 (base-plus-index addressing) • 寄存器相对寻址(Register relative Addressing) • 相对基址变址寻址(base relative-plus-index addressing) • 比例变址寻址(scaled-index addressing) • I/O寻址
寄存器寻址(register addressing) • 操作数放在某个寄存器中,源操作数与目的操作数字长要相同 • 寄存器寻址与段地址无关 • 操作数在寄存器中,指令中源操作数和目的操作数都可用这种寻址方式 • 例: MOV AX, BX MOV CL, AL 错误例: ×MOV AX, BL ; 字长不同 × MOV ES: AX, DX ; 寄存器与段无关
立即寻址(immediate addressing) • 操作数(为一常数)就在指令中,紧跟在操作码后面,作为指令一部分存放在内存的代码段中 • (此操作数称为立即数) • 立即寻址只能用于源操作数 • 例: MOV AX, 1C8FH MOV BYTE PTR[2A00H], 8FH MOV EAX,234H 错误例: × MOV 2A00H, AX ; 错误!
存储器寻址 • 有效地址(EA, Effective Address) • 当操作数在内存中时,指令的地址码(操作码)给出所访问的内存单元的逻辑地址。 • 在寻址方式中,逻辑地址的形成是由多个分量组合而成,该组合地址又叫有效地址
直接寻址(direct addressing) • 当指令中的源操作数或目的操作数,采用直接给出被访问内存单元的逻辑地址时,这种寻址方式称直接寻址 • 默认的段寄存器为DS,但也可以显式地指定其他段寄存器——称为段超越前缀 • 偏移地址也可用符号地址来表示,如ADDR、VAR • 例: MOV AX , [2A00H] MOV DX , ES: [2A00H] MOV SI , TABLE_PTR
寄存器间接寻址(register indirect addressing) • 内存单元的逻辑偏移地址通过寄存器间接给出 MOV DX , [SI] MOV WORD PTR [ECX],12 MOV DWORD PTR [ESI],2345H
基址加变址寻址(base-plus-index addressing) • 类似于间接寻址,采用两个寄存器进行寻址 • EA经常采用几个基址寄存器(BX, BP)和一个变址寄存器(SI, DI)组合而成 • 对高端CPU,允许除ESP外的任意两个寄存器组合成EA • 例: MOV CX, [BX+DI] MOV CH , [BP+SI] MOV [BX+SI], SP MOV [EAX+EBX], ECX
寄存器相对寻址(Register relative Addressing) • 这种寻址方式中提出位移量的概念,即在寄存器间接寻址给出的偏移地址上,加一相对位移量。 • 位移量是一带符号的16位16进制数。 • 类似于基址加变址寻址和位移量寻址,通常为一个寄存器 • 例 MOV LIST [SI+2], CL MOV DI, SET_IT[BX] MOV DI, [EAX+10H] MOV ARRAY[EBX], EAX
相对基址变址寻址(base relative-plus-index addressing) • 它的EA是由三部分组成的,基址寄存器BX或BP的内容加上变址寄存器的内容再加相对位移量。 • 物理地址由基址寄存器按规则选择段寄存器,也可以使用段超越。 • 至少有两个寄存器 • 例: MOV AX, FILE[BX+DI] MOV AX , 8AH[BX][SI] 该例中EA=8AH+(BX)+(SI) 物理地址=(DS)×10H+8AH+(BX)+(SI)
相对基址变址寻址(base relative-plus-index addressing)
比例变址寻址(scaled-index addressing) • 是80386以上CPU特有的。 • 第二个寄存器内容与比例因子相乘。比例因子可以是1X,2X,4X或8X • 例 MOV EAX,[EBX+ 4*ECX] MOV [EAX+2*EDI+100H],CX MOV AL,[EDI+2*EBX] MOV ARRAY[4*ECX],EBX ADD AL,[EBP+2*EDI-2]
程序存储器寻址模式( Program Memory - Addressing Modes) • 用于JMP和CALL指令 • 有三种寻址模式 • 直接程序存储器寻址(Direct Program Memory Addressing) • 相对程序存储器寻址(Relative Program Memory Addressing) • 间接程序存储器寻址(Indirect Program Memory Addressing)
直接程序存储器寻址 • 指令地址和操作码一同存储 • 如 JMP 10000H,通常指令地址为标号地址 • 两种指令 • 段间转移——远转移(far jump) • 实模式,可以转移到1MB内任意单元 • 保护模式,可以转移到4GB内任意单元 • 段间调用——远CALL • Figure 3-14
相对程序存储器寻址 • 相对于指令指针(IP) • 指明一个相对偏移量(1个、2个或4个字节),可正可负,使用时与IP相加 • 1个字节,短转移。范围-128~+127 • 2个字节,近转移或者调用。范围±32K • 4个字节, ±2G (32位) • Figure 3-15
间接程序存储器寻址 • 间接意味着有寄存器参与 • 可以是任何16位寄存器(AX,BX,CX,DX,SP,BP,SI,DI) • 对386以上,还可以是32位寄存器 • 或任何相对寄存器([BP],[BX],[SI],[DI]) • 或任何带位移量的相对寄存器 • 例 JMP AX JMP NEAR PTR[BX] JMP NEAR PTR[DI+2] JMP TABLE[BX] JMP ECX • Example 3-14
堆栈寻址模式 • 堆栈在微处理器中至关重要 • 暂时存放数据 • 为程序保存返回地址 • 堆栈 • LIFO(Last-In First-Out)存储区 • PUSH类指令将数据/指令压入堆栈 • POP类指令将数据/指令弹出堆栈 • 存储区由两个寄存器维护 • 堆栈指针(SP) • 堆栈段寄存器(SS)
堆栈寻址模式 • 操作模式 • SP/ESP总是指向位于堆栈段的存储区域 • PUSH/POP总是以字/双字操作的。 • 压入数据/指令(以PUSH AX为例) • AX高8位即AH中数据放入SP-1寻址单元 • AX低8位即AL中数据放入SP-2寻址单元 • SP SP-2 • 弹出数据/指令(以POP AX为例) • SP寻址单元中数据弹出到AX低8位AL中 • SP+1寻址单元中数据弹出到AX高8位AH中 • SP SP+2
数据结构(Data Structure) • 数据结构类似一种模板 • 用于规定信息怎样存储到存储器数组中的 • 用STRUC/ENDS对进行结构定义 • 用<>和`进行数据定义 • 例 INFO STRUC NAMES DB 32 dup(?) ; reserve 32 bytes for a name STREET DB 32 dup(?) CITY DB 16 dup(?) STATE DB 2 dup(?) ZIP DB5 dup(?) INFO ENDS NAME1 INFO <`Bob Smith`, `123 Main Street`, `Wanda`, `OH`, `44444`> NAME1 INFO <`Steve Doe`, `222 Moose Lane`, `Miller`, `PA`, `18100`>
Homework • 第一部分 • 8,9,21,27,30,31,33