1解释概念和术语:机器指令,指令系统,指令格式,指令字长,扩展编码,堆栈,边界对齐,寻址方式,CISC,RISC:
答:
机器指令:通常将要求硬件直接实现某种运算或操作的命令称为机器指令。
指令系统:所有机器指令的集合。
指令格式:指令格式通常由操作码字段和地址码字段构成。(之后有更详细解释)
指令字长:一个机器指令包含的二进制信息位数,指令字长取决于操作码长度,地址码长度,指令字长必须是存储字长的倍数,不然没有办法表示下条指令。
机器字长:CPU能够直接处理的二进制位数,通常与CPU内部的指令寄存器的位数相同。
扩展编码:这个问题较为复杂,新开一题解答;
堆栈:堆栈采用后进先出的顺序存取方式,注意,此处的堆栈和C语言里面的堆栈不相同,这里的推栈就是栈而已。典型的应用是暂存调用/返回指令的指令地址。
存储器堆栈(软堆栈)借助部分存储器空闲构成,CPU中设置堆栈指针寄存器SP用来指向堆栈栈顶,SS寄存器表示栈底。SP的移动方向
有高地址到低地址,低地址到高地址(图中),
假设堆栈中的数据长度为a个存储字长,Rin和Rout是长度为a个存储字长的寄存器,则,入栈操作,SP<-(SP)+a; [SP]<- Rin
出栈操作Rout<- [SP], SP <- (SP)-a;
边界对齐:一般而言,数据在存储器中都需要占据多个连续的存储字长,数据地址用第一个存储单元的地址表示,数据在存储器的存放设涉及到确定边界和次序两个方面的参数。
所谓边界:就是指数据存放对第一个存储单元地址的要求,
1边界对齐:数据长度为2^N个存储字时,数据地址的最低n位必须
为零。例如:
struct Demo
{
char a;
double b;
int c;
};
//sizeof(Demo) != 13 ,sizeof(Demo) = 24;
2次序:有大端次序和小端次序两种排列方式。
大端就是地址的高位部分存放数据的地位部分,小端就是地址的低位部分存放数据的高位部分。
//test
#include
#include
int isBigEndian()
{
unsigned short test = 0x1122;
if( *(unsigned char*)&test == 0x11)
return 1;
else
return 0;
}
int main()
{
if( isBigEndian() )
printf("Big-Endian\n");
else
printf("little-Endian\n");
}
一般interCPU是小端排序。
寻地方式:是指形成当前指令操作数或操作数地址及下条指令地址的方法。
1寻址方式分成指令寻址和数据寻址两大类。
一:指令寻址:
通过指令操作码可以区分当前指令是顺序寻址还是跳跃寻址。
如果是顺序寻址,那么下条指令的地址码是隐含的,即
下条指令地址=(PC)+a;
跳跃寻址的指令格式包含操作码和 下条指令地址码(显式的)。
二:数据寻址:
1立即寻址2寄存器寻址3相对寻址4隐含寻址...
(此处不细说)
CISC
complexinstruction set computer,指令种类多,寻址方式多,指令格式多。
RISC
reducedinstruction set computer, 指令种类少,寻址方式少,
指令格式规整。
2某指令系统中共有10种性质的操作,使用频率分别为0.30,0.20,0.16,0.09,0.08,0.07,0.04,0.03,0.02,0.01
请分别用定长编码法,霍夫曼编码法,同时有两种长度的霍夫曼扩展编码法进行编码,并计算三种方式编码的平均码长。
答:
定长编码:0000~1010,平均码长:4
霍夫曼编码:
I1 0.3 11
I2 0.2 01
I3 0.16 101
I4 0.09 001
I5 0.08 1001
I6 0.07 1000
I7 0.04 0001
I8 0.03 00001
I9 0.02 000001
I100.01 000000
平均码长:2.84
霍夫曼扩展编码:
这里总共有六种长度,取三位表示前面6种长度,四位表示 后面 4种长度
I10.3 000
I20.2 001
I30.16 010
I40.09 011
I50.08 100
I60.07 101
I70.04 1100
I80.03 1101
I90.02 1110
I100.01 1111
平均长度:0.10* 4 + 0.90 *3 = 3.1
如果是取二位表示前面2种长度,四位表示后面8种长度
平均长度=3.0;
所谓霍夫曼扩张编码:以此题为例:3位表示前面6种长度,证明
还有两种表示没有用,正好做后面四种的开头,后面四位可表示
的刚好是(2*2=4);
3设某机器指令字长为16,每个地址码为6位,指令有零地址,单地址,和双地址三种格式。
1操作码采用定长编码,且零地址指令,单地址指令分别是P种和Q种,则双地址指令最多有多少种?
2若操作码采用变长扩展编码,且零地址指令,双地址指令分别是X种和Y种,则单地址指令最多有多少种?
答:
1双地址指令操作码长:16-12= 4,
so,双地址指令最多有2^4– P- Q
2零地址的操作码16单地址10双地址4
前4位能用于零,单的是2^4– Y;
设单地址有M种,则前10位可用于零地址的有(2^4-Y)*2^6– M
从而,求得M
4某指令系统中,指令字长16,指令操作码采用扩展编码法,有单地址指令,双地址指令两种指令,若每个地址码均6位,且双地址指令为A条,则单地址指令最多有多少条:
答:双地址指令的操作码4位,单地址指令的操作码是10位,所以前10位用于单地址指令编码有2^6*( 2^4 – A)
5试比较直接寻址方式和寄存器间接寻址,基址寻址和变址寻址之间的不同。
答
直接寻址方式:指令中的操作数地址码存放的不是地址,而是操作数本身。
寄存器直接寻址:指令中的操作数地址码部分存放的是相应数据寄存器编号,相应的寄存器中存放的是操作数。
寄存器间接寻址:指令中的操作树地址码部分存放的是相应地址寄存器编号,相应寄存器中存放的是操作数的地址。寄存器间接寻址是具有间接寻址的最大寻址范围,只有一次访存,是使用频率最高的寻址方式之一。
基址寻址:指令中操作树地址码部分形式地址A加上基址寄存器的内容得到的是操作数的内存地址。此时,A也称为偏移地址。
变址选址:与基址寻址差不多,只是把基址寄存器换成变址寄存器。
变址寻址的初衷不是为了扩大寻址范围,而是便于数据块的规律访问,如访问数组中所有元素,这种情况下,形式地址A不变,变址寄存器的内容有规律的变化。
6设存储器按字节编址,相对寻址的转移指令字长为2B,第二字节是相对偏移量,用补码表示。CPU取值时每取出一个字节自动完成
PC<- (PC) +1操作。假设某相对寻址的转移指令的第一字节地址为2000H,请分别写出欲转移到地址为2008H的指令和地址为1FF8的指令时,该转移指令指令字的第二字节是什么内容:
答:该指令取完后:(PC)=(PC)+2= 2002H;
想要转移到地址为2008H,则地址偏移量为2008H-2002H = +06H;所以[2001H]= 06H;
想要转移到地址为1FF8H,则地址偏移量位1FF8H-2002H =
-0AH;所以[2001H]= 96H;(补码)
相关知识:相对寻址:操作数地址为地址码中形式地址A与程序计数器PC的内容相加的结果。