360 likes | 574 Views
指令格式 与寻址方式. 指令的助记符格式 操作数1,成被称为目的操作数dest,它不仅可以作为指令操作的一个对象,还可以用来存放指令操作的结果 操作数2,常被称为源操作数src,它表示参与指令操作的一个对象. 操作码 操作数 1 , 操作数 2 ; 注释. 问题. 指令解决什么问题?. 汇编语言指令要解决的 两个问题 : 要指出进行什么操作——操作 码 ; 要指出操作数和操作结果放在何处——寻址方式。. 指令的操作码和操作数. 每种指令的 操作码 : 用一个助记符表示(指令功能的英文缩写) 对应着机器指令的一个或多个二进制编码
E N D
指令格式与寻址方式 指令的助记符格式 • 操作数1,成被称为目的操作数dest,它不仅可以作为指令操作的一个对象,还可以用来存放指令操作的结果 • 操作数2,常被称为源操作数src,它表示参与指令操作的一个对象 操作码 操作数1,操作数2;注释
问题 指令解决什么问题? 汇编语言指令要解决的两个问题: 要指出进行什么操作——操作码; 要指出操作数和操作结果放在何处——寻址方式。
指令的操作码和操作数 • 每种指令的操作码: • 用一个助记符表示(指令功能的英文缩写) • 对应着机器指令的一个或多个二进制编码 • 指令中的操作数: • 可以是一个具体的数值 • 可以是存放数据的寄存器 • 或指明数据在主存位置的存储器地址 • 操作数可以有一个操作数、两个操作数或隐含在助记符中(形式上无操作数)。
2.2 8086的寻址方式 • 根据操作数所在位置,8086寻址方式 分为三大类: • 立即数寻址 • 寄存器寻址 • 存储器寻址 • 根据8086的指令格式的不同,存储器寻址方式又可分为: • 直接寻址 • 寄存器间接寻址 • 寄存器相对寻址 • 基址变址寻址 • 相对基址变址寻址
段间直接寻址 立即数寻址 寄存器寻址 直接寻址 段间间接寻址 与数据相关的寻址方式 寄存器间接 8 0 8 6 寻址方式 存储器寻址 寄存器相对 基址加变址 相对基址加变址 段内直接寻址 段内寻址 段内间接寻址 与地址相关的寻址方式 段间寻址
10H 90H 1)立即数寻址 操作数就在指令中提供,叫立即寻址方式。 比如: ;将1090H送AX,AH中为10H,AL中为90H MOV AX,1090H • 操作数紧跟在操作码的后面,与操作码一起放在存储器的代码段区域中。在取出指令的同时,也就取出了操作数。它主要用来给寄存器或存储单元赋初值,也可以与寄存器操作数或存储器操作数进行算术逻辑运算。 代码段 AH AL AX mov 90H 10H
AX BX 2) 寄存器寻址 操作数在CPU内部的寄存器中,指令中操作数 用内部寄存器——寄存器寻址方式。 例如: MOV AX, BX ;将BX的内容复制到AX 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进行数据交换。主存利用地址区别。指令中用‘[ ]’表示。方括号内为内存单元地址。
存储单元及其存储内容 • 每个存储单元都有一个编号; 被称为存储器地址,指令中用‘[ ]’表示。方括号内为内存单元地址。 • 每个存储单元存放一个字节的内容 例: • 存储器地址为1200H单元存放有一个数据34H • 表达为[1200H]=34H
存储器中的数据存放 • 多字节数据在存储器中占连续的 多个存储单元: • 存放时,低字节存入 低地址,高字节存入高地址; • 表达时用它的低地址表示 多字节数据占据的地址空间。 • 0002H号“字节”单元的内容: [0002H] = 34H • 0002H号“双字”单元的内容: [0002H] = 1234H • 0002H号“双字”单元的内容: [0002H] = 78561234H
存储器中的数据存放(续) • 同一个存储器地址可以是字节单元地址、 字单元地址、双字单元地址等等。 (视具体情况来确定) • 字单元安排在偶地址(xxx0B)、双字单元安排在模4地址(xx00B)等,被称为“地址对齐(Align)”
存储器的分段管理 • 8086CPU有20条地址线 • 最大可寻址空间为220=1MB • 每个存储单元具有一个唯一的20位编号,即物理地址 • 物理地址范围从00000H~FFFFFH • 8086CPU将1MB空间分成许多逻辑段(Segment) • 每个段最大限制为64KB • 段地址的低4位为0000B • 每个存储单元还具有多个逻辑地址 形式为段基地址 : 段内偏移地址
物理地址、逻辑地址、有效地址(偏移地址) • 段地址说明逻辑段在主存中的起始位置,用16位段寄存器表达段地址 • 偏移地址说明主存单元距离段起始位置的偏移量,偏移地址可以用16位寄存器或16位数据表示 • 将逻辑地址中的段地址左移4位,加上偏移地址就得到20位物理地址 • 一个物理地址可以有多个逻辑地址
段地址左移4位 加上偏移地址 得到物理地址 23500H 12000H + 100H + FA0H 23600H 12FA0H 例如 逻辑地址 2350H:100H 和 1200H:0FA0H 物理地址23600H 和12FA0H
AX 12H AH AL 34H 操作 码 代码段 数据段 00H 10H 34H 12H 1070H 1071H 3)存储器寻址——直接寻址 数据在存储器中,有效地址由指令直接给出 ——直接寻址。 比如: ;将DS段的1070H和1071H 两单元的内容取到AX中 MOV AX,[1070H] • 默认段地址为DS段
3)存储器寻址——寄存器间接寻址 寄存器间接寻址可分为四种: (1) 以BX寄存器进行间接寻址—数据段基址寻址 MOV AX,[BX] ES:MOVCX,[BX] (2) 以BP寄存器进行间接寻址—堆栈段基址寻址 MOV BX,[BP] (3)以SI寄存器进行间接寻址——变址寻址 MOV BX,[SI] (4) 以DI寄存器进行间接寻址——变址寻址 MOV BX,[DI]
3)存储器寻址——寄存器间接寻址(续) • 操作数在某个存储单元中,其偏移地址 在指令给出的方括号中的寄存器中,即寄存器的内容为操作数的偏移地址。 • 所使用的段寄存器由指令中的间址寄存器确定。 • 若用BX、SI、DI寄存器间址,则操作数在当前数据段中,即段地址在DS中。 • 若用BP间址,则操作数在堆栈段SS中。 • 只有上述4个寄存器可以用于间接寻址。 • 间接寻址的优点:只要对间址用的寄存器作适当修改,一条指令就可以对许多不同的存储单元进行访问。循环程序设计中,多用间接寻址。
3)存储器寻址——寄存器相对寻址 • 4个用于间接寻址的寄存器的内容与一个 位移量相加 如: MOV CL, [BX+10] 或写成: MOV CL, 10[BX] MOV CL, [BX]+10 • 操作数在某个存储单元中,其偏移地址是指定的寄存器的内容与指令中给出的位移量相加之和。段地址依据使用的寄存器的不同而不同 [BX] [BP] [SI] [DI] 8位偏移量 16位偏移量 EA = +
3)存储器寻址——基址变址寻址 • 操作数在某个存储器单元中,其偏移地址是指令中指定的基址寄存器和变址寄存器的内容与位移量3项相加之和。段地址由基址寄存器约定在哪一个段寄存器中。 • 2个基址寄存器与2个变址寄存器组合有四种: [BX+SI] 或写成:[BX][SI] [BX+DI] [BP+SI] [BP+DI] [SI] [DI] 8位偏移量 16位偏移量 [BX] [BP] EA = + +
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提供段地址。