Transcript 寄存器间接寻址
指令格式与寻址方式 指令的助记符格式 操作码 操作数1,操作数2 ;注释 • 操作数1,成被称为目的操作数dest,它不仅可以 作为指令操作的一个对象,还可以用来存放指令 操作的结果 • 操作数2,常被称为源操作数src,它表示参与指 令操作的一个对象 问题 指令解决什么问题? 汇编语言指令要解决的两个问题: 要指出进行什么操作——操作码; 要指出操作数和操作结果放在何处——寻址方式。 指令的操作码和操作数 • 每种指令的操作码: – 用一个助记符表示(指令功能的英文缩写) – 对应着机器指令的一个或多个二进制编码 • 指令中的操作数: – 可以是一个具体的数值 – 可以是存放数据的寄存器 – 或指明数据在主存位置的存储器地址 • 操作数可以有一个操作数、两个操作数或隐含在 助记符中(形式上无操作数)。 2.2 8086的寻址方式 • 根据操作数所在位置,8086寻址方式 分为三大类: – 立即数寻址 – 寄存器寻址 – 存储器寻址 • 根据8086的指令格式的不同,存储器寻址方式又 可分为: – 直接寻址 – 寄存器间接寻址 – 寄存器相对寻址 – 基址变址寻址 – 相对基址变址寻址 8 0 8 6 寻 址 方 式 立即数寻址 寄存器寻址 直接寻址 与数据相关的寻址方式 寄存器间接 存储器寻址 寄存器相对 基址加变址 相对基址加变址 段内直接寻址 段内寻址 与地址相关的寻址方 式 段内间接寻址 段间寻址 段间直接寻址 段间间接寻址 1)立即数寻址 操作数就在指令中提供,叫立即寻址方式。 比如: ;将1090H送AX,AH中为10H,AL中为90H AH AL MOV AX,1090H AX 10H 90H 代码段 mov 90H 10H • 操作数紧跟在操作码的后面,与操作码一起放在存储器的 代码段区域中。在取出指令的同时,也就取出了操作数。 它主要用来给寄存器或存储单元赋初值,也可以与寄存器 操作数或存储器操作数进行算术逻辑运算。 2) 寄存器寻址 操作数在CPU内部的寄存器中,指令中操作数 用内部寄存器——寄存器寻址方式。 例如: MOV AX, BX ;将BX的内容复制到AX AX BX ADD AL, BH ;将BH的内容加到AL的内容中 INC CX ;将CX的内容加1 ROL AH,1 ;将AH中的内容循环左移一位 2) 寄存器寻址(续) 16位的操作数通常用8个16位通用寄存器 (段寄存器仅用在部分传送指令中),因通用寄存 器是处理器的一部分,因此寄存器寻址方式可以 提高工作效率。其中AX称为累加器,若操作数存 放在AX中的话,通常指令执行时间要短些。 8位的操作数必须用AH、AL、BH、BL、CH、CL、DH 、DL等8个8位寄存器。 3)存储器寻址方式 • 操作数在主存储器中,用主存地址表示 • 程序设计时,8086采用逻辑地址表示主存地址 – 段地址在默认的或用段超越前缀指定的段寄存器中 – 指令中只需给出操作数的偏移地址(有效地址EA) • 8086设计了多种存储器寻址方式 1、直接寻址方式 2、寄存器间接寻址方式 3、寄存器相对寻址方式 4、基址变址寻址方式 5、相对基址变址寻址方式 8086的存储器 • 存储器是计算机存储信息的地方。 掌握数据存储格式,以及存储器的分段 管理对以后的汇编程序设计非常重要。 你能区别寄存器、存储器(主存)? 答案 区别寄存器、存储器(主存) 答案 • 寄存器是微处理器(CPU)内部暂存数据 的存储单元,以名称表示,例如:AX, BX..….等 • 存储器也就是平时所说的主存,也叫内存 ,可直接与CPU进行数据交换。主存利用 地址区别。指令中用‘[ ]’表示。方括 号内为内存单元地址。 存储单元及其存储内容 • 每个存储单元都有一个编号; 被称为存储器地址,指令中用‘[ ]’表 示。方括号内为内存单元地址。 • 每个存储单元存放一个字节的内容 例: 存 储 器 地 址 为 1 2 0 0 H单元存放有一个数据 34H 表达为 [1200H]=34H 存储器中的数据存放 • 多字节数据在存储器中占连续的 多个存储单元: – 存放时,低字节存入 低地址,高字节存入高地址; – 表达时用它的低地址表示 多字节数据占据的地址空间。 0002H号“字节”单元的内容: [0002H] = 34H 0002H号“双字”单元的内容: [0002H] = 1234H 0002H号“双字”单元的内容: [0002H] = 78561234H 有效地址 D7 D0 0006H 78H 0005H 56H 0004H 12H 0003H 34H 0002H 0001H 0000H 存储器中的数据存放(续) • 同一个存储器地址可以是字节单元地址、 字单元地址、双字单元地址等等。 (视具体情况来确定) • 字单元安排在偶地址(xxx0B)、双字单元安排在 模4地址(xx00B)等,被称为“地址对齐(Align)” 存储器的分段管理 • 8086CPU有20条地址线 – 最大可寻址空间为220=1MB – 每个存储单元具有一个唯一的20位编号, 即物理地址 – 物理地址范围从00000H~FFFFFH • 8086CPU将1MB空间分成许多逻辑段(Segment) – 每个段最大限制为64KB – 段地址的低4位为0000B • 每个存储单元还具有多个逻辑地址 形式为 段基地址 : 段内偏移地址 物理地址、逻辑地址、有效地址(偏移地址) • 段地址说明逻辑段在主存中的起始位置, 用16位段寄存器表达段地址 • 偏移地址说明主存单元距离段起始位置的 偏移量,偏移地址可以用16位寄存器或16 位数据表示 • 将逻辑地址中的段地址左移4位,加上偏移 地址就得到20位物理地址 • 一个物理地址可以有多个逻辑地址 例如 逻辑地址 2350H:100H 和 1200H:0FA0H 段地址左移4位 23500H 12000H 加上偏移地址 + 100H + FA0H 得到物理地址 23600H 12FA0H 物理地址 23600H 和 12FA0H 3)存储器寻址——直接寻址 数据在存储器中,有效地址由指令直接给出 ——直接寻址。 比如: 操作 码 ;将DS段的1070H和1071H 00H 两单元的内容取到AX中 10H MOV AX,[1070H] AX AH AL 12H 34H 默认段地址为DS段 1070H 34H 1071H 12H 代 码 段 数 据 段 3)存储器寻址——寄存器间接寻址 寄存器间接寻址可分为四种: (1) 以BX寄存器进行间接寻址—数据段基址寻址 MOV AX,[BX] ES:MOV CX,[BX] (2) 以BP寄存器进行间接寻址—堆栈段基址寻址 MOV BX,[BP] (3) 以SI寄存器进行间接寻址——变址寻址 MOV BX,[SI] (4) 以DI寄存器进行间接寻址——变址寻址 MOV BX,[DI] 3)存储器寻址——寄存器间接寻址(续) 操作数在某个存储单元中,其偏移地址 在指令给出的方括号中的寄存器中,即寄存器的 内容为操作数的偏移地址。 所使用的段寄存器由指令中的间址寄存器确定。 1.若用BX、SI、DI寄存器间址,则操作数在当前 数据段中,即段地址在DS中。 2.若用BP间址,则操作数在堆栈段SS中。 3.只有上述4个寄存器可以用于间接寻址。 间接寻址的优点:只要对间址用的寄存器作适当 修改,一条指令就可以对许多不同的存储单元进 行访问。循环程序设计中,多用间接寻址。 3)存储器寻址——寄存器相对寻址 • 4个用于间接寻址的寄存器的内容与一个 位移量相加 如: [BX] MOV CL, [BX+10] [BP] 8位偏移量 EA = + 16位偏移量 [SI] 或写成: [DI] MOV CL, 10[BX] MOV CL, [BX]+10 • 操作数在某个存储单元中,其偏移地址是指定的 寄存器的内容与指令中给出的位移量相加之和。 段地址依据使用的寄存器的不同而不同 3)存储器寻址——基址变址寻址 • 操作数在某个存储器单元中,其偏移地址是指令 中指定的基址寄存器和变址寄存器的内容与位移 量3项相加之和。段地址由基址寄存器约定在哪一 个段寄存器中。 • 2个基址寄存器与2个变址寄存器组合有四种: [BX+SI] 或写成:[BX][SI] [BX+DI] [BP+SI] [BP+DI] [SI] [BX] EA = + [DI] [BP] 8位偏移量 + 16位偏移量 3)存储器寻址——相对基址变址寻址 基址寄存器与变址寄存器组合,再加上 一个位移量 例: MOV CL, [BX+SI+10] • 有效地址=BX/BP+SI/DI+8/16位位移量 • 段地址对应BX基址寄存器默认是DS,对应BP基 址寄存器默认是SS;可用段超越前缀改变 例: 设 BX=0158H, DI=10A5H, 位移量=1B57H, DS=2100H, 求下列寻址方式下的有效地址和物理地址: ① 直接寻址 ② 寄存器间接寻址(寄存器为BX) ③ BX寄存器相对间接寻址 ④ 变址寻址(寄存器为DI) ⑤ DI寄存器相对变址寻址 ⑥ 基址加变址的寻址 ⑦ 相对的基址加变址的寻址(BX为基址寄存器,DI 为变址寄存器) 答案 ① 直接寻址: 有效地址=1B57H 物理地址=21000H+1B57H=22B57H ② 寄存器间接寻址(寄存器为BX): 有效地址=0158H 物理地址=21000H+0158H=21158H ③ BX寄存器相对间接寻址: 有效地址=0158H+1B57H=1CAFH 物理地址=21000H+1CAFH=22CAFH 答案 ④ 变址寻址(寄存器为DI): 有效地址=10A5H 物理地址=21000H+10A5H=220A5H ⑤ DI寄存器相对变址寻址: 有效地址=10A5H+1B57H=2BFCH 物理地址=21000H+2BFCH=23BFCH ⑥ 基址加变址的寻址(BX为基址寄存器,DI为变址 寄存器): 有效地址=0158H+10A5H=11FDH 物理地址=21000H+11FDH=221FDH 答案 ⑦ 相对的基址加变址的寻址(BX为基址寄存 器,DI为变址寄存器): 有效地址 = 0158H+10A5H+1B57H=2D54H 物理地址=21000H+2D54H=23D54H 寻址方式演示 寻址方式演示 寻址方式演示 寻址方式演示 寻址方式演示 寻址方式演示 寻址方式演示 总结: • 方括号“[ ]”运算符 • a. 方括号的内容表示存储器操作数的偏移地址; • b. 有多对方括号顺序排列时,操作数的偏移地址等于各方 括号 • 内容之和; • c. 一个常量后面跟有方括号时,偏移地址等于该常量与方 括号 • 内容之和; • d.一个变量后面跟有方括号时,偏移地址等于该变量的偏 移地址 • 与方括号内容之和。 总结: • 带方括号的地址表达式遵循的规则: a.寄存器中只有BX、BP、SI、DI可在方括号中出现; b.不允许BX、BP同时出现在同一个地址表达式中; c.不允许SI、DI同时出现在同一个地址表达式中; d.当多个寄存器出现在方括号中时,只能作加运算; e. 当方括号中包含BP,则隐含使用SS提供段地址, 否则均隐含使用DS提供段地址。