1.6k likes | 1.79k Views
第三章 80x86 的指令系统. 指令系统的特点及指令的基本格式 §3.1 80x86 寻址方式 §3.2 80x86 指令系统. 指令系统的特点及指令的基本格式. 一、概述 1. 程序语言简介 2. 8086/8088 指令简介. 一、概述 1. 程序语言简介 2. 8086/8088 指令简介. 1. 程序语言简介 1) 指令、指令系统和程序 2) 机器码和机器语言 3) 助记符和汇编语言 4) 高级语言. 1) 指令、指令系统和程序 CPU 是一个可以完成一些基本操作的电子器件。
E N D
第三章 80x86的指令系统 指令系统的特点及指令的基本格式 §3.1 80x86寻址方式 §3.2 80x86指令系统
指令系统的特点及指令的基本格式 • 一、概述 • 1. 程序语言简介 • 2. 8086/8088指令简介
一、概述 • 1.程序语言简介 • 2. 8086/8088指令简介
1. 程序语言简介 • 1)指令、指令系统和程序 • 2)机器码和机器语言 • 3) 助记符和汇编语言 • 4)高级语言
1)指令、指令系统和程序 • CPU是一个可以完成一些基本操作的电子器件。 • 用编码表示CPU的一个基本操作,称为一条指令。 • 全部指令集称为指令系统。 • 指令系统反映 CPU的基本功能, • 是硬件设计人员和程序员能见到的机器的主要属性, • 是硬件构成的计算机系统向外部世界提供的直接界面。
一个CPU的指令系统是固定的, • 不同类型的CPU其指令系统不同; • 同一系列向上兼容。 • 程序是为要解决的问题编写出来的指令集合。 • 用户为解决自己的问题所编写的程序称为源程序。
2) 机器码和机器语言 • 用二进制数编码表示的指令,称为机器指令或机器码。 • 机器语言是机器码及其使用的一组规则。 • 用机器语言编写的程序称为目标程序。 • 机器语言特点:CPU能直接识别的唯一语言 • 面向机器,可直接被计算机执行 • 执行速度快,占用内存空间小 • 编程效率低、可读性差、可移值性差 • 应用:显示设备简单的单片机、家用电器、固化在ROM上的程序等
例 将地址为2000H和2001H 的两内存单元内容相加, • 结果存在地址2002H单元中,程序如下: • A0 00 20 • 02 06 01 20 • A2 02 20 寄存器组 DS ES 地址加法器 地 址 译 码 器 AX BX CX DX SI DI BP SP SS CS 1010 0000 0000 0000 0010 0000 0000 0010 0000 0110 0000 0001 0010 0000 1010 0010 0000 0010 0010 0000 地址总线AB A0 00 20 02 06 01 20 A2 02 20 IP 数据总线DB 数据暂存器 总线 接口控制电路 指 令 队 列 控制总线CB 运 算 器 指令译码器 PSW标志 寄存器 控制电路
3) 助记符和汇编语言 • 助记符是有助记忆、并能描述指令功能的符号。 通常是指令功能的英文单词的缩写。 • 例 数的传送指令用助记符MOV • 加法用ADD,转移用JMP等 • 用助记符等表示的指令称为汇编格式指令 • 例MOV AL, 0 • 汇编语言是汇编格式指令、伪指令及其使用的一组规则。 • 用汇编语言编写的程序称汇编语言程序。
上例 将地址为2000H和2001H 的两内存单元内容相加, • 结果存在地址2002H单元中。 • 用汇编语言编写的确程序段为: • MOV AL , var1 • ADD AL , var2 • MOV var3 , AL 用机器码编程: A0 00 20 02 06 01 20 A2 02 20 • 汇编格式指令与机器指令一一对应 • 用汇编语言编好的程序, • 必须翻译成机器码表示的程序,计算机才能运行。 • 汇编程序是将汇编语言程序翻译成机器语言的一种系统程序。
汇编语言和机器语言编写的程序: • 面向机器,反映机器运行的实际过程, 与计算机的硬件结构和指令系统密切相关 • 算法是用计算机的指令, 寄存器等描述, 要了解CPU的编程结构、寻址方式、指令系统才能设计程序 • 占内存少,执行速度快 • 编写繁琐、调试困难 • 相对于机器语言编写的程序: 汇编语言程序,易读易懂,便于修改。
3) 高级语言 • 高级语言是独立于机器、面向过程或对象的语言。 算法是按照人的思维方式给出,比较接近人的自然语言。 • 上例 高级语言程序段为: • var3 = var1 + var2 • 由编译程序将高级语言源程序翻译目标程序, • 即用机器码表示的程序,机器才能执行。 • (不同类型机器由于指令系统不同,它们的编译程序不同) • Fortran、 Basic、 C等均是高级语言。 • 使用高级语言编程,效率高,可读性、可移植性强。
2.8086/8088指令简介 • 指令格式 • 1) 操作码 • 2) 操作数 • (1)来源 (2)个数 (3)类型 (4)执行速度
指令格式 操作码操作数 • 例 ADD AL,10H • 1) 操作码 • 指明CPU要执行什么样的操作。 • 是一条指令必不可少的部分,用助记符表示。 数据传送 算术运算 逻辑运算 串操作 控制转移 处理机控制 按功能 指令分六类
指令格式 操作码操作数 • 例 ADD AL,10H • 2) 操作数 • 指明参与操作的数据或数据所在的地方。 • 了解操作数的来源、个数、类型、执行速度。
(1) 操作数来源 指明操作数所在的地方 • 有三种来源: • ① 操作数在指令中,称立即数操作数 • 如 MOV AL , 9 • ②操作数在寄存器中,称寄存器操作数 • 指令中给出用符号表示的寄存器名。 • 如 MOV AL , 9 • ③操作数在内存单元中,称存储器操作数或内存操作数 • 指令中给出该内存单元的地址。用[ ]表示存储器操作数 • 如 MOV AL , [ 2000H ]
(2) 操作数个数 • 按指令格式中,操作数个数的多少分为三类: • 无操作数: 指令只有一个操作码,没有操作数 • 单操作数: 指令中给出一个操作数 • 双操作数: 指令中给出两个操作数。
① 无操作数: 指令只有一个操作码,没有操作数。 • 有两种可能: • ▲ 有些操作不需要操作数。 • 如 HLT,NOP等处理机控制指令。 • ▲ 操作数隐含在指令中。 • 如 STC , CLC等处理机控制命令。 • AAA , DAA等调整指令。
② 单操作数: 指令中给出一个操作数。 • 有两种可能: • ▲有些操作只需要一个操作数 • 如 INC AL ; (AL) ← (AL)+ 1 • ▲有些操作将另一个操作数隐含在指令中 • 如 MUL BL ; (AX) ← (AL)×(BL)
③ 双操作数: 指令中给出两个操作数。 • 如 ADD AL , BL;(AL) ← (AL) + (BL) • 目的操作数源操作数 • 操作后的结果通常存放在目的操作数中。
3) 操作数类型 8086/8088: 有的操作既可对字节操作,又可对字操作 有的操作只允许对字操作 • 指令应指明参与操作的数是字节还是字,即操作数的类型。 • 通常操作数的类型可由操作数本身隐含给出。 • 只在特殊情况下需要指明。
①指令中有寄存器操作数,由寄存器操作数决定类型。①指令中有寄存器操作数,由寄存器操作数决定类型。 • 例 : MOV [BX], AL;字节操作, [BX] ← AL • MOV [BX] , AX;字操作, [BX] ←AL, [BX+1] ←AH 在DEBUG下查看指令对应的机器码: D:\>DEBUG ;进入DEBUG -A;汇编指令 1693:0100 MOV [BX], AL 1693:0102 MOV [BX], AX 1693:0104 -U 100;返汇编指令 1693:0100 8807 MOV [BX], AL 1693:0102 8907 MOV [BX], AX 、、、、、、 两条指令的机器码不同: 一个是0788H, 另一个是0789H
内存 • 例 value 是一个变量 (即内存操作数); • 若定义value 为字节类型: • 则 MOV value , 0 是字节操作。 • 若定义value 为字类型: • 则 MOV value , 0 是一个字操作。 value00H …. value00H 00H ②指令操作数中无寄存器,则由内存操作数的类型决定。
例MOV [ BX ], 0 ③指令中无类型的依据,需对存储器操作数加类型说明。 • 用 PTR 属性伪操作说明类型。 • MOV byte PTR [BX] , 0 • 字节操作,[ BX ] ← 0 • MOV word PTR [BX] , 0 • 字操作,[ BX ] ← 0, [ BX+1 ] ← 0
例mov AL , BL • mov AL , 0 • mov AL , [ BX ] 哪条指令执行速度快? 4) 执行速度 寄存器操作数 立即数操作数 存储器操作数 三条指令: 操作类型相同,都是传送指令,且目的操作数相同, 不同的是源操作数。
CPU 总线 内存 寄存器组 DS AX BX CX DX AH AL 地址加法器 ES BH 地址总线AB BL 、、、 指令1 指令2 指令3 指令4 、、、 数据1 数据2 数据3 、、、 SS 地 址 译 码 器 CH CL CS DH DL SI IP DI 数据总线DB BP 数据暂存器 SP 总线 接口控制电路 指 令 队 列 控制总线CB 运 算 器 指令译码器 PSW标志 寄存器 执行部件控制电路 mov AL , BL mov AL , 0 mov AL , [ BX ]
寄存器操作数 立即数操作数 存储器操作数 快 慢 • 例mov AL , BL快 • mov AL , 0 • mov AL , [ BX ]慢 • 对同一类型指令,执行速度:
共7种寻址方式: • 1. 立即数寻址 • 2. 寄存器寻址 • 3.直接寻址 • 4.寄存器间接寻址 5种与内存单元 • 5.寄存器相对寻址 有关的寻址 • 6.基址加变址寄存器寻址 (存储器操作数) • 7.相对基址加变址寄存器寻址 • 第一节、8086/8088的寻址方式 • 指明操作数的来源,即寻找(得到)操作数的方法。
以数据传送指令MOV为例介绍寻址方式。 • 指令MOV dst, src • 执行 (dst) ← (src) • 即: 源操作数的内容不变, • 目的操作数 = 源操作数
例1 MOV AX , 2056H 结果 ( AH ) = 20H ( AL ) = 56H 例2 MOV AL , 78 H 结果 ( AL ) = 78H • 一. 立即数寻址 • 操作数在指令中,取来指令立即可得到操作数。 • 称该操作数为立即数。 • 立即数可以是8位或16位。 • 立即数常用来给寄存器或内存单元赋初值。
二. 寄存器寻址方式 • 操作数在寄存器中,指令中指定寄存器名 • 8 位操作数, 用 8 位寄存器: • AH、AL、BH、BL、CH、CL、DH、DL • 16 位操作数,用 16 位寄存器: • AX、BX、CX、DX、SP、BP、SI、DI • CS、DS、SS、ES
例1 MOV AX , 2056H • 执行后:(AX)=2056H • 例2 MOV BL , AH • 执行前:(BL) = 12H, (AH) = 78H • 执行后:(BL) = 78H (AH) = 78H
CPU 总线 内存 寄存器组 DS AX BX CX DX AH AL 地址加法器 ES BH 地址总线AB BL 、、、 指令1 指令2 指令3 指令4 、、、 数据1 数据2 数据3 、、、 SS 地 址 译 码 器 CH CL CS DH DL SI IP DI 数据总线DB BP 数据暂存器 SP 总线 接口控制电路 指 令 队 列 控制总线CB 运 算 器 指令译码器 PSW标志 寄存器 执行部件控制电路 • 立即数寻址、寄存器寻址的操作数, • 不用在取完指令后再到内存中取数。
三. 存储器寻址 • 以下的 5 中寻址方式, • 操作数存放在内存中,取完指令后,还需到内存取数。 • 指令中给出的是该操作数的地址,包括段地址和偏移地址。 寄存器组 DS AX BX CX DX AH AL 地址加法器 ES BH 地址总线AB BL 、、、 指令1 指令2 指令3 指令4 、、、 数据1 数据2 数据3 、、、 SS 地 址 译 码 器 CH CL CS DH DL SI IP DI 数据总线DB BP 数据暂存器 SP 总线 接口控制电路 指 令 队 列 控制总线CB 运 算 器 指令译码器 PSW标志 寄存器 执行部件控制电路 CPU 总线 内存
如指令MOV DS: [ DI ] , CL 完成将CL寄存器中的内容传送到以DS为段值,DI为偏移值的内存单元中 例 编程将CL寄存器的内容传送到21000H单元中。 地址 21000H=2000:1000H 编程时, DS 存放段地址2000H DI 存放偏移地址1000H MOV AX, 2000H MOV DS, AX ; (DS) = 2000H MOV DI, 1000H ; (DI) = 1000H MOV DS: [ DI ], CL ;(21000H) = (CL)
DS ES 地址加法器 AX BX CX DX SI DI BP SP 地 址 译 码 器 SS CS 地址总线AB A0 寄存器组 IP 数据总线DB 数据暂存器 总线 接口控制电路 指 令 队 列 控制总线CB A0 运 算 器 21000H 21001H 21002H 指令译码器 PSW标志 寄存器 执行部件 控制电路 2000 2000 MOV AX, 2000H MOV DS, AX MOV DI, 1000H MOV DS: [ DI ], CL 21000 1000 通过例子看到: 在相应的寄存器中设定段值和偏移值, 由地址加法器送出20位的地址信号,对选中的内存单元进行操作。
内存单元的地址由段地址和偏移地址构成 ▲ 为减短指令长度 指令中只给出偏移地址的来源,段地址由默认关系给出。 MOV AL,[ 2000H ] • ▲ CPU根据偏移地址给出的方式, • 按默认关系自动选择段寄存器,获取段值, • 由段值、偏移值构成操作数所在内存单元的物理地址。 • 上例PA= ( DS ) ×10H + 2000H • 即选择DS寄存器的内容为段地址。
按给出偏移地址方式的不同,分为以下5种: • 直接寻址MOV AL, [ 1000H ] • 寄存器间接寻址MOV AL, [ BX ] • 寄存器相对寻址MOV AL, [ BX + 10H ] • 基址加变址寄存器MOV AL, [ BX + SI ] • 相对基址加变址寄存器MOV AL, [ BX + SI + 10H ] • 另外,80386以上微处理器还有 • 比例变址寻址 • 基址比例变址寻址 • 相对基址比例变址寻址 指令中用[ ]给出偏移地址。 操作数的偏移地址又称有效地址EA ( Efficient Address)
1.直接寻址方式 • 存储器操作数的有效地址EA在指令中直接给出。 • 例MOV AL, [ 1000H ] • 默认段寄存器为DS。 • 操作数所在内存单元的物理地址为: • PA = ( DS )×10H + EA
直接寻址方式默认段寄存器为DS 寄存器组 DS AX BX CX DX AH AL 地址加法器 ES BH 地址总线AB BL 、、、 指令1 指令2 指令3 指令4 、、、 数据1 数据2 数据3 、、、 SS 地 址 译 码 器 CH CL CS DH DL SI IP DI 数据总线DB BP 数据暂存器 SP 总线 接口控制电路 指 令 队 列 控制总线CB 运 算 器 指令译码器 PSW标志 寄存器 执行部件控制电路 CPU 总线 内存
例:MOV AX , [ 1000 H] • 若 ( DS ) = 2000H • 内存操作数的物理地址为: • PA = ( DS )×10H +EA • = 2000H × 10H + 1000H • = 21000H • 执行后 (AX)= 3040H
例 符号buffer表示一个地址。 • MOV AX , [buffer] • 或写成 MOV AX , buffer • 源操作数为buffer指向的内存单元的内容 • 在汇编语言程序中,不直接用数值 表示偏移地址, • 用符号代替数值表示地址,称符号地址(变量名)。 • 符号地址( 变量名)经汇编连接后,与一个确定的数值地址相对应 • 可用操作符Offset获取变量的偏移地址。 • 故 PA = ( DS )×10H + Offset buffer • 指令执行结果 ( AX ) = 0B0A H
2. 寄存器间接寻址 • 存储器操作数的有效地址EA由寄存器给出, • 寄存器的内容为操作数的有效地址。 • 可用的寄存器有 BX、SI、DI 、BP • 如: MOV AL, [ BX ] • MOV AH, [ SI ] • MOV DL, [ DI ] • MOV DH, [ BP ]
默认段寄存器的关系: • ①使用BX、SI、DI,默认段寄存器为DS • (BX) • PA = ( DS )×10H + (SI) • (DI) • ②使用BP,默认段寄存器为SS • PA = ( SS )×10H + ( BP )
使用BX、SI、DI的寄存器寻址,默认段寄存器为DS使用BX、SI、DI的寄存器寻址,默认段寄存器为DS 寄存器组 DS AX BX CX DX AH AL 地址加法器 ES BH 地址总线AB BL 、、、 指令1 指令2 指令3 指令4 、、、 数据1 数据2 数据3 、、、 SS 地 址 译 码 器 CH CL CS DH DL SI IP DI 数据总线DB BP 数据暂存器 SP 总线 接口控制电路 指 令 队 列 控制总线CB 运 算 器 指令译码器 PSW标志 寄存器 执行部件控制电路 CPU 总线 内存
使用BP的寄存器寻址,默认段寄存器为SS 寄存器组 DS AX BX CX DX AH AL 地址加法器 ES BH 地址总线AB BL 、、、 指令1 指令2 指令3 指令4 、、、 数据1 数据2 数据3 、、、 SS 地 址 译 码 器 CH CL CS DH DL SI IP DI 数据总线DB BP 数据暂存器 SP 总线 接口控制电路 指 令 队 列 控制总线CB 运 算 器 指令译码器 PSW标志 寄存器 执行部件控制电路 CPU 总线 内存
例:MOV AX , [ DI ] • 若 ( DS ) = 3000H • ( DI ) = 2000H • 则内存操作数的物理地址为: • PA = ( DS )×10H + ( DI ) • = 32000H • 执行后 (AX) = (32000H) = 400BH
例:MOV AX , [ BP ] • 若 ( SS ) = 4000H • ( BP ) = 3000H • 则内存操作数的物理地址为: • PA = ( SS )×10H + ( BP ) • = 43000H • 指令执行后 (AX) = (43000H) = 0102H
3. 寄存器相对寻址 • 操作数的有效地址由一个寄存器与一个偏移量相加得到 • 偏移量(相对量)在指令中给出,范围在0000 ~ FFFFH • 可用的寄存器有 BX、DI 、SI、BP , 与寄存器间接寻址相同 • 如: MOV AL, [ BX +10H] • MOV AH, [ DI+20H ] • MOV DL, 30H [ SI ] • MOV DH, 40H [ BP ]
默认段寄存器的关系与寄存器间接寻址相同 • ①使用BX、SI、DI,默认段寄存器为DS • (BX) • PA = ( DS )×10H + (SI) + 偏移量 • (DI) • ②使用BP,默认段寄存器为SS • PA = ( SS )×10H + ( BP )+ 偏移量