【计算机组成原理】王道视频笔记1

计算机只能识别0/1,通过低电平和高电平来给计算机传递0/1信号。

1.1 计算机的发展

为什么程序的错误会被称为bug,因为一开始编程只能写0/1(机器语言),是通过在一张纸代上打孔,有孔就是0,没孔就是1,那时候如果一直虫子出现在纸带上就会导致不能识别0/1,从而程序出错。

机器字长:计算机一次计算能处理的字节长度。如16位处理器一次能处理16位(2个字节)的数据。

1.2.1 计算机硬件组成

缺点:以运算器为中心,数据传输和存储都要经过运算器,这降低了运算器计算的效率。

总结

1.2.2 认识各个硬件

主存储器的基本组成

运算器基本组成

控制器的基本功能

计算机的工作过程

总结

1.2.3 计算机系统的层次结构

总结

计算机体系结构与计算机组成原理之间的区别

1.3 计算机的性能指标

1.3.1 存储器的性能指标

1.3.2 cpu的性能指标

CPU时钟周期表示CPU产生一次脉冲所需的时间,主频就表示CPU1s能产生所少次脉冲。如3.7GHz,就表示1s产生3.7x10^9次脉冲。脉冲就表示CPU发出的0/1信号,凸出是1,凹陷是0。

注意CPI不仅仅与CPU有关,可能也与其它硬件相关,如执行取指令,如果有一台电脑的内存负荷较大,即使是相同的CPU,这台电脑从内存取数的CLK也会比较长。

1.3.3 系统整体性能指标

关于数据通路带宽,如果数据总线一次能传输8bit数据,那传输16bit数据就需要两次,速度肯定比一次传输要慢。

总结

2.1.1 进位计数制

英文字母的表示

汉字的表示和编码

区位码的范围是(0~93,0~93),类似一个表格的坐标,如“啊”是1601,即(16,01)。在网络传输时如果值在0~31,那就是ASCII码中的通信字符,会导致程序错误,所以要加上20H(H表示是十六进制,十进制值是32);加上20H后又可能和可印刷字符冲突,可能会被当成ASCII码翻译成英文字符,所以又要加上80H(十进制是128),变成国标码,这样汉字的表示就在(160,160)之外了,不会冲突,这样也导致计算机中要表示一个汉子要用2个字节。

输入编码:如“内”,通过在键盘输入nei2来得到,这会被输入法程序转换成国标码。屏幕上的文字是用一个个像素点生成的。

汉字和英文字母在内存中的存储

总结

2.14 奇偶校验码

校验码原理

比如对于一个2bit的信息有4中表示(A、B、C、D),当00在传输中有一位0变成了1,如变成了01,那么如下表,计算机就会将A解析成B,且不会意识到接受的数据发生了跳变。

这时可以在前面加一位冗余位,变成3个bit,可以表示8种字符,但我们只取4中,如下图,此时A(100)在传输过程中跳变成101,计算机接收到后发现101不存在,即非法,就会让发送计算机重新发送。这里加冗余位的关键是改变了码距,码距为n的字符跳变了<=n-1位都能被识别。

总结

奇偶校验的码距是2。局限是偶校验只能检测奇数位错误,如二进制位中2n+1个0变成了1(或2n+1个1变成了0),使得原来有偶数个1变成了奇数个1,而且无法确定是哪一位出现的错误。奇校验同理。

 

2.1.5 海明码

需要多少位校验码?通过2^k >= n+k+1算出k,需要k位校验码。

当H1~H7中的某一位发生了跳变,会导致S1、S2、S3中的某一个值变成1,此时接收方就知道数据发生了跳变,这是检错。把S1、S2、S3组成一个二进制,那么这个二进制对应的十进制就是数据发生跳变的位置,可以把这个bit的值取反(0变1,1变0),这就是纠错。

海明码具有1位的纠错能力和2位的检错能力,前提是在原信息码和校验码的基础上再加上一个全校验码。

当p1发生了跳变,则S1 = 1,全体偶校验失败,说明1位错误,纠正即可。当p1和p2发生了跳变,S1和S2等于1,全体偶校验成功,说明有2位错误,要重传。

思考:有3位发生跳变了,S1、S2、S3中也会有一个变成1,那也能检错啊,为什么说检错能力是2位呢?

总结

2.1.6 循环冗余校验码(CRC)

下面的生成多项式是发送和接收方约定好的,接收方收到CRC码之后,就用生成多项式的二进制码对CRC码进行模二除,得到的结果如果是0那就表示没有出错,否则就是出错。

总结

CRC主要用于检错,比如在计算机网络中用来校验发送的数据包有没有发生错误或丢失的情况。

2.2.1 定点数的表示

无符号数的表示

有符号数的表示

原码

注意小数在二进制中的表示方法,比如对于十进制的浮点数5.5,它的整数部分的二进制是101,它的小数部分0.5的二进制表示是1,即5.5的二进制表示为101.1,为什么?因为小数部分的权值不一样,5是通过1 x 2^2 + 1 x 2^0计算出来的,0.5则是通过1 x 2^(-1)计算出来的,小数部分从左到右的权值分别为2^(-1),2^(-2)...。

反码

注意当符号位为0时,原码和反码相同。注意+0和-0的反码不同,也就是说真值0的反码有两种表示形式。

补码

注意,补码的真值0只有一种表示形式,因为-0的补码会变成00000000,这与+0的补码重合。既然如此,就规定-0的补码为-2^7(8位整数),而对于8bit的十进制,范围是[-(2^7-1),2^7-1],取不到-2^7,所以补码的取值范围比源码和反码多1个-2^n(n是数值位的个数)。

移码

移码就是补码的符号位取反。这样一来0(正)就变成1,方便比较大小。

总结

2.2.2 原码、补码、移码的作用

加减运算

处理器可以进行加减运算,减法运算的物理实现比加法运算复杂(王道视频说电路设计方面),所以对于减法运算也用加法来实现。但是在计算机中,正数之间相加很简单,直接对应位相加即可;由于负数的高位是1,如下图,14+(-14)的结果为10011100,显然不对,所以要想别的办法。

解决方法是负数采用补码的形式表示,因为计算机计算一个数的补码非常简单(取反和+1,计算机就擅长做这种事),如-14的补码就是11110010,这时候把14的的二进制加上-14的补码,结果为100000000,因为一个字节只有8位(32位也是一样的道理,结果会变成“1+32个0”),所以结果就是0,答案就出来了。

这里为什么把负数换成补码就能计算正确呢?搞清楚补码的原理就行了。这里假设一个整数用8bit表示,实际上,-14的补码是(-14的“补数”)的二进制表示,-14的补数=2^8 - (-14的绝对值)=256-14,而2^8 - (-14的绝对值)就是非符号位取反然后+1的结果,即11110010,14+(-14)=14+(256-14) = 256,这里有一个隐藏条件,就是一个数是8bit,超出8位就会被丢弃,所以加出来的结果默认会%2^8,256%256=0,就是这么简单。

使用补码进行加减运算时不用考虑符号位,无论加法还是减法,最后都会转变成加法。

2.2.3 移位运算

原码的算术移位(定点整数)

注意:源码算术位移,符号位保持不变,仅对数值位进行移位。

原码的算术移位(定点小数)

反码的算术移位

补码的算术移位

2.2.4 加减运算和溢出判断

溢出判断

下图中,2+2 = -4(补码的范围比原码多1)

符号扩展

负数扩展,在数值位右面补0(符号位不变),小数扩展在数值为右边补0.

总结

2.2.5-1 原码的乘法运算

十进制乘法

我们从小学习的乘法运算可以写成如下的加法运算(移位加法运算),而计算机很擅长做移位运算,所以计算机里面也是通过加法来计算乘法式子的,不过要先把十进制转换成二进制,再来做乘法运算。

二进制乘法

二进制乘法和整数乘法一样,只不过每一位只有0/1,一样可以用移位加法来实现。

机器实现

问题:

  • 符号位符合处理?
  • 乘积的位数扩大一倍,如何处理?
  • 所有的位积都要保存下来最后统一相加?

1)符号位处理

对乘数和被乘数的符号位进行异或处理,相同就是0(正),不同就是1(负)。

2)乘积位数扩大一倍的处理

比如用4个字节(32)位表示整数,若两个32位的整数相乘,乘积肯定比32位大,这就溢出了,属于程序设计者自己的问题,计算机不会做特殊处理,会将乘积存入32位的结果中,然后高位被丢弃,结果错误。

3)所有位积都要保存下来最后统一相加?

不用,用ACC(乘积高位)和MQ(乘数、乘积低位)寄存器来保存两个位积的结果即可。设机器字长为5bit,那ACC和MQ的总位数就是10bit(2个字长),可以完全存储一个乘积(没有哪个编程语言会把基本类型的变量的长度设得比1个机器字长还长)。

如下,ACC中初始所有位全为0,MQ中的最后一位如果是1,则将ACC+X,结果存入ACC中,然后ACC逻辑右移一位,高位补0,重复前面操作,直到乘数所有位都被判断或ACC和MQ都被乘积填满。其原理就是左边的计算过程。

2.2.5-2 补码的乘法运算

2.2.6-1 原码的除法运算

恢复余数法

看左边的除法计算过程,也就是先用被除数除以除数,判断商应该上0还是1,0就用被除数-0,1就用被除数-除数,得到余数,继续前面的操作,直到MQ寄存区被填满。、

计算机不会进行比较,它判断商应该上0还是1,是默认先上1,然后被看除数-除数的符号位是0还是1,1说明是负数,被除数比除数小,应该上0,所以要还原,还原就是用被除数再加上除数,然后把商的最低位改成0。这里的除数是补码,减就是加上除数绝对值的负数的补码。

加减交替法

...

2.2.6-2 补码除法运算

...

2.2.7 强制类型转换

见下图,注意有符号数的边长。

2.2.8 数据的存储和排列

大小端模式

计算机读取数据是从低地址往高地址读取。大端模式,即将字节的高位数据存放在低地址部分(如下图),这样计算机先读取到高位数据。小端模式相反,计算机先读取数据的低位数据。大端模式更便于人类阅读,而小端模式更便于机器处理,如进行加法运算时,是从低位往高位依次相加,所以先读取低位数据更好。

边界对齐方式

计算机每次访问内存只能读/写1个字(注意,不是字节,就是操作系统位数)。

对齐与不对齐对比:假设要在内存中存储3个char(1字节)和1个short(2字节),然后查询short数据。如果采用对齐方式,下面第一排会存3个char,第二排第一个会存short,第一排最后一个字节的空间就浪费了,好处是只用寻址1次,只要读取第二个字的数据即可(第二排)。如果采用不对齐方式,那第一排的最后一个字节空间会存储short的1个字节的数据,另一个字节的数据会放在第二个字的第一个字节位置,这样就要寻址两次,第一次读取第一个字和第二个字的数据,第二次获取第一个字的最后一个字节和第二个字的第一个字节的数据,拼接之后才能得到short。

2.3.1 浮点数的表示

浮点数的表示形式

如果用定点整数来表示10亿,那要写很长的数,而用科学计数法来表示就是1 x 10^10,是不是很简便。在程序中,在基数固定的情况下(如十进制就是10,二进制就是2),我们只需要存储尾数(上面的1)和阶码(上面的10次幂)即可,所以可以很简便的表示一个很大的数。

下面的阶符表示尾数中小数点左移还是右移(0左1右),数符表示尾数是正还是负。

尾数规格化

在下面的例子中,如果用1个字节来存储b,那么0,10;0.01001将会丢失精度,最后一个1会被抛弃,所以为了能最大限度提高浮点数尾数的精度,会要求尾数的最高位必须是有效值,即1.这种情况下将小数点右移一位,然后阶码+1即可。

浮点数的原码,要求尾数的数值位最高位为1,这样能表示更大的数的精度(是0的话没有意义,浪费bit位)。下面的1/2是因为小数点右边的位的值的基数是2^-1。

总结

2.3.2 IEEE754

移码的真值

真值范围是-128~127,表示浮点数时(以float为例),阶码是8位,以二进制存的时候加上127,计算是减去127,这样就不用管阶码的符号位了。

IEEE754标准

注意阶码用移码表示,尾数用原码表示。

十进制转换成浮点数例子

浮点数能表示的最小最大绝对值

注意,阶码真值可以取到-128~127,但是-128(11111111)和-127(00000000)这两个阶码真值有特殊用途,所以最小只能取-126。但是如果还有比最小最大绝对值更小或更大的数怎么表示呢?这个时候阶码全0或全1就起作用了,见下。

2.3.3 浮点数的运算

浮点数的加减运算

浮点数的加减运算——舍入

当对浮点数进行规格化(尾数高位要为1)时,会丢掉尾数的最后一位,这时会出现舍入的情况,具体有下面两种舍入策略。当舍去后,如果后一位进1,那么可能会发生连续的进位,最终导致尾数小数点左边也会进位,如1.110舍去0后变成10.00,这时又需要进行规格化,导致尾数数值右移一位,阶码+1,此时解码又可能会发生溢出,如规定阶码为2bit,溢出前真值为11,进1就变成100了,需要3位存储,这就是溢出。

强制类型转换

  • int转成float:会出现精度损失,因为int有效位数是32,而float有效位数为24(23+1隐藏)。当int转float后,float的阶码真值是23时,小数点在最右边,float没有小数位,但此时的float只有24位,肯定不能表示转过来的32位的int的精度。
  • float转int:可能溢出其损失精度,溢出是因为float表示的十进制值的范围比int大;损失精度是因为会将小数部分截断。

总结

2.4.1 电路的基本原理、加法器设计

算术逻辑单元(ALU)

机器字长表示计算机能同时处理多少bit的数据,是根据ALU的输入信号和输出信号的长度来决定的。因为输入的数据都是先放到寄存器中的,计算后的结果也要放回寄存器,所以为了ALU和寄存器完美适配,一般会将两者长度设为一样,这就是机器字长的由来。

右边是控制信号,M表示读取的指令是算术运算还是逻辑运算还是辅助功能,S0~S3表示具体运算的类型。

3.1-3.2 存储器芯片结构和寻址

存储字(cell)、存储单元(row,一个存储单元里有n个存储字,n是存储字长)、存储体(由若干个存储单元组成)。即一块存储器芯片由存储体、MAR、MDR组成。

地址线连接存储器中的MAR寄存器,数据线连接MDR寄存器。

寻址

  • 定义:就是通过地址线传过来的数据,定位到存储体中的目标数据单元所在的位置。
  • 地址线:作用是输送现在想要访问的存储单元的地址。地址总线有多少根,地址就有多少位,假设地址总线有n根,然后最大寻址范围就是0~2^n-1,即能够表示2^n个存储单元的地址。如一块存储器芯片由2^(n-1)个存储单元,那计算机最多可以使用两块存储芯片。
  • 数据总线:作用是将数据写入到存储芯片的存储单元中,一个存储单元的存储字长有几位,数据总线就有多少根。
  • 数据线和地址线数量共同反映了存储芯片容量的大小,如地址线10根,数据线8根(每一个存储单元有8bit),则芯片容量=2^10 x 8bit = 8K位。
  • 片选线:是一个开关接口,有两种模式。高电平模式,即片选线上传过来的是1,整个存储器芯片工作;低电平模式,传来的是0,存储器芯片工作。 
  • 读写控制线:控制本地操作是 读还是写。
  • 译码器:将二进制位数翻译成不同的状态,如3位二进制右8中状态。

3.3.1 半导体存储器RAM

3.4.1 主存与CPU的连接

主存容量扩展——位扩展

注意下图中,CPU有8根数据总线,16根地址总线,CPU的同一根数据总线只能连接一块存储芯片,而所有的地址总线可以并行连接多个存储器芯片。

下面8块存储字长为1位的存储芯片同时为CPU提供服务,相当于1个8K X 8位的存储器,容量8KB。

主存容量扩展——字扩展

下图中,每个存储芯片有8根数据总线,一个存储芯片可以完美适配CPU,此时若有2块存储芯片的话不能同时为CPU服务,因为CPU不能区分数据总线上的数据时来自那一块存储芯片的。这是可以使用没有用到的地址总线来控制哪一块存储芯片工作(通过片选线)。

3.5 双口RAM和多模块存储器

存取周期

计算机中,存储器在存取之后不能立即进行下次存取,要有一定的恢复时间。注意这里存+恢复或取+恢复都是一个周期的时间。这里提升存取效率的关键就是把存取玩之后的“恢复时间”利用起来。

双端口RAM

RAM同时提供两个端口供两个CPU同时访问,同时访问可能会发生冲突(即可能同时读/写同一个存储单元),解决方法是当发生冲突时,把控制线置为0(忙),暂时关闭一个端口(线程安全)。

多模块存储器

  • 单体多字存储器:将m个普通存储器合并成一个存储器,合并后还是一个存储体,但是存储字(每一行)的长度变成了原来的m倍。
  • 多体并行存储器:m个存储器不合并,而且每个存储器有相同的容量、存取速度、读写控制线、MAR、MDR。它们技能并行工作,又能交叉工作(一个工作完另一个上)。

多体并行存储器

在计算机中,数据在存储器中是连续存储的,取的时候也是连续访问的。假设每个存储体的存取周期为T(存取时间+恢复时间)。

  • 高位交叉编址:高位是存储器编号,低位是存储器中的存储单元的地址。从一个存储期开始,存完一整个存储器之后,存到下一个存储器;取也同理。连续访问n个存储单元要花费nT。
  • 低位交叉编织:与上一个相反。存取是按:M0,M1,M2,M3,M0...的顺序来的。连续访问n个存储单元只需花费T+(n-1)τ(τ为下面右图中M1高度处左边空出的长度),τ为存取周期中的存取时间,这也就是流水线的原理

M个存储器组成的低位交叉编址存储器,可以将带宽提升M倍。

3.6.1 局部性原理及性能分析

局部性原理

下图中,假设要执行图中的for循环代码。主存每次存或取a[i]所耗费的时间为1000ns,CPU计算a[i]+2所需要5ns,那么程序执行总时间为2005us(微秒)。如果引入高速缓存Cache,假设Cache与CPU处理速度一样,那么Cache每次会从主存读入10个元素,耗时1000ns,之后计算这10个元素就不管主存的事了,总耗时为1150ns,计算1000个数就是115us,速度提升了一个数量级。

注意:CPU读/写数据,都要通过寄存器来暂存数据,而寄存器的位数是有限的(等于机器字长),所以一次只能读入一个a[i](存储单元);而Cache与主存同为存储器,可以相互传递多个存储单元,可以一次性将a[0]~a[9]同时读入。

3.6.2 Cache地址映射

  • Cache中存储的内容:标记项+数据。
  • 表机箱:主存字块标记、有效位、组号等。

主存与Cache交互的3个问题

主存与Cache地址映射

Cache中的一行(Cache块)是与主存之间传送数据的基本单位。

  • 空位随意放-全相连映射:将主存中的一行数据放到Cache中的任意一行中。将主存中的数据映射到Cache中,首先要知道Cache行里面到底有没有数据,因此要使用一个有效位来标记(1有0无);存了之后还要知道Cache中的这行数据到底是对应主存中的哪一行,方便之后对Cache重的数据修改后能同步更新主存中的对应数据,因此需要存入对应主存的字块内地址(绿+蓝)。

     

  • 对号入座-直接映射:主存0位置存入Cache0位置,主存1位置存入Cache1位置......主存m位置存入Cache中m%8位置。此时要想将Cache中的数据正确映射到主存中,需要Cache字块地址和字块内地址(绿),Cache字块地址+字块内地址(绿) = 字块内地址(绿+蓝)。

对号入座与空位随意放的优缺点比较:不能很好地利用空位,比如将主存中0位置数据放到了Cache0中,然后又要将主存中8的位置放入Cache0,覆盖了Cache0的数据,Cache中其余空位没有利用;优点是Cache中只用存放主存中绿色的字块内地址,这样硬件电路就不用那么复杂。

  • 按号分组-组内随意放:是随意放和对号入座两者的结合,Cache和主存用图中紫色的位作为组号。从Cache写数据到内存,首先通过Cache行的组号对应到主存中的一组数据,然后通过Cache行的字块内地址(最高位绿色)对应到内存组内的具体某一行;从内存读数据到Cache,也是通过组好确定Cache中的一组行,然后将数据随意放入组中的一行,同时存入字块内地址(最高绿色位)。

根据要分成几组,来确定使用几位作为组号,如2位就是4组,3位是8组。当使用0位作为组号,即整个存储器为1组,算法就变成了“空位随意放”,当每一行都是一组,算法就变成了“按号分组”。

  

3.6.3 Cache-替换算法及写策略

替换算法

写策略-命中

  • Cache主存地址映射机构:将CPU地址总线上的地址转换到Cache中对应的地址(如果命中)。
  • Cache替换机构:当未命中时,将主存中对应地址的数据传送到Cache中。
  • 写回法:写命中时,不立即写入主存,等到这块数据被换出时才写回主存。cache中被修改的行会设置一个脏位,为1时表示被修改过,这是为了避免读取同一个cache行时读到脏数据。
  • 全写法:写命中时,每次修改cache都会将数据同步回主存,由于从cache写回主存速度比较慢,一般使用写缓冲区。

写策略-未命中

  • 写分配法:把主存中的数据写入Cache,然后再修改,相当于把未命中问题转化为命中时的情况。搭配写回法使用。
  • 非写分配法:只写入主存,不调入Cache。搭配全写法使用。

3.7 虚拟存储器

介绍

主要用来提升存储系统的容量。主存的容量是有限的,主要是用来存储此时CPU需要计算的数据,而暂时不需要CPU来运行的数据就暂存在辅存中,比如一个程序,要执行的部分会先被加载到主存,未被执行的部分存放在辅存中。辅存具有价格低、容量大、速度慢的特点。

在执行中需要程序块和数据块时自动把它们移入主存的技术成为虚拟存储器技术。处理器生成的指令或数据的二进制地址成为虚拟或逻辑地址。这些地址用硬件和软件结合的方法转换成物理地址。如果一个虚拟地址指向程序空间或数据空间的一部分,而这部分当前位于物理主存中,那么主存对应位置的内容可以立即被访问。相反,如果引用的地址不在主存中,那么在使用它之前必须把它的内容放入主存中恰当的位置上。

 

4.1 指令格式

指令定义

指令由操作码和地址码组成。

指令格式-地址码

如图1,一条指令的执行需要访问内存4次(假设每个地址都是主存地址,也可能是寄存器地址)。

指令格式-操作码

同上图2

  • 定长操作码:n位操作码,意味着能表示2^n条指令。
  • 不定长操作码(扩展操作码):操作码长度可变。见下图。

下图中将1111留作扩展操作码之用,即3地址指令为15条,1111 1111也留作扩展操作码......就这样,一个16位的指令就能灵活表示0,1,2,3地址指令了。在设计扩展操作码指令格式时,必须注意以下两点:

操作类型

4.2.1 指令寻址

指令寻址是获取下一条欲执行指令的指令地址,始终是由程序计数器PC给出。

相关概念

字存储单元,字节存储单元,按字节寻址,按字寻址,机器字长,指令字长,存储字长,边界对其,边界不对齐。

指令寻址过程

  • 顺序寻址:PC(程序计数器)首先指向第一条执行,读取第一条指令,如果是非JMP操作,则自动将PC+1,只想下一条要执行的指令。
  • 跳跃寻址:如果是JMP操作,则将PC的值改成要跳跃的那条指令的地址。

4.2.2 数据寻址-1

指令中的操作数地址由寻址特征和形式地址构成,数据寻址就是根据寻址特征将形式地址转换成存储器中的实际地址。寻址特征一般是由一串二进制位表示。

立即寻址

将操作数的值直接存储在指令中,有点是指令执行时获取操作数不用访问主存,缺点是操作数的大小受到操作数位数的限制。

直接寻址

指令中存操作数在存储器中的实际地址,取操作数的时候根据这个地址去存储器中取出操作数,然后执行指令。,优缺点见下。

间接寻址

与直接寻址相对,指令中不是存的是操作数值的地址,而是存储器中的一个地址,这个地址可能存的还是间接地址,或者是操作数值的所在地址。主要优点是可以扩大寻址范围。

寄存器寻址和寄存器间接寻址

  • 寄存器寻址:操作数值存在寄存器中,指令中存寄存器的编号即可,当把指令加载到寄存器中后,就不用再访问主存了。
  • 寄存器间接寻址:寄存器中不是存操作数值,而是操作数在主存中的地址。

隐含寻址

当指令中没有给出操作数的地址,则默认是指某个地址。如下图,另一个操作数隐含在ACC寄存器中。

4.2.3 数据寻址2-偏移寻址

基址寻址

操作数的地址是基址寄存器和指令中的二进制位相加,当基址寄存器中的位数比形式地址的位数多时,可扩大寻址范围(长+短=长)。如果使用通用寄存器代替基址寄存器,那要在指令中指定寄存器编号,因为有多个通用寄存器。基址寻址有利于多到程序设计(看了操作系统再回过头来理解吧)。

变址寻址

注意第二张图,使用变址寄存器可以将大量重复的循环加指令简化成几行指令(从左边+10次到右边)。

相对寻址

4.2.4 数据寻址3-堆栈寻址

4.3 CISC和RISC

介绍

第四章总结

  • 10
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值