diff --git a/Computer-Organization/3-instruction-system-ex.md b/Computer-Organization/3-instruction-system-ex.md index 28f9852..21e6371 100644 --- a/Computer-Organization/3-instruction-system-ex.md +++ b/Computer-Organization/3-instruction-system-ex.md @@ -16,6 +16,18 @@ $D.24K$ 解:$D$。地址码为$12$位,二地址指令的操作码长度为$32-12-12=8$位,已定义了$250$条二地址指令,$2^8-250=6$,所以上一层多出了六种地址给单地址指令,即可以设计出单地址指令$6×2^{12}=24K$条。 +**例题** 某计算机按字节编址,指令字长固定且只有两种指令格式,其中三地址指令$29$条、二地址指令$107$条,每个地址字段为$6$位,则指令字长至少应该是()。 + +$A.24$位 + +$B.26$位 + +$C.28$位 + +$D.32$位 + +解:$A$。三地址指令有$29$条,所以其操作码至少为$5$位。以$5$位进行计算,它剩余$32-29=3$种操作码给二地址。而二地址另外多了$6$位给操作码,因此其数量最大达$3\times64=192$。所以指令字长最少为$23$位,因为计算机按字节编址,需要是$8$的倍数,所以指令字长至少应该是$24$位,选$A$。 + **例题** 设指令字长固定为$16$位,试设计一套指令系统满足: 1)有$15$条三地址指令 @@ -36,6 +48,32 @@ $D.24K$ 而零地址指令必然以$1111\,1111\,111$开头,正好余下$1+4=5$位也就是$32$条零地址指令可以满足条件。 +**例题** 假设指令字长为$16$位,操作数的地址码为$6$位,指令有零地址、一地址、二地址$3$种格式。 + +1)设操作码固定,若零地址指令有$M$种,一地址指令有$N$种,则二地址指令最多有几种? + +2)采用扩展操作码技术,若零地址指令有$M$种,一地址指令有$N$种,二地址指令有多少种?最多有几种? + +3)采用扩展操作码技术,若二地址指令有$Р$条,零地址指令有$Q$条,则一地址指令最多有几种? + +解:操作符拓展的思想都是一样的,本层操作符支持指令条数等于当前空余位的指数乘上上一层指令空余的位数。 + +1)对于操作码固定,对于所有指令都是一样的操作码。由于最多二地址,所以操作码为$16-2\times6=4$位,所以一共$2^4=16$条,二地址可用的就是$16-M-N$条。 + +2)设一地址指令给零地址指令空余了$x_1$种表示方式,二地址指令给一地址指令空余了$x_2$种表示方式。 + +所以$M=2^6\cdot x_1$,解出$x_1=M\cdot2^{-6}$,$N=x_2\times2^6-x_1$,解出$x_2=(N+M\times2^{-6})\times2^{-6}$。 + +同理二地址指令数量为$16-x_2$,即$2^4-(N+M\times2^{-6})\times2^{-6}$ + +最大为二地址指令只给一地址指令保留一位空余位的情况,即$=16-1=15$。 + +3)解题思路与第二问类似,只是变量不同,同样设一地址指令给零地址指令空余了$x_1$种表示方式,二地址指令给一地址指令空余了$x_2$种表示方式。 + +对于二地址指令,$P=2^4-x_2$,$x_2=2^4-P$。对于零地址指令,$Q=2^6x_1$,$x_1=Q\times2^{-6}$。 + +所以对于一地址指令,$=x_2\times2^6-x_1=(2^4-P)\times2^6-Q\times2^{-6}$。 + ## 指令寻址方式 ### 转移指令 @@ -86,6 +124,28 @@ $D.(M_{SP})\rightarrow A,(SP)-1\rightarrow SP$ 解:$B$。进、出堆栈时对栈顶指针的操作顺序是不同的,进栈时是先压入数据$(A)\rightarrow M_{SP}$,后修改指针$(SP)-1\rightarrow SP$,说明栈指针是指向栈顶的空单元的,所以出栈时要先修改指针$(SP)+1\rightarrow SP$,然后才能弹出数据$(M_{SP})\rightarrow A$,否则弹出的是一个空元素。 +### 指令设计 + +某模型机共有$64$种操作码,位数固定,且具有以下特点: + +1. 采用一地址或二地址格式。 +2. 有寄存器寻址、直接寻址和相对寻址(位移量为$-128\sim+127$)$3$种寻址方式。 +3. 有$16$个通用寄存器,算术运算和逻辑运算的操作数均在寄存器中,结果也在寄存器中。 +4. 取数/存数指令在通用寄存器和存储器之间传送数据。 +5. 存储器容量为$1MB$,按字节编址。 + +要求设计算术逻辑指令、取数/存数指令和相对转移指令的格式,并简述理由。 + +解: + +操作码$64$所以操作码位$6$位,寄存器$R_i$一共$16$个,所以寄存器$4$位,主存$A$大小$1MB$,所以直接寻址需要$20$位,偏移量$A$为$-128\sim127$,所以相对寻址需要$8$位。 + +注意:由于不同的寻址方式,所以需要加上寻址特征$M$,一共三种,所以需要两位。 + ++ 算术逻辑指令:寄存器+寄存器:$OP\,6+M\,2+R_1\,4+R_2\,4$。 ++ 取数/存数指令:寄存器+存储器:$OP\,6+M\,2+R_1\,4+A\,20$。 ++ 相对转移指令:$PC$+偏移量:$OP\,6+M\,2+A\,8$。 + ## 指令集计算机 **例题** 下列指令系统的特点中,有利于实现指令流水线的是()。 diff --git a/Computer-Organization/3-instruction-system.md b/Computer-Organization/3-instruction-system.md index 68b89d3..f389cfb 100644 --- a/Computer-Organization/3-instruction-system.md +++ b/Computer-Organization/3-instruction-system.md @@ -71,6 +71,7 @@ #### 拓展操作码 + 拓展操作码是变成操作码实现的一种,让操作码长度随地址码减少而增加。 ++ 操作码的位数至少为当种指令总条数的二对数。如指令总长度为$32$位,二地址指令有$27$条,则二地址指令的操作码至少有$27=2^4+11=5$位,否则不能操作这么多地址。 + 优点:在指令字长有限的前提下能保持比较丰富的指令种类。 + 缺点:增加了指令译码和分析的难度,使控制器的设计复杂化。 @@ -127,19 +128,22 @@ 目的是:缩短指令字长、扩大寻址空间、提高编程灵活性。 +寻址方式包括指令寻址和数据寻址。 + ### 操作数类型与存放方式 #### 操作数类型 + 地址:无符号整数。 -+ 数字:定点数浮点数、十进制数。 ++ 数字:定点数、浮点数、十进制数。 + 字符:$ASCII$。 + 逻辑数:逻辑运算。 #### 存放方式 -+ 大端方式:字地址为高字节地址。如$012345$。 -+ 小端方式:字地址为低字节地址。如$452301$。 ++ 若一个操作数有多个内存地址对应,则存放地址为: + + 大端方式:指令中给出的地址是操作数最高有效字节($MSB$)所在的地址。字地址为高字节地址。如$012345$。 + + 小端方式:指令中给出的地址是操作数最低有效字节($LSB$)所在的地址。字地址为低字节地址。如$452301$。 + 按字节地址寻址:给出个字节地址,可以取出长度为一个字节的数据。 + 按字地址寻址:给出个字地址,可以取出长度为一个字的数据。 + 按字节编址:每个字节存储单元都有一个地址编号。每个字中最小的字节地址就是字地址。 @@ -158,16 +162,13 @@ + 由于不同的机器数据字长不同,每台机器处理的数据字长也不统一,为了便于硬件实现,通常要求多字节的数据在存储器的存放方式能满足“边界对准”的要求。 + 数据存放的起始地址是数据长度(按照编址单位进行计算)的整数倍。 + 本方案是前两个方案的折衷,在一个周期内可以完成存储访问,空间浪费也不太严重。 -+ 若一个操作数有多个内存地址对应,则存放地址为: - + 大端方式:指令中给出的地址是操作数最高有效字节($MSB$)所在的地址。 - + 小端方式:指令中给出的地址是操作数最低有效字节($LSB$)所在的地址。 ### 指令寻址 用于确定要执行的下一条指令的地址。始终由程序计数器$PC$给出。 + 顺序寻址:由$PC$自动加上某个数寻址下一个要操作的指令,注意:不是单纯加一。如果是按字编址就是直接加一,如果是按字节编址则是加一个指令字长。 -+ 跳跃寻址:由转移指令指出。如执行到操作码为$JMP$,则跳跃到保存的地址码所指向的指令地址进行执行。跳跃地址分为绝对地址(标记符直接得到)和相对地址(相对当前地址的偏移量)。跳跃的结构是当前指令修改$PC$值,所以下一条指令仍通过$PC$给出。可实现程序的条件或无条件转移。 ++ 跳跃寻址:由转移指令指出。如执行到操作码为$JMP$,则跳跃到保存的地址码所指向的指令地址进行执行。跳跃地址分为绝对地址(标记符直接得到)和相对地址(相对当前地址的偏移量)。跳跃的结构是当前指令修改$PC$值,所以下一条指令仍通过$PC$给出。可实现程序的条件或无条件转移。注意:程序跳跃后,按新的指令地址开始顺序执行。因此,程序计数器的内容也必须相应改变,以便及时跟踪新的指令地址。 ### 数据寻址 @@ -187,7 +188,7 @@ + 变址寻址。 + 堆栈寻址。 -+ 此时指令就需要由:操作码$OP$+寻址地址(寻址方式)+形式地址$A$组成。形式地址不再是实际的地址,而是指令字中的地址。 ++ 此时指令就需要由:操作码$OP$+寻址特征(寻址方式)+形式地址$A$组成。形式地址不再是实际的地址,而是指令字中的地址。 + 有效地址$EA$就是通过寻址特征和形式地址进行运算得到的。 + 无论是有多少个地址,都必须给出成对的寻址特征和形式地址。 + 主存地址不能为负。 @@ -308,6 +309,8 @@ + 堆栈是存储器(或专用寄存器组)中一块特定的按“后进先出($LIFO$)”原则管理的存储区,该存储区中被读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针($SP$)。 + 寄存器做堆栈就是硬堆栈,成本高,主存做堆栈就是软堆栈。 +默认任何寻址方式都要加上一次取指访存一次: + 寻址方式|有效地址|访存次数 :------:|:------:|:------: 隐含寻址|程序指定|0 @@ -328,7 +331,10 @@ + 基址寻址扩大了操作数寻址范围,适用于多道程序设计,常用于为程序或数据分配存储空间。 + 变址寻址主要用于处理数组问题,适合编制循环程序。 + 相对寻址用于控制程序的执行顺序、转移等。 -+ 基址寻址和变址寻址的区别:两种方式有效地址的形成都是寄存器内容+偏移地址,但是在基址寻址中,程序员操作的是偏移地址,基址寄存器的内容由操作系统控制,在执行过程中是动态调整的;而在变址寻址中,程序员操作的是变址寄存器,偏移地址是固定不变的。 ++ 基址寻址和变址寻址的区别: + + 两种方式有效地址的形成都是寄存器内容+偏移地址。 + + 在基址寻址中,程序员操作的是偏移地址,基址寄存器的内容由操作系统控制,在执行过程中是动态调整的。偏移量较短。 + + 在变址寻址中,程序员操作的是变址寄存器,偏移地址是固定不变的。偏移量较大。 ## 指令集计算机