慕课《深入理解计算机系统》袁林枫老师章节测试1-9

1以下有关冯.诺依曼结构思想的叙述中,错误的是( C )。

A.计算机内部以二进制形式表示指令和数据

B.程序由指令构成,计算机能自动执行程序中一条一条指令

C.指令和数据都放在存储器中,两者在形式上有差别(无差别)

D.计算机由运算器、存储器、控制器和I/O设备组成

  

2以下有关指令以及指令执行过程的叙述中,错误的是(  B )。

A.将要执行的下条指令的地址总是在程序计数器PC中

B.指令中指定的操作数只能是存放在存储器中的数据  

C.指令由操作码和操作数或操作数的地址码构成

D.CPU中的控制器对指令操作码进行译码

     

3以下有关编程语言的叙述中,错误的是( D )。

A.汇编语言和机器语言都与计算机系统结构相关

B.计算机不能直接执行高级语言程序和汇编语言程序

C.用高级编程语言编写程序比用汇编语言更方便

D.不能直接用机器语言(机器指令)编写程序  

     

4以下有关机器指令和汇编指令的叙述中,错误的是( D  )。

A.机器指令和汇编指令一一对应,功能相同

B.汇编指令中用十进制或十六进制表示立即数

C.汇编指令中用符号表示操作码和地址码

D.机器指令和汇编指令都能被计算机直接执行   

     

5以下有关使用高级编程语言编写和开发软件的叙述中,错误的是(  D  )。

A.须有一套工具软件或集成开发环境,即语言处理系统

B.须有程序员与计算机交互的用户接口,即GUI或CUI

C.须有一个翻译或转换程序,即编译器或解释器

D.须程序员在应用程序中直接控制外设进行输入/输出

     

6一个完整的计算机系统包括硬件和软件。软件又分为( B  )。

A.操作系统和高级语言

B.系统软件和应用软件

C.低级语言程序和高级语言程序

D.操作系统和语言处理程序

     

7以下给出的软件中,属于系统软件的是(  D )。

A.MS Word

B.金山词霸

C.RealPlayer

D.Windows XP  

     

8以下有关指令集体系结构的叙述中,错误的是(  C )。

A.指令集体系结构的英文缩写是ISA

B.指令集体系结构位于计算机软件和硬件的交界面上

C.通用寄存器的长度、功能与编号不属于指令集体系结构的内容

D.指令集体系结构是指低级语言程序员所看到的概念结构和功能特性

     

9以下有关计算机系统层次结构的叙述中,错误的是( D )。

A.最上层是提供给最终用户使用的应用程序(软件)层

B.OS是对ISA和硬件的抽象,程序员通过OS使用系统资源

C.ISA是对硬件的抽象,软件通过ISA使用硬件提供的功能

D.应用程序员工作在指令集体系结构层,需要对底层很熟悉  (应是ISA)

     

10以下术语中,不属于计算机中硬件(即物理上实际存在的部件)的是(  B )。

A.算术逻辑部件

B.指令字

C.程序计数器(PC)

D.数据通路

 

1.108对应的十六进制形式是(C)。

A.5CH  108=6*16+12   

B.63H  6=0*16+6

C.6CH  倒取余数,十六进制为6CH

D.B4H

     

2–1029的16位补码用十六进制表示为(A)。

A.FBFBH    -1029=-1024-5=-2^10-2^2-2^0

B.0405H    1029的二进制:0000 0100 0000 0101B

C.7BFBH    -1029的二进制(从右向左遇到的第一个1的前面各位取反):

D.8405H     1111 1011 1111 1011B十六进制为FBFBH

     

3考虑以下C语言代码:

short si=–8196;

unsigned short usi=si;

执行上述程序段后,usi的值是(C)。

A.8196    -8196=-(8192+4)=-10 0000 0000 0100B,因此,si和usi的机

B.34572    器数都为1101 1111 1111 1100,按无符号整数解释,其值为

C.57340   65535-3-8192=65535-8195=57340

D.57339

     

4考虑以下C语言代码:

short si=–32768;

unsigned short usi=si;

执行上述程序段后,usi的值是(D)。

A.–32768  -32768=-1000 0000 0000 0000B,因此,si和usi的机器数都为

B.65535    1000 0000 0000 0000,按无符号整数解释,其值为32768

C.65536

D.32768 

     

5.考虑以下C语言代码:

unsigned short usi=65535;

short si=usi;

执行上述程序段后,si的值是(D)。

A.–65535  65535=1111 1111 1111 1111B,因此,usi和si的机器数都为

B.65535    1111 1111 1111 1111,按带符号整数解释,其值为-1

C.1

D.–1 

     

6在ISO C90标准下执行以下关系表达式,结果为“真”的是(D)。

A.2147483647<(int)2147483648U

B.2147483647>–2147483648

C.–1<0U

D.(unsigned)–1>–2

 

-1的机器数为全1,按无符号整数比较,全1是最大的数,显然比0大,即结果为“假”。 

2147483647的机器数为011┅1,在C90中为int型;2147483648的机器数为100┅0,在C90中为unsigned型,强制类型转换为int后,按带符号整数比较,显然011┅1比100┅0大,即结果为“假”。

 -1的机器数为全1,-2的机器数为11┅10,按无符号整数比较,显然全1比任何数大,即结果为“真”。

 2147483647的机器数为011┅1,在C90中为int型;2147483648的机器数为100┅0,在C90中为unsigned型,-2147483648的机器数通过对100┅0各位取反末位加一得到,因此,机器数还是100┅0。011┅1和100┅0按无符号整数比较,显然011┅1比100┅0小,即结果为“假”。

 

 

     

7.–1028采用IEEE 754单精度浮点数格式表示的结果(十六进制形式)是B)。

A.44808000H   -1028=-1024-4=-2^10-2^2

B.C4808000H   -1028二进制为:-0100 0000 0100B = 

C.C4C04000H   -1.00000001 *10^10   127+10=128+8+1=2^7+2^3+2^0

D.44C04000H   因此8位阶码为:1000 1001   为负数,所以符号位为1

              1 10001001 0000 0001 0000 0000 000(格式1+8+23)

              四位一组:1100 0100 1000 0000 1000 0000 0000 0000B                         C    4      8   0     8   0        0   0H

 

     

8假定变量i、f的数据类型分别是int、float。已知i=12345,f=1.2345e3,则在一个32位机器中执行下列表达式时,结果为“假”的是(D)。

A.i==(int)(double)i

B.f==(float)(double)f

C.i==(int)(float)i

D.f==(float)(int)f

12345<1024x16=2^14,因此,12345对应的二进制数的有效位数一定小于14,更小于IEEE 754单精度格式的有效位数24,因而转换为float型后,不会发生有效数字丢失,也即能够精确表示为float型,再转换为int型后,数值是一样的。  f=1234.5,转换为int型数后,小数点后面的数字被丢失,因此与原来的f不相等。 

double型数的有效位数比float型数大得多,因而f转换为double类型后不会发生有效数字丢失。 

任何int型数的有效位数不会超过31位,因此都能精确转换为具有53位有效位数的double型。

     

9假定某计算机按字节编址,采用小端方式,有一个float型变量x的地址为0xffffc000,x=12345678H,则在内存单元0xffffc001中存放的内容是(B)。

A.0001001000110100B 

B.01010110B

C.0101B

D.00110100B

因为按字节编址,所以某一个单元内存放一个8位数字。  01010110B=56H,小端方式下,78H存在0xffffc000单元中,56H存在0xffffc001单元中,  因为按字节编址,所以某一个单元内只能存放8位数字。  00110100B=34H,小端方式下,78H存在0xffffc000单元中,34H存在0xffffc002单元中,

     

10下面是关于计算机中存储器容量单位的叙述,其中错误的是(C)。  

A.“主存容量为1KB”的含义是指主存中能存放1024个字节的二进制信息

B.最小的计量单位为位(bit),表示一位“0”或“1”

C.一台计算机的编址单位、指令字长和数据字长都一样,且是字节的整数倍

D.最基本的计量单位是字节(Byte),一个字节等于8bit

     

1.CPU中能进行算术运算和逻辑运算的最基本运算部件是(  A )。  

A.ALU  

B.加法器

C.移位器

D.多路选择器

     

2 ALU有一个操作控制端ALUop,ALU在ALUop的控制下执行相应的运算。以下给出的运算中,(  D )运算不能由ALUop直接控制完成。

A.加法和减法

B.与、或、非等逻辑运算

C.传送(ALU输入直送为输出)

D.乘法和除法  

      ALU通常仅用于进行加、减以及各类逻辑运算和传送操作,乘法和除法运算可以利用ALU分步骤进行加/减和移位来完成,因此,在进行乘或除运算时,每个步骤送到ALUop的控制信号可以控制进行加/减和移位操作,但不能用一个控制信息直接使ALU完成乘或除运算。

3 假设变量x的位数为n(n>=8),x的最低有效字节不变,其余各位全变为0,则对应C语言表达式为( C )。

A.x | ~ 0xFF  任何数与1相与都为其本身

B.x ^ 0xFF

C.x & 0xFF

D.x | 0xFF

     

4假设变量x的位数为n(n>=8),x的最高有效字节不变,其余各位全变为0,则对应C语言表达式为(  A )。

A.(x>>(n-8))<<(n-8)  右移8位,表示只保留最左边的8位,然后再左移8位

B.((x&0xFF)>>(n-8))<<(n-8)   将其移回来,这样高8位就不会发生变化

C.(x<<(n-8))>>(n-8)

D.((x&0xFF)<<(n-8))>>(n-8)  

     

5 考虑以下C语言代码:

short  si = –8196;

  int  i = si;

执行上述程序段后,i的机器数表示为(  A   )。

A.FFFF DFFCH  带符号整数:符号扩展 无符号整数:0扩展

B.0000 9FFCH  -8196=-2^13-2^2=-0010 0000 0000 0100B=1101 1111 1111 1100B

C.FFFF 9FFCH  符号位为1,扩展为:1111 1111 1111 1111 1101 1111 1111 1100B

D.0000 DFFCH   十六进制为:FFFF DFFCH        

     

6若在一个8位整数加/减运算器中完成x–y的运算,已知带符号整数x=–69,y=–38,则加法器的两个输入端和输入的低位进位分别为( D  )。

A.1011 1011、0010 0110、1   低位进位就是sub,做减法sub=1,否则sub=0

B.1011 1011、1101 1010、1      

C.1011 1011、1101 1010、0

D.1011 1011、0010 0101、1

-69=-64-4-1=-2^6-2^2-2^0=-0100 0101B=1011 1011B(将0100 0101B取反加1)

-38=-32-4-2=-2^5-2^2-2^1=-0010 0110B=1101 1010B

–69和–38的机器数分别是1011 1011、1101 1010,因为是做x-y,所以,整数加/减运算器中的控制端sub为1,即低位进位为1,并控制加法器的第二个输入端各位取反,为0010 0101(将1101 1010B取反)。

     

7若在一个8位整数加/减运算器中完成x+y的运算,已知无符号整数x=69,y=38,则加法器的两个输入端和输入的低位进位分别为( C   )。   

A. 0100 0101、1101 1010、0

B.0100 0101、0010 0110、1

C.0100 0101、0010 0110、0 

D.0100 0101、1101 1010、1

      69和38的机器数分别是0100 0101、0010 0110,因为是做加法,所以,整数加/减运算器中的控制端sub为0,即低位进位为0。

 

8 若在一个8位整数加/减运算器中完成x+y的运算,已知x=63,y= –31,则x+y的机器数及相应的溢出标志OF分别是(  B )。

A.20H、1

B.20H、0  

C.1FH、1

D.1FH、0

63=64-1=1000000B-1=0111111B=0011 1111B

31=2^5-1=100000B-1=011111B=0001 1111B

-31=1110 0001B(0001 1111B各位取反加一)

63和–31的机器数分别是0011 1111、1110 0001,因为是做x+y,所以,在加法器中将两个机器数直接相加,得到结果为0010 0000(20H),并生成进位Cout=1,因为两个加数符号位相异,因此,不会发生溢出,即OF=0。

 

     

9若在一个8位整数加/减运算器中完成x+y的运算,假定变量x和y的机器数用补码表示为[x]补=F5H,[y]补=7EH,则x+y的值及相应的溢出标志OF分别是( C  )。  

A.119、1

B.115、1

C.115、0  

D.119、0

x和y的机器数是用补码表示的,分别是1111 0101、0111 1110,因为是做x+y,所以,sub=0,即1111 0101 + 0111 1110 +0 = 0111 0011,其真值为127-12=115。因为两个加数符号位相异,所以不会发生溢出,即OF=0。

 

     

10 若在一个8位整数加/减运算器中完成x–y的运算,假定变量x和y的机器数用补码表示为[x]补=F5H,[y]补=7EH,则x–y的值及相应的溢出标志OF分别是( B   )。

A.119、0

B.119、1 

C.115、1

D.115、0

x和y的机器数是用补码表示的,分别是1111 0101、0111 1110,因为是做x-y,所以,sub=1,y对应的机器数各位取反,即1111 0101 + 1000 0001 +1 = 0111 0111,其真值为127-8=119。因为两个加数符号位为1,而结果符号为0,所以发生了溢出,即OF=1。

 

     

1若在一个8位计算机中完成x+2y的运算,假定变量x和y的机器数用补码表示为[x]补=44H,[y]补=DCH,则x+2y的机器数及相应的溢出标志OF分别是(C)。 

A.32H、0

B.FCH、1

C.FCH、0  

D.32H、1

x和y的机器数是用补码表示的,分别是0100 0100、1101 1100,因为是做x+2y,所以,先对y算术左移一位,然后和x相加,此时sub=0,即0100 0100 + 1011 1000+0 = 1111 1100(FCH),因为两个加数符号相异,所以不会发生溢出,即OF=0。

 

     

2 若在一个8位计算机中完成x–2y,假定变量x和y的机器数用补码表示为[x]补=44H,[y]补=DCH,则x–2y的机器数及相应的溢出标志OF分别是(A)。

A.8CH、1

B.8CH、0

C.68H、0

D.68H、1

x和y的机器数是用补码表示的,分别是0100 0100、1101 1100,因为是做x–2y,所以,先对y算术左移一位,得1011 1000,然后各位取反,再和x相加,此时sub=1,即0100 0100 + 0100 0111+1 = 1000 1100(8CH),因为两个加数符号都为0,而结果符号为1,所以发生了溢出,即OF=1。

 

     

3若在一个8位计算机中完成x/2+2y,假定变量x和y的机器数用补码表示为[x]补=44H,[y]补=DCH,则x/2+2y的机器数及相应的溢出标志OF分别是(B)。  

A.CAH、1

B.DAH、0  

C.CAH、0

D.DAH、1

x和y的机器数是用补码表示的,分别是0100 0100、1101 1100,因为是做x/2+2y,所以,先对x算术右移一位,得0010 0010;再对y算术左移一位,得1011 1000,两者相加,此时sub=0,即0010 0010 + 1011 1000+0 = 1101 1010(DAH),因为两个加数符号相异,所以不会发生溢出,即OF=0。

 

     

4假定变量r1和r2的机器数用8位补码表示为[r1]补=F5H,[r2]补=EEH。若将运算结果存放在一个8位寄存器中,则下列运算中会发生溢出的是(D)。 

A.r1+r2

B.r1/r2

C.r1–r2

D.r1×r2

     

5假定整数加法指令、整数减法指令和移位指令所需时钟周期(CPI)都为1,整数乘法指令所需时钟周期为10。若x为整型变量,为了使计算64*x所用时钟周期数最少,编译器应选用的最佳指令序列为(C)。  

A.1条左移指令和1条加法指令

B.两条左移指令和两条加法指令

C.1条左移指令 

D.1条乘法指令

因为64*x可以用x左移6位来实现,左移指令比乘法指令快10倍,因此最佳指令序列为1条左移指令,只要一个时钟周期。

 

     

6 假定整数加法指令、整数减法指令和移位指令所需时钟周期(CPI)都为1,整数乘法指令所需时钟周期为10。若x为整型变量,为了使计算54*x所用时钟周期数最少,编译器应选用的最佳指令序列为(C)。 

A.1条乘法指令

B.4条左移指令和3条加法指令

C.3条左移指令和两条减法指令 

D.两条左移指令和两条减法指令

54*x=(64-8-2) *x=64*x -8*x -2*x,可用3条左移指令和两条减法指令来实现,共需5个时钟周期。 

一条整数乘法指令需要10个时钟周期。 

D.给出的指令序列肯定不能实现54*x。

 

 

      

7   假定整数加法指令、逻辑运算指令和移位指令所需时钟周期(CPI)都为1,整数除法指令所需时钟周期为32。若x为整型变量,为了使计算x/64所用时钟周期数最少,编译器应选用的最佳指令序列为(D)。 

A.1条右移指令

B.1条加法指令、1条右移指令

C.1条除法指令

D.两条右移指令、1条与操作指令、1条加法指令  

若x为负数且不能被64整除,则x右移6位和x/64的结果不相等。

x/64 = ( x>=0 ? x : (x+63) ) >> 6,因此关键是计算偏移量b,这里,x为正时b=0,x为负时b=63。可从x的符号得到b,x>>31得到32位符号,正数为32位0,负数为32位1,然后通过“与”操作提取低6位,这就是偏移量b。也即:x/64 = ( x+ ( x>>31)&0x3F ) ) >> 6,用2条右移、1条加和1条与指令即可实现,只要4个时钟周期。 

若x为负数,则x/64=(x+63)>>6,但该公式不适合正数x,因此无法用一条加和一条右移指令实现。 

一条整数乘法指令需要32个时钟周期。

 

 

     

8已知float型变量用IEEE 754单精度浮点格式表示,float型变量x和y的机器数分别表示为x=40E8 0000H,y=C204 0000H,则在计算x+y时,第一步对阶操作的结果[Ex-Ey]补为(B)。  

A.0000 0011

B.1111 1101

C.0000 0111

D.1111 1011

因为x=40E8 0000H=0100 0000 1110 1000 0...0,y=C204 0000H=1100 0010 0000 0100 0...0,所以x和y的阶码分别为100 0000 1、100 0010 0,对阶时计算过程为 1000 0001 + 0111 1100 = 1111 1101。

 

     

9   对于IEEE 754单精度浮点数加减运算,只要对阶时得到的两个阶之差的绝对值|ΔE|大于等于(C),就无需继续进行后续处理,此时,运算结果直接取阶大的那个数。  

A.23

B.127

C.25  

D.128

对于IEEE 754单精度浮点格式,当出现“1.bb…b + 0.00…0 01bb…b”情况时会发生“大数吃小数”现象,小数0.00…0 01bb…b中的小数点被左移了25位。

 

     

10变量dx、dy和dz的声明和初始化如下:

double dx=(double)x;

double dy=(double)y;

double dz=(double)z;

若float和double分别采用IEEE 754单精度和双精度浮点数格式,sizeof(int)=4,则对于任意int型变量x、y和z,以下哪个关系表达式是永真的?   (B/C)

A.dx*dy*dz==dz*dy*dx

B.dx*dx>=0

C.(dx+dy)+dz==dx+(dy+dz)

D.dx+dy==(double)(x+y)

当int型数据x的有效位数比float型可表示的最大有效位数24更多时,x强制转换为float型数据时有效位数丢失,而将x转换为double型数据时没有有效位数丢失。  

A、非永真。相乘的结果可能产生舍入。  

B、永真。double型数据用IEEE 754标准表示,尾数用原码小数表示,符号和数值部分分开运算。不管结果是否溢出都不会影响乘积的符号。  

C、永真。因为dx、dy和dz是由32位int型数据转换得到的,而double类型可以精确表示int类型数据,并且对阶时尾数移位位数不会超过52位,因此尾数不会舍入,因而不会发生大数吃小数的情况。但是,如果dx、dy和dz是任意double类型数据,则非永真。

 

 

 

1以下有关指令的叙述中,错误的是(   D)。

A.微指令是一条机器指令所包含的控制信号的组合,CPU能直接执行

B.机器指令是用二进制表示的一个0/1序列,CPU能直接执行

C.伪指令是由若干条机器指令构成的一个指令序列,属于软件范畴

D.汇编指令是机器指令的符号表示,CPU能直接执行

 

2一条机器指令通常由多个字段构成。以下选项中,通常( C   )不显式地包含在机器指令中。

A.寻址方式

B.寄存器编号

C.下条指令地址

D.操作码

 

3对于运算类指令或传送类指令,需要在指令中指出操作数或操作数所在的位置。通常,指令中指出的操作数不可能出现在(C   )中。

A.存储单元

B.通用寄存器

C.程序计数器

D.指令

 

4令集体系结构(ISA)是计算机系统中必不可少的一个抽象层,它是对硬件的抽象,软件通过它所规定的指令系统规范来使用硬件。以下有关ISA的叙述中,错误的是( D   )。

A. ISA规定了指令的操作数类型、寄存器结构、存储空间大小、编址方式和大端/小端方式

B. ISA规定了指令获取操作数的方式,即寻址方式

C. ISA规定了所有指令的集合,包括指令格式和操作类型

D. ISA规定了执行每条指令时所包含的控制信号

 

5以下选项中,不属于指令集体系结构名称的是( B   )。

A.MIPS

B.UNIX

C.IA-32

D.ARM

 

6以下Intel微处理器中,不兼容IA-32指令集体系结构的是( B   )。

A.Core(i3、i5、i7)

B.Itanium和Itanium 2

C.Pentium (II、III、4)    

D.80386和80486

 

7以下关于IA-32指令格式的叙述中,错误的是( D  )。

A.采用变长操作码,操作码位数可能是5位到十几位不等

B.采用变长指令字格式,指令长度从一个字节到十几个字节不等

C.指令中指出的位移量和立即数的长度可以是0、1、2或4个字节

D.指令中给出的操作数所在的通用寄存器的宽度总是32位

 

8以下关于IA-32指令寻址方式的叙述中,错误的是( A   )。

A.相对寻址的目标地址为“PC内容加位移”,PC内容指当前正在执行指令的地址

B.对于寄存器操作数,必须在指令中给出通用寄存器的3位编号

C.操作数可以是指令中的立即数、也可以是通用寄存器或存储单元中的内容

D.存储器操作数中最复杂的寻址方式是“基址加比例变址加位移”

 

9以下关于IA-32中整数运算指令所支持的操作数的叙述中,错误的是( A  )。

A.除乘法指令外,其他运算指令的源操作数和目的操作数的位数相等

B.对于乘除运算指令,操作数一定区分是无符号整数还是带符号整数

C.参加运算的操作数可以是一个字节(8b)、一个字(16b)或双字(32b)

D.对于加减运算指令,操作数不区分是无符号整数还是带符号整数

 

10以下关于IA-32的定点寄存器组织的叙述中,错误的是( B  )。

A.寄存器EAX/AX/AL称为累加器,ECX/CX/CL称为计数寄存器

B.每个通用寄存器都可作为32位、16位或8位寄存器使用

C.寄存器ESP/SP称为栈指针寄存器,EBP/BP称为基址指针寄存器

D.EIP/IP为指令指针寄存器,即PC;EFLAGS/FLAGS为标志寄存器

 

 

 

1 某C语言程序中对数组变量b的声明为“int b[10][5];”,有一条for语句如下:

for (i=0; i<10, i++)

         for (j=0; j<5; j++)

             sum+= b[i][j];

假设执行到“sum+= b[i][j];”时,sum的值在EAX中,b[i][0]所在的地址在EDX中,j在ESI中,则“sum+= b[i][j];”所对应的指令(AT&T格式)可以是(   C  )。

A.addl 0(%edx, %esi, 2), %eax

B.addl 0(%esi, %edx, 2), %eax

C.addl 0(%edx, %esi, 4), %eax

D.addl 0(%esi, %edx, 4), %eax

 

2 IA-32中指令“popl %ebp”的功能是(  D )。

A.R[esp]←R[esp]+4,R[ebp]←M[R[esp]]

B.R[esp]←R[esp]-4,R[ebp]←M[R[esp]]

C.R[ebp]←M[R[esp]],R[esp]←R[esp]-4

D.R[ebp]←M[R[esp]],R[esp]←R[esp]+4

要注意顺序。

Push:R[esp]←R[esp]-4,M[R[esp]]←R[ebp]

 

3 IA-32中指令“movl 8(%edx, %esi, 4), %edx”的功能是( A  )。

A.R[edx]←M[R[edx]+R[esi]*4+8]

B.M[R[edx]+R[esi]*4+8]←R[edx]

C.R[edx]←M[R[esi]+R[edx]*4+8]

D.M[R[esi]+R[edx]*4+8]←R[edx]

 

4 设SignExt[x]表示对x符号扩展,ZeroExt[x]表示对x零扩展。IA-32中指令“movswl %cx, -20(%ebp)”的功能是( )。

A.R[cx]←SignExt [M[R[ebp]-20]]

B.M[R[ebp]-20]←SignExt[R[cx]]

C.M[R[ebp]-20]←ZeroExt[R[cx]]

D.R[cx]←ZeroExt [M[R[ebp]-20]]

 

5 假设 R[ax]=FFE8H,R[bx]=7FE6H,执行指令“subw %bx, %ax”后,寄存器的内容和各标志的变化为( C  )。

A.R[bx]=8002H,OF=0,SF=1,CF=0,ZF=0

B.R[ax]=8002H,OF=1,SF=1,CF=0,ZF=0  

C. R[ax]=8002H,OF=0,SF=1,CF=0,ZF=0

D.R[bx]=8002H,OF=1,SF=1,CF=0,ZF=0

指令在补码加减运算部件中执行:1111 1111 1110 1000+1000 0000 0001 1001+1 =

1000 0000 0000 0010(8002H),结果无溢出(OF=0)、负数(SF=1)、有进位(CF=1^1=0)、非0(ZF=0)

 

 

6 假设R[eax]=0000B160H,R[ebx]=00FF0110H,执行指令“imulw %bx”后,通用寄存器的内容变化为(  D  )。

A. R[eax]=00BC7600,其余不变

B.R[eax]=00007600H,R[dx]=00BCH

C.R[eax]=FFAC7600H,其余不变

D.R[eax]=00007600H,R[dx]=FFACH

因为一个源操作数为BX寄存器中的内容,所以只要将AX和BX中的内容相乘即可。指令在带符号乘法部件中执行,B160H*0110H=FFFB1600+FFB16000=FFAC7600H,DX寄存器内容为FFACH,AX寄存器内容为7600H,EAX中高16位不变。

 

 

7假设short型变量x被分配在寄存器AX中,若R[ax]=FF70H,则执行指令“salw $2, %ax”后,变量x的机器数和真值分别是(  D  )。

A.FDC3H,-573

B. FFDCH,-36

C. 3FDC,16348

D.FDC0H,-576

salw指令是算术左移指令,对FF70=1111 1111 0111 0000算术左移2位后,结果为1111 1101 1100 0000(FDC0H),真值为-10 0100 0000B = -(512+64) = -576。

 

 

8 程序P中有两个变量i和j,被分别分配在寄存器EAX和EDX中,P中语句“if (i

804846a    39 c2       cmpl  %eax, %edx

804846c    7e 0d    jle     xxxxxxxx    

若执行到804846a处的cmpl指令时,i=105,j=100,则jle指令执行后将会转到( A   )处的指令执行。

A.8048479

B.8048461

C.804847b

D.804846e

因为cmpl指令中EDX内容为100,EAX内容为105,对这两个数做减法,显然100<105,满足jle指令小于或等于的条件,执行完jle指令后将转移到PC+偏移量=0x84846a+2+0d=0x804846a+0x0f=0x8048479去执行。

 

9 以下关于x87 FPU浮点处理指令系统的叙述中,错误的是(  D )。

A.提供8个80位浮点寄存器ST(0)~ST(7),采用栈结构,栈顶为ST(0)

B. float、double和long double型数据存入主存时,分别占32位、64位和96位

C.float、double和long double三种类型数据都按80位格式存放在浮点寄存器中

D. float和double型数据从主存装入浮点寄存器时有可能发生舍入,造成精度损失

 

10以下关于MMX/SSE指令集的叙述中,错误的是(  A   )。

A.MMX/SSE指令集和IA-32指令集共用同一套通用寄存器

B.同一个微处理器同时支持IA-32指令集与MMX/SSE指令集

C.SSE指令是一种采用SIMD(单指令多数据)技术的数据级并行指令

D.目前SSE支持128位整数运算或同时并行处理两个64位双精度浮点数

  

 

 

1 假设P为调用过程,Q为被调用过程,程序在IA-32处理器上执行,以下有关过程调用的叙述中,错误的是(  A )。

A.从P传到Q的实参无需重新分配空间存放

B.从Q跳回到Q执行应使用RET指令

C.C语言程序中的函数调用就是过程调用

D.从P跳转到Q执行应使用CALL指令

 

2 以下是有关IA-32的过程调用方式的叙述,错误的是( A)。

A.EBX、ESI、EDI、EBP和ESP都是被调用者保存寄存器

B.EAX、ECX和EDX都是调用者保存寄存器

C.入口参数使用栈(stack)传递,即所传递的实参被分配在栈中

D.返回地址是CALL指令下一条指令的地址,被保存在栈中

 

3 以下是有关IA-32的过程调用所使用的栈和栈帧的叙述,错误的是( B  )。

A.每进行一次过程调用,用户栈从高地址向低地址增长出一个栈帧

B.只能通过将栈指针ESP作为基址寄存器来访问用户栈中的数据

C.过程嵌套调用深度越深,栈中栈帧个数越多,严重时会发生栈溢出

D.从被调用过程返回调用过程之前,被调用过程会释放自己的栈帧

 

4 以下是有关C语言程序的变量的作用域和生存期的叙述,错误的是(C   )。

A.非静态局部变量可以和全局变量同名,是因为它们被分配在不同存储区

B.因为非静态局部变量被分配在栈中,所以其作用域仅在过程体内

C.静态(static型)变量和非静态局部(auto型)变量都分配在对应栈帧中

D.不同过程中的非静态局部变量可以同名,是因为它们被分配在不同栈帧中

 

5 以下是一个C语言程序代码:

int add(int x, int y){

    return x+y;

}

int caller(D ){

    int t1=100 ;(存放在低地址)

    int t2=200;

    int sum=add(t1, t2);

    return sum;

}

 以下关于上述程序代码在IA-32上执行的叙述中,错误的是( D )。

A.变量t1和t2被分配在caller函数的栈帧中

B.变量sum被分配在caller函数的栈帧中

C.add函数返回时返回值存放在EAX寄存器中

D.传递参数时t1和t2的值从高地址到低地址依次存入栈

 

6第5题中的caller函数对应的机器级代码如下:

1      pushl       %ebp

2      movl       %esp, %ebp

3      subl         $24, %esp

4      movl        $100, -12(%ebp)

5      movl        $200, -8(%ebp)

6      movl       -8(%ebp), %eax

7      movl        %eax, 4(%esp)

8      movl        -12(%ebp), %eax

9      movl        %eax, (%esp)  

10    call          add 

11    movl        %eax, -4(%ebp)

12    movl        -4(%ebp), %eax

13    leave       

14    ret

 假定caller的调用过程为P,对于上述指令序列,以下叙述中错误的是(  C   )。

A.从上述指令序列可看出,caller函数没有使用被调用者保存寄存器

B.第2条指令使BEP内容指向caller栈帧的底部

C.第3条指令将栈指针ESP向高地址方向移动,以生成当前栈帧

D.第1条指令将过程P的EBP内容压入caller栈帧

 

7 对于第5题的caller函数以及第6题给出的对应机器级代码,以下叙述中错误的是(  C )。

A.参数t1和t2的有效地址分别为R[esp]和R[esp]+4

B.变量t1和t2的有效地址分别为R[ebp]-12和R[ebp]-8

C.变量t1所在的地址高(或大)于变量t2所在的地址

D.参数t1所在的地址低(或小)于参数t2所在的地址

 

8

以下有关递归过程调用的叙述中,错误的是(  D  )。

A.递归过程第一个参数的有效地址为R[ebp]+8

B.可能需要执行递归过程很多次,因而时间开销大

C.每次递归调用都会生成一个新的栈帧,因而空间开销大

D.每次递归调用在栈帧中保存的返回地址都不相同

 

9 以下关于if (cond_expr) then_statement else else_statement选择结构对应的机器级代码表示的叙述中,错误的是(  C  )。

A.一定包含一条条件转移指令(分支指令)

B.计算cond_expr的代码段一定在条件转移指令之前

C.对应then_statement的代码一定在对应else_statement的代码之前

D.一定包含一条无条件转移指令

 

10 以下关于循环结构语句的机器级代码表示的叙述中,错误的是(  D )。

A.不一定包含无条件转移指令

B.循环结束条件通常用一条比较指令CMP来实现

C.一定至少包含一条条件转移指令

D.循环体内执行的指令不包含条件转移指令

 

 

 

 

1 假定全局short型数组a的起始地址为0x804908c,则a[2]的地址是(  C )。

A.0x8049094

B.0x8049092

C.0x8049090

D.0x804908e

Short型的字节大小数为2,,&a[0]= 0x804908c,所以0x804908c+2+2=0x8049090

 

2 假定全局数组a的声明为char *a[8],a的首地址为0x80498c0,i 在ECX中,现要将a[i]取到EAX相应宽度的寄存器中,则所用的汇编指令是( B  )。

A.mov  0x80498c0( , %ecx), %ah

B.mov  0x80498c0( , %ecx, 4), %eax

C.mov  (0x80498c0, %ecx), %ah

D.mov  (0x80498c0, %ecx, 4), %eax

在袁老师的测试中,指针型的大小为4Byte,%eax为返回函数

 

 

3 假定全局数组a的声明为double *a[8],a的首地址为0x80498c0,i 在ECX中,现要将a[i]取到EAX相应宽度的寄存器中,则所用的汇编指令是(D   )。

A.mov  (0x80498c0, %ecx, 8), %eax

B.mov  (0x80498c0, %ecx, 4), %eax

C.mov  0x80498c0( , %ecx, 8), %eax

D.mov  0x80498c0( , %ecx, 4), %eax 

不管是什么类型的指针,大小都为4byte(在袁老师的测试中)     

 

4 假定局部数组a的声明为int a[4]={0, -1, 300, 20},a的首地址为R[ebp]-16,则将a的首地址取到EDX的汇编指令是( B )。

A.movl  -16(%ebp ), %edx

B.leal  -16(%ebp), %edx

C.movl  -16(%ebp, 4), %edx

D.leal  -16(%ebp, 4), %edx

因为是取地址,所以用到加载有效地址leal,又因为是取首地址,无需乘4

 

5 某C语言程序中有以下两个变量声明:

int  a[10];

int  *ptr=&a[0];

则ptr+i的值为( B   )。

A.&a[0]+8´i

B.&a[0]+4´i

C.&a[0]+2´i

D.&a[0]+i

不管是什么类型的指针,大小都为4byte(在袁老师的测试中)

 

6 假定静态short型二维数组b的声明如下:

static short b[2][4]={ {2, 9, -1, 5}, {3, 8, 2, -6}};若b的首地址为0x8049820,则按行优先存储方式下,数组元素“8”的地址是(  D  )。

A.0x8049824

B.0x8049828

C.0x8049825     

D.0x804982a

8前面有5个元素,大小为5*2=10,所以地址为:0x8049820+a=0x804982a

 

7 假定静态short型二维数组b和指针数组pb的声明如下:

static short b[2][4]={ {2, 9, -1, 5}, {3, 1, -6, 2 }};

static short *pb[2]={b[0], b[1]};

若b的首地址为0x8049820,则pb[1]的值是( C   )。

A.0x8049824

B.0x8049820

C.0x8049828

D.0x8049822

这里问的是pb[1]这个数组元素的值,显然应该是b[1],而b[1]应该是指二维数组b的第1行(从0开始)的起始地址。b每行有4个元素,每个元素占两个字节(short型),因而每行占8个字节,因而b的第1行首地址为0x8049820+8=0x8049828。

 

8 假定静态short型二维数组b和指针数组pb的声明如下:

static short b[2][4]={ {2, 9, -1, 5}, {3, 1, -6, 2 }};

static short *pb[2]={b[0], b[1]};

若b的首地址为0x8049820,则&pb[1]的值是(   D )。

A.0x8049830

B.0x8049832

C.0x8049838

D.0x8049834

这里问的是pb[1]这个数组元素的地址,通常pb数组直接在b数组后面分配,因为b数组占2x8=16个单元,因此pb数组的首地址为0x8049820+16=0x8049830。而pb数组的每个元素是一个指针,故占4B,所以pb[1]的地址为0x8049830+4=0x8049834。

 

9 假定结构体类型cont_info的声明如下:

struct cont_info {

char id[8];

char name [16];

unsigned post;

char address[100];

char phone[20];

} ;

若结构体变量x初始化定义为struct cont_info x={“00000010”, “ZhangS”, 210022, “273 long street, High Building #3015”, “12345678”},x的首地址在EDX中,则“unsigned xpost=x.post;”对应汇编指令为( C )。

A.leal  0x24(%edx), %eax

B.movl  0x24(%edx), %eax

C.movl  0x18(%edx), %eax

D.leal  0x18(%edx), %eax

0x18=24.且为赋值语句,用movl

 

10 以下是关于IA-32处理器对齐方式的叙述,其中错误的是( D  )。

A.可以用编译指导语句(如#pragma pack)设置对齐方式

B.不同操作系统采用的对齐策略可能不同

C.对于同一个struct型变量,在不同对齐方式下可能会占用不同大小的存储区

D.总是按其数据宽度进行对齐,例如,double型变量的地址总是8的倍数

 

 

 

 

 

1 以下有关IA-32和x86-64之间比较的叙述中,错误的是( D   )。

A.IA-32的通用寄存器有8个,而x86-64的通用寄存器有16个

B.IA-32的字长为32位,x86-64的字长为64位并兼容IA-32

C.IA-32的通用寄存器为8/16/32位,而x86-64的通用寄存器为8/16/32/64位

D.(unsigned) long型变量在IA-32和x86-64中的长度都是64位(四字)

 

2 以下有关x86-64寄存器的叙述中,错误的是( D  )。

A.用来存放将要执行的指令的地址的指令指针寄存器为64位的RIP

B.基址寄存器和编址寄存器都可以是任意一个64位的通用寄存器

C.128位的XMM寄存器从原来IA-32中的8个增加到16个

D.任何浮点操作数都被分配在浮点寄存器栈(ST(0)~ST(7))中(已取消,现存放在XMM寄存器中)

 

3 以下有关x86-64对齐方式的叙述中,错误的是(  D )。

A.long、double、指针型数据必须按8字节边界对齐

B.short型数据必须按2字节边界对齐

C.int、float型数据必须按4字节边界对齐

D.long double型数据在内存占12字节空间(96位)应是16B

 

4 以下有关x86-64传送指令的叙述中,错误的是( D  )。

A.movl相当于movzlq,能将目的寄存器高32位清0

B.movzbq的功能是将8位寄存器内容零扩展为64位

C.相比IA-32,增加了movq指令,可传送64位数据

D.pushq和popq分别对ESP寄存器减8和加8   不一定

 

5 假定变量x的类型为int,对于变量y的初始化声明“long y=(long) x;”,其对应的汇编指令是( C  )。

A.movzlq  %edx, %rax

B.movq  %rdx, %rax

C.movslq  %edx, %rax

D.movl    %edx, %eax

 

6 假定变量x的类型为long,对于变量y的初始化声明“int y=(int) x;”,其对应的汇编指令不可能是( D  )。

A.movzlq  %edx, %rax

B.movslq  %edx, %rax

C.movl  %edx, %eax

D.movsql  %rdx, %eax

 

7 以下是C语言赋值语句“x=a*b+c;”对应的x86-64汇编代码:

movslq  %edx, %rdx

movsbl  %sil, %esi

imull  %edi, %esi

movslq  %esi, %rsi

leaq  (%rdx, %rsi), %rax

已知x、a、b和c分别在RAX、RDI、RSI和RDX对应宽度的寄存器中,根据上述汇编指令序列,推测x、a、b和c的数据类型分别为(   B  )。

A.x—long,  a—int,  b—char,  c—long

B.x—long,  a—int,  b—char,  c—int

C.x—long,  a—long,  b—char,  c—long    

D.x—long,  a—long,  b—char,  c—int

 

8 假定long型变量t、int型变量x和short型变量y分别在RAX、RDI和RSI对应宽度寄存器中,C语言赋值语句“t=(long)(x+y);”对应的x86-64汇编指令序列不可能是(  B )。

A.movswq  %si, %rax

movslq  %edi, %rdx

addq  %rdx, %rax

B.movswq  %si, %rdx

leaq   (%rdx, %rdi), %rax

C.movswq  %si, %rsi

movslq  %edi, %rdi

leaq  (%rsi, %rdi), %rax

D.movswl  %si, %edx

addl   %edi, %edx

movslq  %edx, %rax

 

9 以下关于x86-64过程调用的叙述中,错误的是( A  )。

A.在通用寄存器中传递的参数,都存放在64位寄存器中

B.前6个参数采用通用寄存器传递,其余参数通过栈传递

C.返回参数存放在RAX相应宽度的寄存器中

D.在栈中的参数若是基本类型,则被分配8个字节空间

 

10 以下关于IA-32和x86-64指令系统比较的叙述中,错误的是(  B )。

A.对于64位数据,x86-64可用一条指令处理,而IA-32需多条指令处理

B.对于返回地址,x86-64使用通用寄存器保存,而IA-32使用栈来保存

C对于浮点操作数,x86-64存于128位的XMM中,而IA-32存于80位的ST(i)中

D.对于入口参数,x86-64可用通用寄存器传递,而IA-32需用栈来传递

 

你可能感兴趣的:(深入理解计算机系统)