1.05k likes | 1.21k Views
计算机硬件技术基础. hardwarebasic@163.com. 8086 / 8088 的寻址方式. 汇编语言指令要解决的 两个问题 : 要指出进行什么操作 —— 操作符; 要指出操作数和操作结果放在何处 —— 寻址方式。. 8086 / 8088 的寻址方式. 1. 数据寻址方式. 8086 / 8088 的寻址方式. (1) 立即寻址. 操作数就在指令中提供 —— 立即数寻址方式 。. 8086 / 8088 的寻址方式. 立即寻址时 CPU 直接从紧跟着的指令代码的后续地址单元中取得要操作的数,而不必执行总线周期;
E N D
计算机硬件技术基础 hardwarebasic@163.com
8086/8088的寻址方式 汇编语言指令要解决的两个问题: 要指出进行什么操作——操作符; 要指出操作数和操作结果放在何处——寻址方式。
8086/8088的寻址方式 1.数据寻址方式
8086/8088的寻址方式 (1) 立即寻址 • 操作数就在指令中提供——立即数寻址方式。
8086/8088的寻址方式 • 立即寻址时CPU直接从紧跟着的指令代码的后续地址单元中取得要操作的数,而不必执行总线周期; • 立即数可以是8位,也可以是16位; • 立即数寻址主要用来给寄存器赋初值,指令执行速度快。
8086/8088的寻址方式 (2) 寄存器寻址 • 操作数放在CPU寄存器中——寄存器寻址方式。
8086/8088的寻址方式 • 寄存器寻址可以使用8位或者16位的寄存器,对于8位寄存器,可以是AL、AH、BL、BH、CL、CH、DL、DH; • 如果源操作数和目的操作数都是寄存器寻址,操作数在CPU内部进行,不需要执行总线周期;
8086/8088的寻址方式 (3) 直接寻址 • 数据在存储器中,有效地址由指令给出——直接寻址
8086/8088的寻址方式 (4) 寄存器间接寻址 • 数据在存储器中,有效地址由寄存器给出——寄存器间接寻址
8086/8088的寻址方式 • 寄存器间接寻址允许使用的寄存器有BX、BP、SI、DI • 书写时,寄存器带方括号[ ] • 当使用BX、DI和SI寻址存储器时,默认使用数据段DS,而使用BP寻址存储器时,默认使用堆栈段SS
8086/8088的寻址方式 (5) 基址加变址寻址 • 数据在存储器中,有效地址由基址寄存器(BX或BP)与变址寄存器(SI或DI)之和给出——基址加变址寻址
8086/8088的寻址方式 • 在使用基址加变址寻址时,通常用基址寄存器保持存储器数组的起始地址,而变址寄存器保持数组元素的相对位置。
8086/8088的寻址方式 (6) 寄存器相对寻址 • 数据在存储器中,有效地址由寄存器与位移量之和给出——寄存器相对寻址
8086/8088的寻址方式 (7) 相对基址加变址寻址 • 数据在存储器中,有效地址由基址寄存器、变址寄存器与位移量3个分量之和给出——寄存器相对寻址
8086/8088的寻址方式 2.程序存储器寻址方式 • 程序存储器寻址方式即转移类指令(如CALL、JMP)的寻址方式 • 段内直接转移; • JMP 1000H • 段内间接转移; • JMP CX • 段间直接转移; • JMP 2000H:0100H • 段间间接转移 • JMP DWORD PTR [SI]
8086/8088的寻址方式 • 段内转移
8086/8088的寻址方式 • 段间转移
8086/8088的寻址方式 3. 串操作指令寻址方式 • 字符串指令不能使用正常的存储器寻址方式来存取数据串指令中使用的操作数。在字符串指令中,隐含使用变址寄存器SI和DI来寻址操作数,因此采用的是隐含寻址方式。
8086/8088的寻址方式 4. I/O端口寻址方式 • 在8086/8088中,I/O端口通过输入(IN)输出(OUT)指令来操作,可采用直接或间接两种方式 • 直接端口寻址 • 端口地址以8位立即数方式在指令中直接给出,端口地址范围为0~255。 • IN AL, 80H ;将80H端口地址中的字节输入到AL中 • 间接端口寻址 • 端口地址以16位二进制数形式保存在DX寄存器中,范围为0~65535 • OUT DX,AL ;将AL中的字节内容输出到DX指向的端口
数据传送类指令 • 通用数据传送指令 • MO V、PUSH、POP、XCHG、XLAT • 目标地址传送指令 • LEA、LDS、LES • 标志位传送指令 • LAHF、SAHF、PUSHF、POPF • I/O数据传送指令 • IN、OUT
数据传送类指令 1.通用数据传送指令 (1) 最基本的传送指令(MOV) MOV AL,BL ;BL中的8位数据送AL MOV ES,DX ;DX中16位数据送ES
数据传送类指令 几点注意: ①通用传送指令可传送8位和16位数据。 ②通用传送指令中总是既含源操作数,又含目的操作数。 ③不能在两个内存单元之间直接传送数据 ④CS和IP寄存器不能作为目的操作数 ⑤用BX、SI、DI来间接寻址时,默认的段寄存器为DS,而用BP来间接寻址时,默认的段寄存器为SS。 ⑥执行SS寄存器赋值的传送指令时,系统自动禁止外部中断。 ⑦所有的通用传送指令都不改变标志。
数据传送类指令 √ MOV DS,AX MOV CS,AX MOV [SI],[BX] MOV AX,[BX] MOV [SI],AX × × √
数据传送类指令 (2) 堆栈操作指令 推入堆栈指令PUSH和弹出堆栈指令POP。如: PUSH AX PUSH DS POP DS POP AX
数据传送类指令 PUSH BX指令的操作过程
数据传送类指令 几点注意: ① 堆栈操作总是按字进行的。 ② 推入指令,SP减2,数据在栈顶。弹出指令正好相反。 ③ 允许PUSH CS,但不允许POP CS。 ④ 堆栈的后进先出。
数据传送类指令 (3) 数据交换指令 交换指令XCHG可以实现字节或字交换。如: XCHG AL,BL XCHG BX,CX XCHG [2530],CX 练习:设当前CS=1000H,IP=0064H,DS=2000H,SI=3000H,AL=12H, 执行XCHG AL,[SI+0400H]后,AL中的数被送到什么地方?
数据传送类指令 交换指令注意点: ①目的操作数和源操作数不能均为内存单元。 ②段寄存器和IP不能作为交换指令的操作数。
数据传送类指令 (4) 换码指令 换码指令为XLAT,使累加器中的一个值变换为内存表格中的某一个值,又称为代码转换或查表指令,特别适合于不规则代码的转换。指令的执行过程是:AL[BX+AL] 例:已知7段显示码的编码规则为: 编码信息在数据段中,起始地址的偏移为0030H,假定当前CS=2000H,IP=007AH,DS=4000H。要把AL中的5转换成对应的编码(12H),执行XLAT。
数据传送类指令 2.目标地址传送指令 (1) 取有效地址指令(LEA) LEA指令的功能是将源操作数的偏移地址送到目的寄存器中 如: LEA AX,[2728] ;将内存单元的偏移量2728送AX LEA BX,[BP+SI] ;指令执行后,BX中内容为BP+SI的值 LEA SP,[0482] ;使堆栈指针SP为482
数据传送类指令 例 设当前CS=1500H,IP=0200H,DS=2000H,SI=0030H,源操作数1234H存放在[SI+100AH]开始的存储器内存单元中,则指令 LEA BX,[SI+100AH]的操作过程如下:
数据传送类指令 (2) 装入地址指令(LDS) 功能:将4字节的地址指针传送到2个目的寄存器 比如: LDS DI,[2130H] ;使2130H和2131H中的偏移量送DI,2132H和2133H中的段值DS。
数据传送类指令 例 设当前CS=1000H,IP=0604H,DS=2000H,DI=2400H,待传送的某变量的地址指针,其偏移地址为0180H,段地址为2230H,则指令 LDS SI,[DI+100AH]的操作过程如下:
数据传送类指令 (3) 装入地址的指令(LES) 功能: 将一个地址指针装入ES和另一个寄存器。 例: LES DI,[BP+04] ;将堆栈中存放的字符串首址送到ES和DI中
数据传送类指令 3.标志位传送指令 (1) 读取标志指令 (LAHF) 将标志寄存器的低8位送AH。 (2) 设置标志指令(SAHF) 将AH寄存器的相应位送标志寄存器的低8位。 (3) 标志寄存器入栈指令(PUSHF) 将标志寄存器的值推入堆栈顶部。 (4) 标志寄存器出栈指令(POPF) 从堆栈弹出一个字送标志寄存器。
数据传送类指令 4.I/O数据传送指令 (1) 输入指令IN (2)输出指令OUT 分为: 直接的输入输出指令 间接的输入输出指令。
数据传送类指令 直接的输入输出指令提供端口号。 如: IN AL,50H ;将50H端口的字节读入AL IN AX,70H ;分别将70H、71H端口的 内容读入AL、AH OUT 44H,AL ;将AL中的内容输出到44H 端口 OUT 80H,AX ;将AL、AH中的内容分别输出 到80H、81H两端口
数据传送类指令 间接的输入输出指令 ,如: IN AL,DX ;从DX所指的端口中读取 IN AX,DX ;从DX和DX+1所指出的两个端口 中读取 OUT DX,AL ;将AL中的字节输出到DX所指的 端口中 OUT DX,AX ;将AL中的字节输出到DX所指的 端口中,同时将AH中的字节输 出到DX+1所指的端口中
数据传送类指令 输入输出指令注意点: ① 只能用累加器作为执行输入输出的机构 ② 寻址范围: 直接输入输出指令为0~255 间接输入输出指令为0~65535。
算术运算类指令 • 加法指令 • ADD、ADC、INC • 减法指令 • SUB、SBB、DEC、NEG、CMP • 乘法指令 • MUL、IMUL • 除法指令 • DIV、IDIV、CBW、CWD • 十进制调整指令 • AAA、DAA|AAS、DAS、AAM、AAD
算术运算类指令 算术运算指令涉及两种类型的数据 无符号数 8位无符号数的范围为0~255 16位无符号数的范围为0~65535 有符号数 8位有符号数的范围为-128~+127 16位有符号数的范围为-32768~+32767
算术运算类指令 所有算术运算指令均影响状态标志。 规则: 当无符号数运算产生溢出时,CF为1; 当有符号数运算产生溢出时,OF为1; 如运算结果为0,则ZF=1; 如运算结果为负数,则SF=1; 如运算结果中有偶数个1,则PF=1。
算术运算类指令 1.加法指令 (1) 不带进位位的加法指令ADD 如: ADD AL,50H ;AL和50H相加,结果放在AL中 ADD DI,SI;DI和SI的内容相加,结果在DI ADD [BX+DI],AX ;BX+DI和BX+DI+1的2个单元和AX相加, ;结果在BX+DI和BX+DI+1所指单元 ADD AX,[BX+2000H] ;BX+2000H和BX+2001H所指单元内容 ;和AX的内容相加,结果在AX中
算术运算类指令 (2) 带进位位的加法指令ADC 如: ADC AX,SI ;AX和SI中的内容以及CF的值相加, ;结果在AX ADC DX,[SI] ;SI和SI+1所指的单元的内容 ;和DX的内容以及CF的值相加, ;结果在DX
算术运算类指令 (3) 增量指令INC 将操作数的内容加1。 如: INC AL ;将AL中的内容加1 INC CX ;将CX中的内容加1 INC BYTE PTR [BX+DI+500] ;将BX+DI+500所指单元的内容加1
算术运算类指令 2.减法指令 (1) 不考虑借位的减法指令SUB SUB完成2个字节或2个字的相减。 如: SUB BX,CX ;将BX中的内容减去CX中的内容,结果在BX中 SUB [BP+2],CL ;将BP+2所指的单元中的值减去CL中的值 ;结果在BP+2所指的堆栈单元中 SUB AL,20 ;AL中的数减去20,结果在AL中 SUB SI,5010H ;SI中的数减去5010H,结果在SI中 SUB WORD PTR [DI],1000H ;DI和DI+1所指的两单元中的数减去1000H ;结果在DI和DI+1所指的单元中
算术运算类指令 (2) 考虑借位的减法指令SBB 如: SBB AX,2030H ;将AX的内容减去2030H,并减去CF值 SBB WORD PTR [DI+2],1000H ;将DI+2和DI+3所指两单元的内容减去1000H, ;并减去CF值,结果在DI+2和DI+3所指的单元
算术运算类指令 (3) 减量指令DEC 将操作数减1。 如: DEC AX ;将AX的内容减1,再送回AX中 DEC BL ;将BL的内容减1,结果送回BL中 DEC BYTE PTR[DI+2] ;将DI+2所指单元的内容减1,结果送回此单元