王道

您所在的位置:网站首页 risc控制器多采用微程序控制方式 王道

王道

2024-04-25 22:55| 来源: 网络整理| 查看: 265

王道指令系统

p165

【考纲内容】

(一)指令格式

指令的基本格式

定长操作码指令格式

扩展操作码指令格式

(二)指令的寻址方式

有效地址的概念

数据寻址和指令寻址

常见寻址方式

(三)CISC和 RISC的基本概念

【复习提示】指令系统是表征一台计算机性能的重要因素。读者应注意扩展操作码技术,各种寻址方式的特点及有效地址的计算,相对寻址有关的计算,CISC与RISC 的特点与区别。本章知识点出选择题的概率较大,但也有可能结合其他章节出有关指令的综合题。2014年、2015年已连续两次出现指令系统和指令流水线的大题。指令系统格式和指令寻址方式与CPU指令执行过程部分紧密结合,希望读者引起重视。

在学习本章时,请读者思考以下问题:

1)什么是指令?什么是指令系统?为什么要引入指令系统?

2)一般来说,指令分为哪些部分?每部分有什么用处?

3)对于一个指令系统来说,寻址方式多和少有什么影响?

请读者在本章的学习过程中寻找答案,本章末尾会给出参考答案。

指令格式

指令(机器指令)是指示计算机执行某种操作的命令。一台计算机的所有指令的集合构成该机的指令系统,也称指令集。 $\color{red}{\text{指令系统}}$ 是计算机的主要属性, $\color{green}{\text{位于硬件和软件的交界面上}}$ 。

指令的基本格式

一条指令就是机器语言的一个语句,它是一组有意义的二进制代码。一条 $\color{red}{\text{指令}}$ 通常包括 $\color{green}{\text{操作码}}$ 字段和 $\color{green}{\text{地址码}}$ 字段两部分:

图片详情找不到图片(Image not found)

其中,操作码指出指令中该指令应该执行什么性质的操作以及具有何种功能。操作码是识别指令、了解指令功能及区分操作数地址内容的组成和使用方法等的关键信息。例如,指出是算术加运算还是算术减运算,是程序转移还是返回操作。

地址码给出被操作的信息(指令或数据)的地址,包括参加运算的一个或多个操作数所在的地址、运算结果的保存地址、程序的转移地址、被调用的子程序的入口地址等。

指令的长度是指一条指令中所包含的二进制代码的位数。指令字长取决于操作码的长度、操作数地址码的长度和操作数地址的个数。指令长度与机器字长没有固定的关系,它可以等于机器字长,也可以大于或小于机器字长。通常,把指令长度等于机器字长的指令称为 $\color{green}{\text{单字长指令}}$ ,指令长度等于半个机器字长的指令称为 $\color{green}{\text{半字长指令}}$ ,指令长度等于两个机器字长的指令称为 $\color{green}{\text{双字长指令}}$ 。

在一个指令系统中,若所有指令的长度都是相等的,则称为 $\color{green}{\text{定长指令字结构}}$ 。定字长指令的执行速度快,控制简单。若各种指令的长度随指令功能而异,则称为 $\color{green}{\text{变长指令字结构}}$ 。然而,因为主存一般是按字节编址的,所以指令字长多为字节的整数倍。

根据指令中操作数地址码的数目的不同,可将指令分成以下几种格式。

零地址指令图片详情找不到图片(Image not found)

只给出操作码OP,没有显式地址。这种指令有两种可能:

1)不需要操作数的指令,如空操作指令、停机指令、关中断指令等。

2)零地址的运算类指令仅用在堆栈计算机中。通常参与运算的两个操作数隐含地从栈顶和次栈顶弹出,送到运算器进行运算,运算结果再隐含地压入堆栈。

一地址指令图片详情找不到图片(Image not found)

这种指令也有两种常见的形态,要根据操作码的含义确定究竟是哪一种。

1)只有目的操作数的单操作数指令,按 $A_1$ 地址读取操作数,进行OP操作后,结果存回原地址。

指令含义:$\text{OP}(\text{A}_1) \to \text{A}_1$

如操作码含义是加1、减1、求反、求补等。

2)隐含约定目的地址的双操作数指令,按指令地址A、可读取源操作数,指令可隐含约定另一个操作数由ACC(累加器)提供,运算结果也将存放在ACC中。

指令含义:$\text{(ACC)OP}(\text{A}_1) \to \text{ACC}$

若指令字长为32位,操作码占8位,1个地址码字段占24位,则指令操作数的直接寻址范围为$2^{24}=16\text{M}$

二地址指令图片详情找不到图片(Image not found)

指令含义:$(\text{A}_1)\text{OP}(\text{A}_2)\to \text{A}_1$

若指令字长为32位,操作码占8位,两个地址码字段各占12位,则指令操作数的直接寻址范围为$2^{12}=4\text{K}$

三地址指令图片详情找不到图片(Image not found)

指令含义:$(\text{A}_1)\text{OP}(\text{A}_2) \to \text{A}_3$

若指令字长为32位,操作码占8位,3个地址码字段各占8位,则指令操作数的直接寻址范围为$2^8=256$若地址字段均为主存地址,则完成一条三地址需要4次访问存储器(取指令1次,取两个操作数2次,存放结果1次)。

四地址指令图片详情找不到图片(Image not found)

指令含义:$(\text{A}_1)\text{OP}(\text{A}_2) \to \text{A}_3, \text{A}_4$=下一条将要执行指令的地址。

若指令字长为32位,操作码占8位,4个地址码字段各占6位,则指令操作数的直接寻址范围为$2^6=64$

定长操作码指令格式

定长操作码指令在指令字的最高位部分分配固定的若干位(定长)表示操作码。一般$n$位操作码字段的指令系统最大能够表示$2^n$条指令。定长操作码对于简化计算机硬件设计,提高指令译码和识别速度很有利。当计算机字长为32位或更长时,这是常规用法。

扩展操作码指令格式

为了在指令字长有限的前提下仍保持比较丰富的指令种类,可采取可变长度操作码,即全部指令的操作码字段的位数不固定,且分散地放在指令字的不同位置上。显然,这将增加指令译码和分析的难度,使控制器的设计复杂化。

最常见的变长操作码方法是扩展操作码,它使操作码的长度随地址码的减少而增加,不同地址数的指令可具有不同长度的操作码,从而在满足需要的前提下,有效地缩短指令字长。图4.1所示即为一种扩展操作码的安排方式。

再图4.1中,指令字长为16位,其中4位为基本操作码字段$\text{OP}$,另有3个4位长的地址字段$A_1,A_2\text{和}A_3$。四位操作码若全部用于三地址指令,则有16条。图4.1中所示的三地址指令为15条,1111留作扩展操作码之用;二地址指令为15条,1111 1111留作扩展操作码之用;一地址指令为15条,1111 1111 1111留作扩展操作码之用;零地址指令为16条。

除这种安排外,还有其他多种扩展方法,如形成15条三地址指令、12条二地址指令、63条一地址指令和16条零地址指令,共106条指令,请读者自行分析。

在设计扩展操作码指令格式时,必须注意以下两点:

1)不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同。

2)各指令的操作码一定不能重复。通常情况下,对使用频率较高的指令分配较短的操作码,对使用频率较低的指令分配较长的操作码,从而尽可能减少指令译码和分析的时间。

图4.1 扩展操作码技术找不到图片(Image not found)指令的操作类型

设计指令系统时必须考虑应提供哪些操作类型,指令操作类型按功能可分为以下几种。

数据传送

传送指令通常有寄存器之间的传送(MOV)、从内存单元读取数据到CPU寄存器(LOAD)、从CPU寄存器写数据到内存单元(STORE))等。

算术和逻辑运算

这类指令主要有加(ADD)、减(SUB)、比较(CMP)、乘(MUL)、除(DIV)、加1(INC)、减1 (DEC)、与(AND)、或(OR)、取反(NOT)、异或(XOR)等。

移位操作

移位指令主要有算法移位、逻辑移位、循环移位等。

转移操作

转移指令主要有无条件转移(JMP)、条件转移(BRANCH)、调用(CALL )、返回(RET)、陷阱(TRAP)等。无条件转移指令在任何情况下都执行转移操作,而条件转移指令仅在特定条件满足时才执行转移操作,转移条件一般是某个标志位的值,或两个或两个以上的标志位组合。

调用指令和转移指令的区别:执行调用指令时必须保存下一条指令的地址(返回地址),当子程序执行结束时,根据返回地址返回到主程序继续执行;而转移指令则不返回执行。

输入输出操作

这类指令用于完成CPU 与外部设备交换数据或传送控制命令及状态信息。

指令的寻址方式

寻址方式是指寻找指令或操作数有效地址的方式,即确定本条指令的数据地址及下一条待执行指令的地址的方法。寻址方式分为 $\color{green}{\text{指令寻址}}$ 和 $\color{green}{\text{数据寻址}}$ 两大类。

指令中的地址码字段并不代表操作数的真实地址,这种地址称为 $\color{green}{\text{形式地址}}$ (A)。形式地址结合寻址方式,可以计算出操作数在存储器中的真实地址,这种地址称为 $\color{green}{\text{有效地址}}$ (EA)。

注意,(A)表示地址为A的数值,A既可以是寄存器编号,也可以是内存地址。对应的(A)就是寄存器中的数值,或相应内存单元的数值。例如,EA=(A)意思是有效地址是地址A中的数值。

指令寻址和数据寻址

寻址方式分为指令寻址和数据寻址两大类。寻找下一条将要执行的指令地址称为指令寻址;寻找操作数的地址称为数据寻址。

$\color{red}{\text{指令寻址}}$

指令寻址方式有两种:一种是顺序寻址方式,另一种是跳跃寻址方式。

1) $\color{green}{\text{顺序寻址}}$ 可通过程序计数器(PC)加1(1个指令字长),自动形成下一条指令的地址。

2) $\color{green}{\text{跳跃寻址}}$ 通过转移类指令实现。所谓跳跃,是指下条指令的地址码不由程序计数器给出,而由本条指令给出下条指令地址的计算方式。注意,是否跳跃可能受到状态寄存器和操作数的控制,而跳跃到的地址分为绝对地址(由标记符直接得到)和相对地址(相对于当前指令地址的偏移量),跳跃的结果是当前指令修改PC值,所以下一条指令仍然通过程序计数器(PC)给出。

数据寻址

数据寻址是指如何在指令中表示一个操作数的地址,如何用这种表示得到操作数或怎样计算出操作数的地址。

数据寻址的方式较多,为区别各种方式,通常在指令字中设一个字段,用来指明属于哪种寻址方式,由此可得指令的格式如下所示:

图片详情找不到图片(Image not found)常见的数据寻址方式隐含寻址

这种类型的指令不明显地给出操作数的地址,而在指令中隐含操作数的地址。例如,单地址的指令格式就不明显地在地址字段中指出第二操作数的地址,而规定累加器(ACC)作为第二操作数地址,指令格式明显指出的仅是第一操作数的地址。因此,累加器(ACC)对单地址指令格式来说是隐含寻址,如图4.2所示。

隐含寻址的优点是有利于缩短指令字长;缺点是需增加存储操作数或隐含地址的硬件。

图片详情找不到图片(Image not found)立即(数)寻址

这种类型的指令的地址字段指出的不是操作数的地址,而是操作数本身,又称立即数。数据采用补码形式存放。图4.3所示为立即寻址示意图,图中#表示立即寻址特征,A就是操作数本身。

立即寻址的优点是指令在执行阶段不访问主存,指令执行时间最短;缺点是A 的位数限制了立即数的范围。

立即(数)寻址找不到图片(Image not found)直接寻址

指令字中的形式地址A是操作数的真实地址:EA,即EA=A,如图4.4所示。

直接寻址找不到图片(Image not found)

直接寻址的优点是简单,指令在执行阶段仅访问一次主存,不需要专门计算操作数的地址;缺点是A的位数决定了该指令操作数的寻址范围,操作数的地址不易修改。

间接寻址

间接寻址是相对于直接寻址而言的,指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即 EA =(A),如图4.5所示。间接寻址可以是一次间接寻址,还可以是多次间接寻址。

图片详情找不到图片(Image not found)

在图4.5中,主存字第一位为1时,表示取出的仍不是操作数的地址,即多次间址;主存字第一位为0时,表示取得的是操作数的地址。

间接寻址的优点是可扩大寻址范围(有效地址EA 的位数大于形式地址A的位数),便于编制程序(用间接寻址可方便地完成子程序返回);缺点是指令在执行阶段要多次访存(一次间接寻址需两次访存,多次间接寻址需根据存储字的最高位确定访存次数)。由于访问速度过慢,这种寻址方式并不常用。一般问到扩大寻址范围时,通常指的是寄存器间接寻址。

寄存器寻址

寄存器寻址是指在指令字中直接给出操作数所在的寄存器编号,即EA = $R_i$,其操作数在由R;所指的寄存器内,如图4.6所示。

寄存器寻址的优点是指令在执行阶段不访问主存,只访问寄存器,因寄存器数量较少,对应地址码长度较小,使得指令字短且因不用访存,所以执行速度快,支持向量/矩阵运算;缺点是寄存器价格昂贵,计算机中的寄存器个数有限。

图片详情找不到图片(Image not found)寄存器间接寻址

寄存器间接寻址是指在寄存器$R_i$中给出的不是一个操作数,而是操作数所在主存单元的地址,即 EA=($R_i$),如图4.7所示。

图片详情找不到图片(Image not found)

寄存器间接寻址的特点是,与一般间接寻址相比速度更快,但指令的执行阶段需要访问主存(因为操作数在主存中)。

相对寻址

相对寻址是把程序计数器(PC)的内容加上指令格式中的形式地址A而形成操作数的有效地址,即 EA= (PC)+A,其中A是相对于当前指令地址的位移量,可正可负,补码表示,如图4.8所示。

在图4.8中,A的位数决定操作数的寻址范围。

相对寻址的优点是操作数的地址不是固定的,它随PC值的变化而变化,且与指令地址之间总是相差一个固定值,因此便于程序浮动。相对寻址广泛应用于转移指令。

图片详情找不到图片(Image not found)

注意,对于转移指令JMP A,当CPU从存储器中取出一字节时,会自动执行(PC)+1→PC。若转移指令的地址为X,且占2B,在取出该指令后,PC的值会增2,即$(\text{PC})=X+1$,这样在执行完该指令后,会自动跳转到$\text{X+2+A}$的地址继续执行。

基址寻址

基址寻址是指将CPU 中基址寄存器(BR)的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA =(BR)+ A。其中基址寄存器既可采用专用寄存器,又可采用通用寄存器,如图4.9所示。

图片详情找不到图片(Image not found)

基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定,主要用于解决程序逻辑空间与存储器物理空间的无关性。在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)。采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但其内容仍由操作系统确定。

基址寻址的优点是可扩大寻址范围(基址寄存器的位数大于形式地址A的位数);用户不必考虑自己的程序存于主存的哪个空间区域,因此有利于多道程序设计,并可用于编制浮动程序,但偏移量(形式地址A)的位数较短。

变址寻址

变址寻址是指有效地址EA 等于指令字中的形式地址A与变址寄存器IX的内容之和,即EA = (IX)+ A,其中为变址寄存器(专用),也可用通用寄存器作为变址寄存器。图4.10所示为采用专用寄存器IX的变址寻址示意图。

变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变(作为偏移量),形式地址A不变(作为基地址)。

变址寻址的优点是可扩大寻址范围(变址寄存器的位数大于形式地址A的位数);在数组处理过程中,可设定A 为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序。偏移量(变址寄存器IX)的位数足以表示整个存储空间。

显然,变址寻址与基址寻址的有效地址形成过程极为相似。但从本质上讲,两者有较大区别。基址寻址面向系统,主要用于为多道程序或数据分配存储空间,因此基址寄存器的内容通常由操作系统或管理程序确定,在程序的执行过程中其值不可变,而指令字中的A是可变的;变址寻址立足于用户,主要用于处理数组问题,在变址寻址中,变址寄存器的内容由用户设定,在程序执行过程中其值可变,而指令字中的A是不可变的。

图片详情找不到图片(Image not found)堆栈寻址

堆栈是存储器(或专用寄存器组)中一块特定的、按后进先出(LIFO)原则管理的存储区,该存储区中读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)。 $\color{red}{\text{堆栈}}$ 可分为 $\color{green}{\text{硬堆栈}}$ 与 $\color{green}{\text{软堆栈}}$ 两种。

寄存器堆栈又称硬堆栈。寄存器堆栈的成本较高,不适合做大容量的堆栈;而从主存中划出一段区域来做堆栈是最合算且最常用的方法,这种堆栈称为软堆栈。

在采用堆栈结构的计算机系统中,大部分指令表面上都表现为无操作数指令的形式,因为操作数地址都隐含使用了SP。通常情况下,在读/写堆栈中的一个单元的前后都伴有自动完成对SP内容的增量或减量操作。

下面简单总结寻址方式、有效地址及访存次数(不包含为了取本条指令而做的访存),见表4.1。

图片详情找不到图片(Image not found)$\mho$(为什么隐含寻址的访存次数是0,他不是向 $\color{green}{\text{内存}}$ 取操作数就算一次访存吗,否则变址寻址这些凭什么是1次)X86汇编指令入门

近几年的408真题频繁涉及X86汇编指令和机器代码相关的知识,这部分内容并不在考纲范围内,但如果对汇编知识和程序在机内执行的原理毫无了解,那么解题可能会难以下手。

相关寄存器

X86处理器中有8个32位的通用寄存器,各寄存器及说明如图4.11所示。为了向后兼容,EAX、EBX、ECX和 EDX 的高两位字节和低两位字节可以独立使用,E为Extended,表示32位的寄存器。例如,EAX的低两位字节称为AX,而AX的高低字节又可分别作为两个8位寄存器,分别称为AH和AL。寄存器的名称与大小写无关,既可以用EAX,又可以用eax。

图片详情找不到图片(Image not found)$\blacktriangleright$(图中的BAX应该是EAX吧)

除EBP和 ESP外,其他几个寄存器的用途是比较任意的。

寻址模式和内存分配

1)寻址模式

X86提供了一种灵活的内存寻址方式,这里以mov指令为例。mov用于在内存和寄存器之间移动数据,它有两个参数:第一个是目的地址,第二个是源地址。

下面的例子是汇编程序中常见的方式:

代码详情123456mov eax, [ebx] ;将ebx值指示的内存地址中的4字节传送到eaxmov [var],ebx ;将ebx值传送到var的值指示的内存地址中mov eax, [esi-4] ;将esi-4值指示的内存地址中的4字节传送到eaxmov [esi+eax],cl ;将c1值传送到esi+eax值指示的内存地址中mov edx,[esi+4*ebx] ;将esi+4*ebx值指示的内存中的4字节传送到edx

最多只能利用两个32位寄存器和一个32位的有符号常数相加计算出一个内存地址,下面是两个违反规则的例子:

代码详情123mov eax, [ebx-ecx] ;错误,只能用加法mov [eax+esi+edi], ebx ;错误,最多只能有两个寄存器参与运算

2)数据类型长度规定

在汇编语言中声明内存大小时,一般显式地使用DB(字母D表示 Data,字母B表示Byte)、DW(字母W表示Word,2Bytes)和DD(第二个字母D表示Double Word,4Bytes),这样就能很好地指导编译器分配内存空间,但是对于

代码详情1mov [ebx], 2;

若无特殊标识,则不确定常数⒉是单字节、双字节还是双字。对于这种情况,X86提供了三个指示规则标记,分别为BYTE PTR、WORD PTR和 DWORD PTR,如将上例写成

代码详情1234mov byte ptr [ebx],2 ;将2以单字节形式传送到ebx值指示的内存地址中mov word ptr [ebx], 2 ;将2以双字节形式传送到ebx值指示的内存地址中mov dword ptr [ebx],2 ;将2以四字节形式传送到ebx值指示的内存地址中常用指令

汇编指令通常可以分为数据传送指令、逻辑计算指令和控制流指令,本节将讲述其中最重要的指令。以下用于操作数的标记分别表示寄存器、内存和常数。

:表示任意寄存器,若其后带有数字,则指定其位数,如表示32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、ESP或EBP);表示16位寄存器(AX、 BX、CX或 DX);表示8位寄存器(AH、AL、BH、BL、CH、CL、DH、DL )。

:表示内存地址(如[ eax ]、[ var+4 ]或dword ptr [ eax+ebx ])。

:表示8位、16位或32位常数。表示8位常数;表示16位常数;表示32位常数。(constant)

X86中的指令机器码长度为1字节,对同一指令的不同用途有多种编码方式,比如 mov指令就有28种机内编码,用于不同操作数类型或用于特定寄存器,例如,

代码详情123456mov ax,;机器码为B8Hmov al,;机器码为BOHmov /,;机器码为89Hmov , /;机器码为8AHmov ,/ ;机器码为8BH数据传送指令

mov指令

mov指令将第二个操作数(寄存器的内容、内存中的内容或常数值)复制到第一个操作数(寄存器或内存)。但不能用于直接从内存复制到内存,其语法如下:

代码详情12345mov ,mov ,mem>mov ,mov , mov ,

举例:

代码详情123mov eax, ebx;将ebx值复制到eaxmov byte ptr [var], 5;将5保存到var值指示的内存地址的一字节中

push指令

push 指令将操作数压入内存的栈,常用于函数调用。ESP是栈顶,压栈前先将 $\color{green}{\text{ESP值减4}}$ (栈增长方向与内存地址增长方向相反),然后将操作数压入ESP指示的地址。其语法如下:

代码详情1234push push push

举例(注意, $\color{green}{\text{栈中元素固定为32位}}$ ):

代码详情12push eax;将eax值压栈push [var];将var值指示的内存地址的4字节值压栈

pop指令

与push指令相反,pop 指令执行的是出栈工作,出栈前先将ESP指示的地址中的内容出栈,然后将ESP值加4。其语法如下:

代码详情123pop edi ;弹出栈顶元素送到edipop [ebx] ;弹出栈顶元素送到ebx值指示的内存地址的4字节中算术和逻辑运算指令

add/sub指令

add指令将两个操作数相加,相加的结果保存到第一个操作数中。sub指令用于两个操作数相减,相减的结果保存到第一个操作数中。它们的语法格式类似,语法如下:

代码详情123456add , / sub ,add , / sub ,mem>add , / sub ,add , / sub ,add , / sub ,

举例:

代码详情123sub eax, 10;eaxeax-10add byte ptr [var],10;10与 var值指示的内存地址的一字节值相加,并将结果保存在var值指示的内存地址的字节中

inc/dec指令

inc、dec指令分别表示将操作数自加1、自减1,其语法如下:

代码详情123inc / dec inc / dec

举例

代码详情123dec eax; eax值自减1inc dword ptr [var]; var值指示的内存地址的4字节值自加1

imul指令

带符号整数乘法指令,它有两种格式:①两个操作数,将两个操作数相乘,并将结果保存在第一个操作数中,第一个操作数必须为寄存器;②三个操作数,将第二个和第三个操作数相乘,并将结果保存在第一个操作数中,第一个操作数必须为寄存器。其语法如下:

代码详情12345imul ,imul ,mem>imul, , imul ,,

举例:

代码详情123imul eax, [var];eaxeax*[var]imul esi, edi, 25;esi edi *25

乘法操作结果可能溢出,则编译器置溢出标志OF=1,以使CPU调出溢出异常处理程序。

idiv指令

idiv是带符号整数除法指令,它只有一个操作数,即除数,而被除数则为edx:eax 中的内容(64位整数),操作结果有两部分:商和余数,商送到eax,余数则送到edx。其语法如下:

代码详情123idiv idiv

举例:

代码详情123idiv ebxidiv dword ptr [var]

and/or/xor指令

and、or、xor指令分别是逻辑与、逻辑或、逻辑异或操作指令,用于操作数的位操作,操作结果放在第一个操作数中。其语法如下:

代码详情123456and , / or , / xor ,and , / or , / xor , and , / or , / xor , and , / or , / xor ,and , / or , / xor ,

举例:

代码详情123and eax,OfH;将eax中的前28位全部置为0,最后4位保持不变xor edx, edx;置edx中的内容为0

not指令

not指令是位翻转指令,将操作数中的每一位翻转,即0→1、1→0。其语法如下:

代码详情123notnot

举例:

代码详情12not byte ptr [var];将var值指示的内存地址的一字节的所有位翻转

neg指令

neg是取负指令。其语法如下:

代码详情123neg neg

举例:

代码详情12neg eax ;eax cmp ,cmp ,cmp ,

cmp指令通常和jcondition指令搭配使用,举例:

代码详情123cmp dword ptr [var],10jne loop;如果var指示的内存地址的4字节内容等于10,则继续执行下一条指令;否则跳转到loop指示的指令执行

call/ret指令

call 和 ret这两条指令分别实现子程序(过程、函数等)的调用及返回。call 指令首先将当前执行指令地址入栈,然后无条件转移到由标签指示的指令。与其他简单的跳转指令不同,call指令保存调用之前的地址信息(当call 指令结束后,返回调用之前的地址)。ret指令实现子程序的返回机制,ret 指令弹出栈中保存的指令地址,然后无条件转移到保存的指令地址执行。call和ret是函数调用中最关键的两条指令,其语法如下:

代码详情12call ret

理解上述指令的语法和用途,可以更好地帮助读者解答相关题型。汇编语言虽不在考纲范围,但计算机组成原理是一门和硬件紧密关联的学科,涉及编译、指令、内存、处理机等方方面面。读者在上机调试℃程序代码时,也可以尝试用编译器调试,以便更好地帮助理解机器指令的执行,这也从侧面说明了408真题越来越重视考查学生的综合能力。

CISC和 RISC的基本概念

指令系统朝两个截然不同的方向的发展:一是增强原有指令的功能,设置更为复杂的新指令实现软件功能的硬化,这类机器称为复杂指令系统计算机(CISC),典型的有采用X86架构的计算机;二是减少指令种类和简化指令功能,提高指令的执行速度,这类机器称为精简指令系统计算机(RISC),典型的有ARM、MIPS 架构的计算机。

复杂指令系统计算机(CISC)

随着VLSI 技术的发展,硬件成本不断下降,软件成本不断上升,促使人们在指令系统中增加更多、更复杂的指令,以适应不同的应用领域,这样就构成了复杂指令系统计算机(CISC)。

CISC的主要特点如下:

1)指令系统复杂庞大,指令数目一般为200条以上。

2) $\color{green}{\text{指令的长度不固定}}$,指令格式多,寻址方式多。

3)可以访存的指令不受限制。

4)各种指令使用频度相差很大。

5)各种指令执行时间相差很大,大多数指令需多个时钟周期才能完成。

6)控制器大多数采用微程序控制。有些指令非常复杂,以至于无法采用硬连线控制。

7)难以用优化编译生成高效的目标代码程序。

如此庞大的指令系统,对指令的设计提出了极高的要求,研制周期变得很长。后来人们发现,一味地追求指令系统的复杂和完备程度不是提高计算机性能的唯一途径。对传统CISC指令系统的测试表明,各种指令的使用频率相差悬殊,大概只有20%的比较简单的指令被反复使用,约占整个程序的80%;而 80%左右的指令则很少使用,约占整个程序的20%。从这一事实出发,人们开始了对指令系统合理性的研究,于是 RISC随之诞生。

精简指令系统计算机(RISC)

精简指令系统计算机(RISC)的中心思想是要求指令系统简化,尽量使用寄存器-寄存器操作指令,指令格式力求一致。RISC的主要特点如下:

1)选取使用频率最高的一些简单指令,复杂指令的功能由简单指令的组合来实现。

2) $\color{green}{\text{指令长度固定}}$ ,指令格式种类少,寻址方式种类少。

3)只有Load/Store(取数/存数)指令访存,其余指令的操作都在寄存器之间进行。

4)CPU中通用寄存器的数量相当多。

5)RISC一定采用指令流水线技术,大部分指令在一个时钟周期内完成。

6)以硬布线控制为主,不用或少用微程序控制。

7)特别重视编译优化工作,以减少程序执行时间。

值得注意的是,从指令系统兼容性看,CISC大多能实现软件兼容,即高档机包含了低档机的全部指令,并可加以扩充。但RISC简化了指令系统,指令条数少,格式也不同于老机器,因此大多数RISC机不能与老机器兼容。由于 RISC具有更强的实用性,因此应该是未来处理器的发展方向。但事实上,当今时代Intel 几乎一统江湖,且早期很多软件都是根据CISC 设计的,单纯的RISC将无法兼容。此外,现代CISC结构的CPU已经融合了很多RISC的成分,其性能差距已经越来越小。CISC可以提供更多的功能,这是程序设计所需要的。

CISC和 RISC的比较

和 CISC相比,RISC的优点主要体现在以下几点:

1)RISC 更能充分利用VLSI芯片的面积。CISC的控制器大多采用微程序控制,其控制存储器在CPU芯片内所占的面积达50%以上,而RISC控制器采用组合逻辑控制,其硬布线逻辑只占CPU芯片面积的10%左右。

2)RISC 更能提高运算速度。RISC 的指令数、寻址方式和指令格式种类少,又设有多个通用寄存器,采用流水线技术,所以运算速度更快,大多数指令在一个时钟周期内完成

3)RISC便于设计,可降低成本,提高可靠性。RISC指令系统简单,因此机器设计周期短;其逻辑简单,因此可靠性高。

4)RISC有利于编译程序代码优化。RISC 指令类型少,寻址方式少,使编译程序容易选择更有效的指令和寻址方式,并适当地调整指令顺序,使得代码执行更高效化。

CISC和 RISC的对比见表4.2。

4.2 CISC和 RISC的比较找不到图片(Image not found)本章小结什么是指令?什么是指令系统?为什么要引入指令系统?

指令就是要计算机执行某种操作的命令。一台计算机中所有机器指令的集合,称为这台计算机的指令系统。引入指令系统后,避免了用户与二进制代码直接接触,使得用户编写程序更为方便。另外,指令系统是表征一台计算机性能的重要因素,它的格式与功能不仅直接影响到机器的硬件结构,而且也直接影响到系统软件,影响到机器的适用范围。

一般来说,指令分为哪些部分?每部分有什么用处?

一条指令通常包括操作码字段和地址码字段两部分。其中,操作码指出指令中该指令应该执行什么性质的操作和具有何种功能,它是识别指令、了解指令功能与区分操作数地址内容的组成和使用方法等的关键信息。地址码用于给出被操作的信息(指令或数据)的地址,包括参加运算的一个或多个操作数所在的地址、运算结果的保存地址、程序的转移地址、被调用子程序的入口地址等。

对于一个指令系统来说,寻址方式多和少有什么影响?

寻址方式的多样化能让用户编程更为方便,但多重寻址方式会造成CPU结构的复杂化(详见下章),也不利于指令流水线的运行。而寻址方式太少虽然能够提高CPU的效率,但对于用户而言,少数几种寻址方式会使编程变得复杂,很难满足用户的需求。

常见问题和易混淆知识点简述各常见指令寻址方式的特点和适用情况。

立即寻址操作数获取便捷,通常用于给寄存器赋初值。

直接寻址相对于立即寻址,缩短了指令长度。

间接寻址扩大了寻址范围,便于编制程序,易于完成子程序返回。

寄存器寻址的指令字较短,指令执行速度较快。

寄存器间接寻址扩大了寻址范围。

基址寻址扩大了操作数寻址范围,适用于多道程序设计,常用于为程序或数据分配存储空间。

变址寻址主要用于处理数组问题,适合编制循环程序。相对寻址用于控制程序的执行顺序、转移等。

基址寻址和变址寻址的区别:两种方式有效地址的形成都是寄存器内容+偏移地址,但是在基址寻址中,程序员操作的是偏移地址,基址寄存器的内容由操作系统控制,在执行过程中是动态调整的;而在变址寻址中,程序员操作的是变址寄存器,偏移地址是固定不变的。

一个操作数在内存可能占多个单元,怎样在指令中给出操作数的地址?

现代计算机都采用字节编址方式,即一个内存单元只能存放一字节的信息。一个操作数(如char、int、float、double)可能是8位、16位、32位或64位等,因此可能占用1个、2个、4个或8个内存单元。也就是说,一个操作数可能有多个内存地址对应。

有两种不同的地址指定方式:大端方式和小端方式。

大端方式:指令中给出的地址是操作数最高有效字节(MSB)所在的地址。

小端方式:指令中给出的地址是操作数最低有效字节(LSB)所在的地址。

装入/存储(Load/Store)型指令有什么特点?

装入/存储型指令是用在规整型指令系统中的一种通用寄存器型指令风格。这种指令风格在RISC 指令系统中较为常见。为了规整指令格式,使指令具有相同的长度,规定只有Load/Store指令才能访问内存。而运算指令不能直接访问内存,只能从寄存器取数进行运算,运算的结果也只能送到寄存器。因为寄存器编号较短,而主存地址位数较长,通过某种方式可使运算指令和访存指令的长度一致。

这种装入/存储型风格的指令系统的最大特点是,指令格式规整,指令长度一致,一般为32位。由于只有Load/Store指令才能访问内存,程序中可能会包含许多装入指令和存储指令,与一般通用寄存器型指令风格相比,其程序长度会更长。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3