指令系统
有关指令系统的基本概念
对操作数的寻址方式
六大类指令的操作原理
还有指令字长和机器字长
{ 操作码的含义 指令对操作数的要求 指令执行的结果 \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]
其中:是段重设符