导图社区 计算机考研第四章 指令系统
计算机考研计算机组成原理,指令格式、指令寻址和数据寻址、X86汇编指令、机器级表示等内容,知识点系统且全面,希望对大家有用。
编辑于2024-05-04 21:23:32第四章 指令系统
指令格式
基本格式
操作码 + 地址码(op + add)
字长
指令字长
通常为字节的整数倍
指令字长【可变】
一条指令的总长度
指令字长与机器字长无固定关系,可以使单字长、半字长、双字长(通常指令长度是机器字长的多少倍)
指令字长会影响取指令所需时间
单字长只需访存1次就能将指令完整取出
双字长则需访存2次才能完整取出,耗费2个存取周期
机器字长
CPU一次运算所能处理的位数(ALU直接相关)
存储字长
一个存储单元的位数(MDR位数相同)
固定
定义
一台计算机的所有指令的集合构成该机的指令系统,也称为指令集。
指令分类:
地址码数目不同
零地址指令
OP
无操作数
可用于不需要操作数的指令:空操作、停机、关中断
有操作数
用于堆栈计算机,把两个操作数隐含的存放在栈顶和次栈顶,运算后再压回去(后缀表达式)
隐含寻址
一地址指令
OP A1
单操作数
只有目的操作数的单操作数,OP(A1) -> A1 注:A1指主存地址,(A1)表示A1指向地址的内容
三次访存:取指令,取A1,写回A1
例如 ++, --, 取反,求补
双操作数
(ACC)OP(A1) -> ACC 其中一个操作数隐含在某个寄存器中
两次访存:取指令,取A1
系统32位,若OP为8位,则A1可以寻址16M
二地址指令
OP A1 A2
操作码、目的、源
(A1)OP(A2) -> A1
四次访存:取指令,取A1,取A2,写回A1
系统32位,若OP为8位,则可以寻址4K
三地址指令
OP A1 A2 A3
(A1)OP(A2) -> A3
四次访存:取指令,取A1,取A2,写回A3
四地址指令
OP A1 A2 A3 A4
(A1)OP(A2) -> A3,A4为下一条指令的地址
四次访存:取指令,取A1,取A2,写回A3
执行指令后,将PC的值修改为A4所指地址
指令长度
定长指令字结构
指令系统中所有指令的长度都相等
变长指令字结构
指令系统中各种指令的长度不等
操作码长度
定长操作码
指令系统中所有指令的操作码长度都相同
操作码有n bit,则一共有2^n个指令
可变长操作码
指令系统中各指令的操作码长度可变
操作类型
数据传送类 进行CPU与主存之间的数据传送
LOAD
STORE
运算类
算数逻辑操作
移位操作
程序控制类 改变程序执行的顺序
转移操作
输入输出类(I/O) 进行CPU与I/O设备之间的数据传送
扩展操作码: 定长指令字结构+ 可变长操作码
更灵活的:动态的扩展操作码 设地址长度为n,上一层留出m种状态,下一层可扩展出m*2^n种状态
目的:保持指令字长度不变而增加指令的数量
指令系统是软硬件的界面
软件依靠指令和硬件进行交互
属于指令集体系结构(ISA)规定的有:
①指令格式,指令寻址方式,操作类型,以及每种操作对应的操作数的相应规定。
②操作数的类型,操作数寻址方式,以及是按大端方式还是按小端方式存放。
③.程序可访问的寄存器编号、个数和位数,存储空间的大小和编址方式。
④.指令执行过程的控制方式等,包括程序计数器、条件码定义等。
注意:ISA规定了机器级程序的格式,机器语言或汇编语言程序员必须对机器的ISA非常熟悉。
考频:低
17、22*2
指令寻址和数据寻址
考频:高
11*2、13、14、16-20
指令寻址
寻找下条运行 的指令的地址
顺序寻址
PC计数器++
注意PC+1是加一个【指令字长】 取值令结束后就+1 值会因指令长度,编址方式而不同
PC给出下一条欲执行指令的内存地址
位数取决于存储器的字数
跳跃寻址
下条指令的地址码由指令给出
通过程序转移类指令实现
跳动地址分为绝对地址和相对地址
跳跃寻址的转移地址形成方式有3种:直接寻址、相对寻址以及间接寻址
数据寻址
确定本条地址的 地址码指明的真 实地址标注
假设前提:指令字长=机器字长=存储字长
指令格式:
<OP,寻址特征,ADD>
每个形式地址前都有一个寻址特征
隐含寻址
即两个操作数:一个直接寻址,一个在ACC
给出一个操作数A的地址,与ACC进行运算
优点:有利于缩短指令字长、简化地址结构 缺点:增加存储操作数或隐含地址的硬件
普通寻址
立即数寻址
无EA,#A
直接给出操作的立即数的数字 形式地址就是操作数本身(补码表示)
优缺点
优点:指令执行时间最短,不需要访问内存
缺点:立即数的大小受到指令长度的限制
直接寻址 (绝对寻址)
EA = A
直接存有操作数的地址,EA = A
优缺点
优点:指令执行阶段只需要一次访存就可以找到数据
缺点:A的位数决定了该指令操作数的寻址范围,操作数地址不易修改
间接寻址
EA = (A)
可能存在多次间接寻址
多次间接寻址需要设置一个bit位来指明是否是最后一次寻址
优缺点
可扩大寻址范围(理论可以访问到任何一个数据) 便于编址程序(可以方便地完成子程序返回)
需要多次访存,访问速度过慢
不常用,题中谈及”扩大寻址范围“通常都指寄存器间接寻址
在【间址周期的末尾】需要把找到的真正地址覆盖到原本指令的形式地址中
寄存器寻址
寄存器寻址
EA = Ri
数据码部分的是寄存器编号,寄存器中存有操作数
优缺点
优点:不需要访存找到数据,可以缩短指令长度。提高指令的执行速度
缺点:寄存器数目少,不能为操作数提供大量的存储空间
寄存器间接寻址
EA = (Ri)
数据码部分是指明的寄存器编号,寄存器中存有操作数的地址
优点:指令较短,并且在取指后只需一次访存便可以得到操作数,指令执行速度较间接寻址快。
比较常用的寻址方式
偏移寻址
基址寻址
EA = (BR) + A
EA = (BR) + A
其中可以是BR,也可以是Ri
优点
有利于多道程序设计,可以【编制浮动程序】
编制浮动程序:一个程序在内存中浮动
可扩大寻址范围(基址寄存器的位数大于形式地址A的位数)
用户不必考虑自己的程序存入主存的具体位置
缺点
偏移量(形式地址A)的位数较短
BR是面向操作系统的,其内容是操作系统或管理程序确定
当采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但其内容仍由操作系统确定
变址寻址
EA = (IX) + A
IX用户可以编程设置
变址寄存器的内容可由用户决定(IX作为偏移量) 形式地址A不变(作为基地址)
优点
优点:可扩大寻址范围(变址寄存器的位数大于形式地址A的位数);
在数组处理过程中,可设定 A为数组的首地址,不断改变变址寄存器!X的内容,便可很容易形成数组中任意.个数据的地址,特别适合编制循环程序。偏移量(变址寄存器IX)的位数足以表示整个存储空间。
面向用户的,可以方便的设置A为某个数组的首部地址,然后执行EA = A + (IX), 适合循环程序,数组
相对寻址
EA = (PC) + A
A是相对于PC所指地址的位移量,可正可负,补码表示
EA = (PC) + A
注意此时的PC已经移动到了下一条指令处,因为是【取指完成后立马PC++】
以下条指令在内存中首地址为基准位置的偏移量
数据码部分是PC偏移量
便于【程序浮动】,所以相对寻址广泛用于转移指令
for、while、goto
程序浮动:一段代码在程序内部跳转 (多个程序之间)
扩展寻址
先变址后间址
EA=((IX)+A)
先进行变址运算,其运算结果作为间接地址,间接地址指出的单元的内容才是有效地址,即EA=((IX)+A)。
先间址后变址
EA=(IX)+(A)
将指令中的地址码先进行一次间接寻址,然后再与变址值进行运算,从而得到一个有效地址,即EA=(IX)十(A)。
基址变址寻址
EA=(BR)+(IX)+A
堆栈寻址
定义:操作数存放在堆栈中,隐含使用堆栈指针SP作为操作数地址
模拟堆栈来存储地址,寄存器堆栈分为硬堆栈和软堆栈
硬:
使用寄存器实现的
注意:由于栈顶位置固定,故不必设置堆栈的栈顶指针
软:
在一个主存区域中实现的 (函数调用,局部变量)
访存次数总结:
不含取本条指令的访存
X86汇编指令、 机器级表示
X86默认字长 32bit、Intel格式,一般小端方式存储
寄存器只有Ri、PC、PSW是程序员可见的
有关寄存器
A
累加器EAX
通常用于存储操作结果
B
基地址EBX
在内存寻址时存放基地址 (基址寄存器)
C
计数ECX
某些指令的计数器
D
数据EDX
与EAX经常配合使用
32位:E__X 低16位:__X __X的高8位:__H __X的低8位:__L 通用寄存器
变址ESI、EDI
ESI通常用于存储当前正在处理的源数据的索引或地址(变址寄存器)
堆栈基EBP
堆栈顶ESP
这两个寄存器不能乱用;实现函数调用
指令指针EIP
PC
标志EFLAGS
PSW
寻址模式
数据类型大小:
DB、DW、DD
DB:字节
DW:字
DD:双字
常用指令
数据传送指令
mov + 目的操作数 + 源操作数
操作数:指令的操作对象或者操作对象存放的地址(直接间接地址)
操作数类型
例如
注意:mov指令的两个操作数不能同时是内存
push+操作数
push指令将操作数压入堆栈
操作数可以是寄存器、内存、立即数
注意:默认x86的堆栈是向低地址生长的满栈。这里的满栈是指堆栈指针指向最后一个已入栈的元素的栈,空栈是指堆栈指针指向下一个将要入栈元素的空位的栈
例如
pop+操作数
pop指令把栈顶元素弹出至操作数
操作数只能是内存或寄存器,不能是立即数
例如
算数运算指令
add/sub dst src
结果存放在dst中
imul dst src
相乘 i表示Integer
imul reg src1 src2
idiv + 除数
包含隐含寻址
商存入eax,余数存入edx
被除数在edx:eax中
neg
取负
inc/dec
++ / --
逻辑运算指令
and/or/xor+dst+src
shl/shr
shift + left/right
not
位翻转
分支,循环结构
cmp、test
只影响状态标志
jmp/jcondtion
实现程序控制
jcondition: 结合cmp
jle
jl
jge
jg
je
jne
jz
函数调用
push pop
ESP
call ret
jcondition的FLAG
PSW中的几个标志位
CF
借位/错位标志
最高位出现了进位/借位的时候就是CF = 1
ZF
零标志位
结果为0的时候,ZF = 1
OF
溢出标志位
结果溢出了,OF = 1
SF
符号标志位
如果运算结果为负,则SF = 1
AT&T和Intel的汇编格式
22
汇编语法格式区分
机器级表示
选择语句
无条件转移指令--jmp
写汇编语言代码时,一般会以函数名作为“标号”,标注该函数指令的起始地址
条件转移指令--jconditon (一般配合cmp指令使用)
举例
循环语句
使用条件转移指令实现
四个部分
循环前的初始化
是否直接跳出循环
循环主体
是否继续循环
loop指令实现
loop指令不会影响标志位,只查
函数调用 过程调用
重要概念
栈帧
在函数调用栈中,一个栈帧对应一层函数,用于存储每层函数相关的一些信息 (保存函数大括号内定义的局部变量,保存函数调用相关的信息)
栈底在高地址方向,栈顶在低地址方向。以4字节为单位操作栈帧
当前正在执行的函数栈帧,位于栈顶
ebp,esp寄存器
标记了当前正在执行的函数栈帧范围
ebp指向当前函数栈帧底部4字节、esp指向当前函数栈帧顶部4字节 (存放的是内存地址)
push,pop,mov指令
先将esp-4,push指令将数据压入栈顶 (数据来自立即数、寄存器的值,主存地址的值)
pop指令将栈顶元素出栈,并将esp+4 (出栈的数据放在寄存器、主存地址)
只能对栈顶进行操作
mov指令
结合esp、ebp指针访问栈帧数据 可以使用add/sub指令修改栈顶指针esp的值
如何切换栈帧
在每个函数开头,需例行执行enter指令----等价于push ebp mov ebp,esp 保存上一层函数栈帧,设置当前函数栈帧
每个函数ret之前,需例行执行leave指令----等价于mov esp,ebp pop ebp 恢复上一层函数的栈帧
流程
一个栈帧包含哪些内容(自底向上)
①上一层栈帧的基地址(ebp旧值)
一定存在。用于恢复上一层函数的栈帧
②若干个局部变量
不一定存在
③未使用区
gcc编译器将每个栈帧大小设置为16B的整数倍,追求数据对齐设置的(当前函数的栈帧除外)
④部分寄存器值
调用函数前,如果有必要,可将某些寄存器的值入栈保存,防止中间结果被破坏
不一定存在
⑤若干个调用参数
⑥返回地址(IP旧值)
一定存在(发生调用时)
如何访问栈帧内数据
访问当前函数的局部变量
[ebp-4]、[ebp-8]...
访问上一层函数传过来的参数
[ebp+8]、[ebp+12].....
发起调用,返回
call指令
①将IP旧值压栈保存(保存在函数的栈帧顶部)
②设置IP新值,无条件转移至被调用函数的第一条指令
保存断点,设置新值
ret指令
从函数的栈帧顶部找到IP旧值,将其出栈并恢复IP寄存器
如何传递参数,返回值
在call指令前,将调用参数写入栈帧顶部区域
在ret指令前,将函数返回值写入eax寄存器
函数调用栈在内存中的位置
流程
例题举例:
考题:
1. 考C语言:递归次数
2. 指令概念:条件转移指令、(无条件跳转指令、函数调用、函数返回)→ 一定出现程序跳转
3. 虚地址计算:17条指令的地址;相对寻址:PC的偏移量;大端小端
4. 数据溢出:long和int
5. 带标记的乘法器OF判断;异常处理:溢出陷入指令。
并且告诉了R[eax] = R[eax] * R[ecx]
考频:低
17大、19大*2
CISC、RISC
考频:低
09、11
CISC
Complex 复杂指令集 x86
RISC
Reduced 精简指令集 ARM
对比:
END