微机原理及应用->指令系统概述

本文详细介绍了微机原理中的指令系统,包括指令系统的基本概念、指令格式、操作数类型以及寻址方式。内容涵盖指令中的操作数(立即数、寄存器和存储器操作数)、寻址方式(立即寻址、寄存器寻址、存储器寻址)以及各种寻址方式的实例分析。此外,文章还讨论了数据传送指令、堆栈操作指令、交换指令、查表指令、字位扩展指令和地址传送指令,并举例说明了这些指令的使用和功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指令系统

有关指令系统的基本概念
对操作数的寻址方式
六大类指令的操作原理

还有指令字长和机器字长

{  操作码的含义   指令对操作数的要求   指令执行的结果  \left\{\begin{array}{l}\text { 操作码的含义 } \\ \text { 指令对操作数的要求 } \\ \text { 指令执行的结果 }\end{array}\right.  操作码的含义  指令对操作数的要求  指令执行的结果 

指令系统基本概念

指令及指令系统
指令的格式
指令中的操作教
指令字长与机器字长

指令与指令系统

指令:控制计算机完成某种操作的命令

机器指令和汇编指令是一一对应的

指令系统:处理器所能识别的所有指令的集合

一个CPU能识别的指令是有限的,可能不完全相同
一种CPU能识别的指令的集合叫做指令系统

指令的兼容性:同一系列机的指令都是兼容的。

自底向上兼容,前提是和Intel兼容,架构一样

一条指令应包含的信息:运算数据的来源、运算结果的去向、执行的操作

指令格式

在这里插入图片描述

操作码也叫指令码,就是功能,这里中括号表示可选,和之后指令里的中括号不一样
操作对象叫操作数,可能是运算对象,也可能是运算对象存放的地址
前面是目标操作数,运算结果去向,另外一个源操作数是运算数据来源,对象
加法需要两个运算对象,但结果一定放在目标操作数里头,目标操作数一定是个地址

{  零操作数指令 : 操作码   单操作数指令 : 操作码 操作数   双操作数指令 : 操作码 操作数,操作数   多操作数指令 : 三操作数及以上  \left\{\begin{array}{l}\text { 零操作数指令 : 操作码 } \\ \text { 单操作数指令 : 操作码 操作数 } \\ \text { 双操作数指令 : 操作码 操作数,操作数 } \\ \text { 多操作数指令 : 三操作数及以上 }\end{array}\right.  零操作数指令 : 操作码  单操作数指令 : 操作码 操作数  双操作数指令 : 操作码 操作数,操作数  多操作数指令 : 三操作数及以上 

根据刚刚中括号可有可无的划分
零操作数指令中,执行对象固定,因此隐藏了
多操作数指令只有大型机才有

指令中的操作数

在这里插入图片描述

程序在硬盘中,经过编译链接存放,运行时一定放在内存里,导入内存时包括指令和运算数据,,存在某一单元地址
内存也就成为了指令操作数的一种表现形式
寄存器我们不知道地址,但是有名字,面向程序员开放,具体地址操作系统知道就行了
内存操作数和寄存器操作数,一旦出现就表示运算数据的存放地址
目标操作数一定要有地址含义

立即数操作数

立即教本身是参加操作的数据,可以是8位或16位, 只能作为源操作教。

MOV是将源操作数送到目标地址,8位16位都行,但是要符合长度

例 :
MOV AX, 1234H
MOV BL, 22H
立即数无法作为目标操作数
立即数可以是无符号或带符号数,数值符合其取值范围

寄存器操作数

参加运算的数存放在指令给出的寄存器中,可以是16 位 或8位。
例 :
MOV AX, BX
MOV DL, CH

寄存器在CPU里,作为三种操作数运行最快

存储器操作数

参加运算的数存放在存储器的某一个或某两个单元中
表现形式: [ ]
中括号内容表示操作数在内存中的偏移地址

指令的操作数出现[ ], 表示要寻址的数在内存中。
存储器操作数环节更多,内存单元也很多,所以很慢
只要有[]就说明是在内存的某个地方。在内存的地址就是括号里的内容

例如
MOV AL, [1200H]
MOV AX, [1200H]
在这里插入图片描述

1200H里边是个8位二进制,也就是一个字节,送到AL刚好,但是送到AX就不够了,需要一个字,MOV就会送到低AL后,再找下一个1201H单元去存在AH部分。

三种类型操作数的比较

立即教:

  • 由指令直接给出,是常数性质
  • 无地址含义,只表示运算的数据 → 不能作为目标操作数

常数也可以有不同含义,例如门牌号的1200和存折里的1200
也有可能是字符,但本质上还是常数

奇存器操作教

  • 表示运算的数据存放在寄存器中
  • 多数情况下,寄存器操作数指通用寄存器
  • 在三类操作数中所需运行时间最短

快因为就在CPU中
控制寄存器不会在指令中直接出现
段寄存器也有些限制,一般都指通用寄存器

存储器操作教

  • 表示运算的数据存放在内存
  • 指令中 [ ] 里是数据所在单元的偏移地址

到底在几个单元取决于另一个操作数的字长(如上一个例子MOV AL, [1200H]和MOV AX, [1200H],方框里都是1字节)

  • 在三类操作数中所需运行时间最长。

它最慢,内存很大,和指令代码不在同一个区域

寻址方式(相当重点)

寻找操作数所在地址的方法
操作数在哪里??
源操作数:运算数据的来源
目标操作数:运算结果的去向 或者 另一个运算数据

上面的三种操作数,就大致对应了三类寻址方式

操作数可能的来源或运算结果可能的去处:

  • 由指令直接给出

  • 寄存器

  • 内存单元

寻找操作教所在地址的方法可以有三种大类型

  • 指令直接给出的方式
  • 存放于寄存器中的寻址方式
  • 存放于存储器中的寻址方式

指令直接给出的方式(运算对象由指令直接给出)
存放于寄存器中的寻址方式
存放于存储器中的寻址方式
隐含给出方式

立即寻址

给出立即数,立刻导出,不可能作为目标操作数,仅用于源操作数,因为我们之前说过源操作数要有一个返回的地址,决定指令执行完毕的位置
因为直接给出,所以在编译的时候就会和指令一起被放在内存的CS也就是代码段,指令执行时,它就会被拿出来送过目标地址,可以是8位或16位有符号数或无符号数
但实际应用很少,因为操作起来要赋值的东西太多了

立即寻址仅适合于源操作数。即源操作数是参加操作的数据本身
由指令直接给出运算的数据 (操作数是立即数)。为常数形式或字符形式。
立即数只表示运算的数据,无地址含义;

例如MOV AX, 1200H
在这里插入图片描述

思考如果不是AX而是存储器单元,是几个单元?是两个么?立即数前面可以加0,也就是说它的长度是不确定的。
如果目的操作数和源操作数都不确定,怎么办?之后的指令学习会回答这个问题。

寄存器寻址

参加操作的操作数在CPU的通用寄存器中。

数据通常在寄存器而且是通用寄存器中,不会是控制寄存器,偶尔是段寄存器

MOV AX, BX
在这里插入图片描述
此种寻址方式中的寄存器主要是通用寄存器
不含控制寄存器,段寄存器限制使用

存储器操作数的寻址方式

指令操作的对象在内存中, 表现形式为:[ ]
指令中给出运算对象在内存某个逻辑段中的偏移地址:[ 偏移地址 ]
逻辑段的段基地址通过默认或重设方式给出。

内存中,[ ],是偏移地址,不会给出段基地址,更不可能给出物理地址,因为程序在编译前,还不知道自己会在内存的哪个位置,段基址会隐藏式地给出

存储器操作数的字长本身不确定 , 其字长取决于指令中另一个寄存
器操作数, 或通过其他方式指定字长

字长完全取决于另一个,如果另一个是AX,就是16位
但如果源操作数是立即数,目标操作数是存储器操作数,就麻烦了,立即数字长是未知的,前面可以补充0,就不知道需要几个存储单元,后面会解决。

直接寻址

指令中直接给出操作数的偏移地址

[ ]是直接给一个数值,操作数默认在DS也就是数据段,但可以通过段重设的方式(段寄存器+冒号的形式)修改,只有四种类型,可以唯一对应

例如MOV AX, [1200H]
在这里插入图片描述
思考逻辑段?

直接寻址方式下,操作数默认为在数据段,但允许段重设, 即由指令给出所在逻辑段。
MOV ⁡ A X , E S : [ 1200 H ] \operatorname{MOV} \mathrm{AX},\mathrm{ES}:[1200 \mathrm{H}] MOVAX,ES:[1200H]
其中:是段重设符

寄存器间接寻址
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值