第一周 计算机系统概述
1 以下术语中,不属于计算机中硬件(即物理上实际存在的部件)的是( )。
算术逻辑部件
喵查答案:指令字
程序计数器(PC)
数据通路
2
以下有关计算机系统层次结构的叙述中,错误的是( )。
最上层是提供给最终用户使用的应用程序(软件)层
喵查答案:应用程序员工作在指令集体系结构层,需要对底层很熟悉
ISA是对硬件的抽象,软件通过ISA使用硬件提供的功能
OS是对ISA和硬件的抽象,程序员通过OS使用系统资源
3 以下有关指令集体系结构的叙述中,错误的是( )。
指令集体系结构位于计算机软件和硬件的交界面上
指令集体系结构是指低级语言程序员所看到的概念结构和功能特性
喵查答案:通用寄存器的长度、功能与编号不属于指令集体系结构的内容
指令集体系结构的英文缩写是ISA
4 以下给出的软件中,属于系统软件的是( )。
喵查答案:Windows XP
MS Word
金山词霸
RealPlayer
5 一个完整的计算机系统包括硬件和软件。软件又分为( )。
操作系统和语言处理程序
喵查答案:系统软件和应用软件
操作系统和高级语言
低级语言程序和高级语言程序
6 以下有关使用高级编程语言编写和开发软件的叙述中,错误的是( )。
须有一个翻译或转换程序,即编译器或解释器
须有一套工具软件或集成开发环境,即语言处理系统
喵查答案:须程序员在应用程序中直接控制外设进行输入/输出
须有程序员与计算机交互的用户接口,即GUI或CUI
7 以下有关机器指令和汇编指令的叙述中,错误的是( )。
机器指令和汇编指令一一对应,功能相同
喵查答案:机器指令和汇编指令都能被计算机直接执行
汇编指令中用符号表示操作码和地址码
汇编指令中用十进制或十六进制表示立即数
8 以下有关编程语言的叙述中,错误的是( )。
喵查答案:不能直接用机器语言(机器指令)编写程序
用高级编程语言编写程序比用汇编语言更方便
汇编语言和机器语言都与计算机系统结构相关
计算机不能直接执行高级语言程序和汇编语言程序
9 以下有关指令以及指令执行过程的叙述中,错误的是( )。
指令由操作码和操作数或操作数的地址码构成
CPU中的控制器对指令操作码进行译码
喵查答案:指令中指定的操作数只能是存放在存储器中的数据
将要执行的下条指令的地址总是在程序计数器PC中
10
以下有关冯.诺依曼结构思想的叙述中,错误的是( )。
计算机由运算器、存储器、控制器和I/O设备组成
程序由指令构成,计算机能自动执行程序中一条一条指令
喵查答案:指令和数据都放在存储器中,两者在形式上有差别
计算机内部以二进制形式表示指令和数据
第四周 乘除运算及浮点数运算
1 对于IEEE 754单精度浮点数加减运算,只要对阶时得到的两个阶之差的绝对值|ΔE|大于等于( ),就无需继续进行后续处理,此时,运算结果直接取阶大的那个数。
23
喵查答案:25
127
128
2
已知float型变量用IEEE 754单精度浮点格式表示,float型变量x和y的机器数分别表示为x=40E8 0000H,y=C204 0000H,则在计算x+y时,第一步对阶操作的结果[Ex–Ey]补为( )。
0000 0111
0000 0011
1111 1011
喵查答案:1111 1101
3
假定整数加法指令、逻辑运算指令和移位指令所需时钟周期(CPI)都为1,整数除法指令所需时钟周期为32。若x为整型变量,为了使计算x/64所用时钟周期数最少,编译器应选用的最佳指令序列为( )。
1条除法指令
1条右移指令
1条加法指令、1条右移指令
喵查答案:两条右移指令、1条与操作指令、1条加法指令
4
假定整数加法指令、整数减法指令和移位指令所需时钟周期(CPI)都为1,整数乘法指令所需时钟周期为10。若x为整型变量,为了使计算54*x所用时钟周期数最少,编译器应选用的最佳指令序列为( )。
1条乘法指令
4条左移指令和3条加法指令
喵查答案:3条左移指令和两条减法指令
两条左移指令和两条减法指令
5
假定整数加法指令、整数减法指令和移位指令所需时钟周期(CPI)都为1,整数乘法指令所需时钟周期为10。若x为整型变量,为了使计算64*x所用时钟周期数最少,编译器应选用的最佳指令序列为( )。
1条乘法指令
喵查答案:1条左移指令
1条左移指令和1条加法指令
两条左移指令和两条加法指令
6
假定变量r1 和r2的机器数用8位补码表示为r1补=F5H,r2补=EEH。若将运算结果存放在一个8位寄存器中,则下列运算中会发生溢出的是( )。
r1+ r2
r1– r2
喵查答案:r1× r2
r1/r2
7
若在一个8位计算机中完成x/2+2y,假定变量x和y的机器数用补码表示为x补=44H,y补= DCH,则x/2+2y的机器数及相应的溢出标志OF分别是( )。
CAH、0
CAH、1
喵查答案: DAH、0
DAH、1
8
若在一个8位计算机中完成x–2y,假定变量x和y的机器数用补码表示为x补=44H,y补= DCH,则x–2y的机器数及相应的溢出标志OF分别是( )。
68H、0
68H、1
8CH、0
喵查答案:8CH、1
9
若在一个8位计算机中完成x+2y的运算,假定变量x和y的机器数用补码表示为x补=44H,y补= DCH,则x+2y的机器数及相应的溢出标志OF分别是( )。
32H、0
32H、1
喵查答案:FCH、0
FCH、1
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,以下哪个关系表达式是永真的?
喵查答案:dx*dx >= 0
(double)(float) x == dx
dx+dy == (double) (x+y)
喵查答案: (dx+dy)+dz == dx+(dy+dz)
dx*dy*dz == dz*dy*dx
dx/dx == dy/dy
第五周 IA-32指令系统概述
1
以下关于IA-32指令格式的叙述中,错误的是( )。
采用变长指令字格式,指令长度从一个字节到十几个字节不等
采用变长操作码,操作码位数可能是5位到十几位不等
指令中指出的位移量和立即数的长度可以是0、1、2或4个字节
喵查答案:指令中给出的操作数所在的通用寄存器的宽度总是32位
2
以下Intel微处理器中,不兼容IA-32指令集体系结构的是( )。
80386和80486
Pentium (II、III、4)
Core(i3、i5、i7)
喵查答案:Itanium和Itanium 2
3 以下选项中,不属于指令集体系结构名称的是( )。
喵查答案:UNIX
IA-32
ARM
MIPS
4 令集体系结构(ISA)是计算机系统中必不可少的一个抽象层,它是对硬件的抽象,软件通过它所规定的指令系统规范来使用硬件。以下有关ISA的叙述中,错误的是( )。
ISA规定了所有指令的集合,包括指令格式和操作类型
喵查答案: ISA规定了执行每条指令时所包含的控制信号
ISA规定了指令获取操作数的方式,即寻址方式
ISA规定了指令的操作数类型、寄存器结构、存储空间大小、编址方式和大端/小端方式
5
对于运算类指令或传送类指令,需要在指令中指出操作数或操作数所在的位置。通常,指令中指出的操作数不可能出现在( )中。
指令
通用寄存器
存储单元
喵查答案:程序计数器
6 一条机器指令通常由多个字段构成。以下选项中,通常( )不显式地包含在机器指令中。
操作码
寻址方式
喵查答案:下条指令地址
寄存器编号
7
以下有关指令的叙述中,错误的是( )。
机器指令是用二进制表示的一个0/1序列,CPU能直接执行
喵查答案:汇编指令是机器指令的符号表示,CPU能直接执行
伪指令是由若干条机器指令构成的一个指令序列,属于软件范畴
微指令是一条机器指令所包含的控制信号的组合,CPU能直接执行
8
以下关于IA-32的定点寄存器组织的叙述中,错误的是( )。
喵查答案:每个通用寄存器都可作为32位、16位或8位寄存器使用
寄存器EAX/AX/AL称为累加器,ECX/CX/CL称为计数寄存器
寄存器ESP/SP称为栈指针寄存器,EBP/BP称为基址指针寄存器
EIP/IP为指令指针寄存器,即PC;EFLAGS/FLAGS为标志寄存器
9 以下关于IA-32中整数运算指令所支持的操作数的叙述中,错误的是( )。
对于加减运算指令,操作数不区分是无符号整数还是带符号整数
对于乘除运算指令,操作数一定区分是无符号整数还是带符号整数
喵查答案:除乘法指令外,其他运算指令的源操作数和目的操作数的位数相等
参加运算的操作数可以是一个字节(8b)、一个字(16b)或双字(32b)
10
以下关于IA-32指令寻址方式的叙述中,错误的是( )。
操作数可以是指令中的立即数、也可以是通用寄存器或存储单元中的内容
对于寄存器操作数,必须在指令中给出通用寄存器的3位编号
存储器操作数中最复杂的寻址方式是“基址加比例变址加位移”
喵查答案:相对寻址的目标地址为“PC内容加位移”,PC内容指当前正在执行指令的地址
第六周 IA-32指令类型
1
假设 R[ax]=FFE8H,R[bx]=7FE6H,执行指令“subw %bx, %ax”后,寄存器的内容和各标志的变化为( )。
喵查答案: R[ax]=8002H,OF=0,SF=1,CF=0,ZF=0
R[bx]=8002H,OF=0,SF=1,CF=0,ZF=0
R[ax]=8002H,OF=1,SF=1,CF=0,ZF=0
R[bx]=8002H,OF=1,SF=1,CF=0,ZF=0
2 设SignExt[x]表示对x符号扩展,ZeroExt[x]表示对x零扩展。IA-32中指令“movswl %cx, –20(%ebp)”的功能是( )。
喵查答案:M[R[ebp]–20]←SignExt[R[cx]]
R[cx]←SignExt [M[R[ebp]–20]]
M[R[ebp]–20]←ZeroExt[R[cx]]
R[cx]←ZeroExt [M[R[ebp]–20]]
3
IA-32中指令“movl 8(%edx, %esi, 4), %edx”的功能是( )。
M[R[edx]+R[esi]*4+8]←R[edx]
M[R[esi]+R[edx]*4+8]←R[edx]
喵查答案:R[edx]←M[R[edx]+R[esi]*4+8]
R[edx]←M[R[esi]+R[edx]*4+8]
4
IA-32中指令“popl %ebp”的功能是( )。
R[esp]←R[esp]–4,R[ebp]←M[R[esp]]
R[esp]←R[esp]+4,R[ebp]←M[R[esp]]
R[ebp]←M[R[esp]],R[esp]←R[esp]–4
喵查答案:R[ebp]←M[R[esp]],R[esp]←R[esp]+4
5
某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格式)可以是( )。
喵查答案:addl 0(%edx, %esi, 4), %eax
addl 0(%esi, %edx, 4), %eax
addl 0(%edx, %esi, 2), %eax
addl 0(%esi, %edx, 2), %eax
6
以下关于MMX/SSE指令集的叙述中,错误的是( )。
同一个微处理器同时支持IA-32指令集与MMX/SSE指令集
喵查答案:MMX/SSE指令集和IA-32指令集共用同一套通用寄存器
SSE指令是一种采用SIMD(单指令多数据)技术的数据级并行指令
目前SSE支持128位整数运算或同时并行处理两个64位双精度浮点数
7
以下关于x87 FPU浮点处理指令系统的叙述中,错误的是( )。
提供8个80位浮点寄存器ST(0)~ST(7),采用栈结构,栈顶为ST(0)
float、double和long double三种类型数据都按80位格式存放在浮点寄存器中
float、double和long double型数据存入主存时,分别占32位、64位和96位
喵查答案: float和double型数据从主存装入浮点寄存器时有可能发生舍入,造成精度损失
8
程序P中有两个变量i和j,被分别分配在寄存器EAX和EDX中,P中语句“if (i<j) { …}”对应的指令序列如下(左边为指令地址,中间为机器代码,右边为汇编指令):
804846a 39 c2 cmpl %eax, %edx
804846c 7e 0d jle xxxxxxxx 若执行到804846a处的cmpl指令时,i=105,j=100,则jle指令执行后将会转到( )处的指令执行。
8048461
804846e
8048479
喵查答案: 804847b
9 假设short型变量x被分配在寄存器AX中,若R[ax]=FF70H,则执行指令“salw $2, %ax”后,变量x的机器数和真值分别是( )。
喵查答案:FDC0H,–576
FFDCH,–36
FDC3H,–573
3FDC,16348
10 假设R[eax]=0000B160H,R[ebx]=00FF0110H,执行指令“imulw %bx”后,通用寄存器的内容变化为( )。
喵查答案:R[eax]=00007600H,R[dx]=FFACH
R[eax]=FFAC7600H,其余不变
R[eax]=00BC7600,其余不变
R[eax]=00007600H,R[dx]=00BCH
第七周 C语言语句的机器级表示
1
第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,对于上述指令序列,以下叙述中错误的是( )。
第1条指令将过程P的EBP内容压入caller栈帧
第2条指令使BEP内容指向caller栈帧的底部
喵查答案:第3条指令将栈指针ESP向高地址方向移动,以生成当前栈帧
从上述指令序列可看出,caller函数没有使用被调用者保存寄存器
2
以下是一个C语言程序代码:
-
int add(int x, int y)
-
{
-
return x+y;
-
}
-
-
int caller( )
-
{
-
int t1=100 ;
-
int t2=200;
-
int sum=add(t1, t2);
-
return sum;
-
}
以下关于上述程序代码在IA-32上执行的叙述中,错误的是( )。
变量t1和t2被分配在caller函数的栈帧中
喵查答案:传递参数时t1和t2的值从高地址到低地址依次存入栈中
add函数返回时返回值存放在EAX寄存器中
变量sum被分配在caller函数的栈帧中
3 以下是有关C语言程序的变量的作用域和生存期的叙述,错误的是( )。
喵查答案:静态(static型)变量和非静态局部(auto型)变量都分配在对应栈帧中
因为非静态局部变量被分配在栈中,所以其作用域仅在过程体内
非静态局部变量可以和全局变量同名,是因为它们被分配在不同存储区
不同过程中的非静态局部变量可以同名,是因为它们被分配在不同栈帧中
4
以下是有关IA-32的过程调用所使用的栈和栈帧的叙述,错误的是( )。
每进行一次过程调用,用户栈从高地址向低地址增长出一个栈帧
从被调用过程返回调用过程之前,被调用过程会释放自己的栈帧
喵查答案:只能通过将栈指针ESP作为基址寄存器来访问用户栈中的数据
过程嵌套调用深度越深,栈中栈帧个数越多,严重时会发生栈溢出
5
以下是有关IA-32的过程调用方式的叙述,错误的是( )。
入口参数使用栈(stack)传递,即所传递的实参被分配在栈中
返回地址是CALL指令下一条指令的地址,被保存在栈中
EAX、ECX和EDX都是调用者保存寄存器
喵查答案:EBX、ESI、EDI、EBP和ESP都是被调用者保存寄存器
6
假设P为调用过程,Q为被调用过程,程序在IA-32处理器上执行,以下有关过程调用的叙述中,错误的是( )。
C语言程序中的函数调用就是过程调用
喵查答案:从P传到Q的实参无需重新分配空间存放
从P跳转到Q执行应使用CALL指令
从Q跳回到Q执行应使用RET指令
7
以下关于循环结构语句的机器级代码表示的叙述中,错误的是( )。
一定至少包含一条条件转移指令
不一定包含无条件转移指令
循环结束条件通常用一条比较指令CMP来实现
喵查答案:循环体内执行的指令不包含条件转移指令
8
以下关于if (cond_expr) then_statement else else_statement选择结构对应的机器级代码表示的叙述中,错误的是( )。
一定包含一条无条件转移指令
一定包含一条条件转移指令(分支指令)
计算cond_expr的代码段一定在条件转移指令之前
喵查答案:对应then_statement的代码一定在对应else_statement的代码之前
9 以下有关递归过程调用的叙述中,错误的是( )。
可能需要执行递归过程很多次,因而时间开销大
每次递归调用都会生成一个新的栈帧,因而空间开销大
喵查答案:每次递归调用在栈帧中保存的返回地址都不相同
递归过程第一个参数的有效地址为R[ebp]+8
10
对于第5题的caller函数以及第6题给出的对应机器级代码,以下叙述中错误的是( )。
变量t1和t2的有效地址分别为R[ebp]-12和R[ebp]-8
喵查答案:变量t1所在的地址高(或大)于变量t2所在的地址
参数t1和t2的有效地址分别为R[esp]和R[esp]+4
参数t1所在的地址低(或小)于参数t2所在的地址
第八周 复杂数据类型的机器级表示
1
以下是关于IA-32处理器对齐方式的叙述,其中错误的是( )。
不同操作系统采用的对齐策略可能不同
可以用编译指导语句(如#pragma pack)设置对齐方式
喵查答案:总是按其数据宽度进行对齐,例如,double型变量的地址总是8的倍数
对于同一个struct型变量,在不同对齐方式下可能会占用不同大小的存储区
2
假定结构体类型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;”对应汇编指令为( )。
movl 0x24(%edx), %eax
喵查答案:movl 0x18(%edx), %eax
leal 0x24(%edx), %eax
leal 0x18(%edx), %eax
3
假定静态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]的值是( )。
0x8049830
0x8049832
喵查答案: 0x8049834
0x8049838
4
假定静态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]的值是( )。
0x8049820
0x8049822
0x8049824
喵查答案:0x8049828
5
假定静态short型二维数组b的声明如下:
static short b[2][4]={ {2, 9, -1, 5}, {3, 8, 2, -6}};若b的首地址为0x8049820,则按行优先存储方式下,数组元素“8”的地址是( )。
0x8049825
喵查答案:0x804982a
0x8049824
0x8049828
6
某C语言程序中有以下两个变量声明:
int a[10];
int *ptr=&a[0];
则ptr+i的值为( )。
&a[0]+i
&a[0]+2´i
喵查答案:&a[0]+4´i
&a[0]+8´i
7
假定局部数组a的声明为int a[4]={0, -1, 300, 20},a的首地址为R[ebp]-16,则将a的首地址取到EDX的汇编指令是( )。
movl -16(%ebp ), %edx
movl -16(%ebp, 4), %edx
喵查答案:leal -16(%ebp), %edx
leal -16(%ebp, 4), %edx
8
假定全局数组a的声明为double *a[8],a的首地址为0x80498c0,i 在ECX中,现要将a[i]取到EAX相应宽度的寄存器中,则所用的汇编指令是( )。
喵查答案:mov 0x80498c0( , %ecx, 4), %eax
mov (0x80498c0, %ecx, 4), %eax
mov 0x80498c0( , %ecx, 8), %eax
mov (0x80498c0, %ecx, 8), %eax
9
假定全局数组a的声明为char *a[8],a的首地址为0x80498c0,i 在ECX中,现要将a[i]取到EAX相应宽度的寄存器中,则所用的汇编指令是( )。
mov 0x80498c0( , %ecx), %ah
mov (0x80498c0, %ecx), %ah
喵查答案:mov 0x80498c0( , %ecx, 4), %eax
mov (0x80498c0, %ecx, 4), %eax
10
假定全局short型数组a的起始地址为0x804908c,则a[2]的地址是( )。
0x804908e
喵查答案:0x8049090
0x8049092
0x8049094
第九周 x86-64指令系统
1
以下有关IA-32和x86-64之间比较的叙述中,错误的是( )。
IA-32的字长为32位,x86-64的字长为64位并兼容IA-32
IA-32的通用寄存器有8个,而x86-64的通用寄存器有16个
IA-32的通用寄存器为8/16/32位,而x86-64的通用寄存器为8/16/32/64位
喵查答案:(unsigned) long型变量在IA-32和x86-64中的长度都是64位(四字)
2
以下关于IA-32和x86-64指令系统比较的叙述中,错误的是( )。
对于64位数据,x86-64可用一条指令处理,而IA-32需多条指令处理
对于入口参数,x86-64可用通用寄存器传递,而IA-32需用栈来传递
对于浮点操作数,x86-64存于128位的XMM中,而IA-32存于80位的ST(i)中
喵查答案:对于返回地址,x86-64使用通用寄存器保存,而IA-32使用栈来保存
3
以下关于x86-64过程调用的叙述中,错误的是( )。
前6个参数采用通用寄存器传递,其余参数通过栈传递
喵查答案:在通用寄存器中传递的参数,都存放在64位寄存器中
在栈中的参数若是基本类型,则被分配8个字节空间
返回参数存放在RAX相应宽度的寄存器中
4
假定long型变量t、int型变量x和short型变量y分别在RAX、RDI和RSI对应宽度寄存器中,C语言赋值语句“t=(long)(x+y);”对应的x86-64汇编指令序列不可能是( )。
movswl %si, %edx
addl %edi, %edx
movslq %edx, %rax
movswq %si, %rax
movslq %edi, %rdx
addq %rdx, %rax
喵查答案:
movswq %si, %rdx
leaq (%rdx, %rdi), %rax
movswq %si, %rsi
movslq %edi, %rdi
leaq (%rsi, %rdi), %rax
5
以下是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的数据类型分别为( )。
x—long, a—long, b—char, c—int
喵查答案:x—long, a—int, b—char, c—int
x—long, a—long, b—char, c—long
x—long, a—int, b—char, c—long
6
假定变量x的类型为long,对于变量y的初始化声明“int y=(int) x;”,其对应的汇编指令不可能是( )。
movl %edx, %eax
movzlq %edx, %rax
movslq %edx, %rax
喵查答案:movsql %rdx, %eax
7
假定变量x的类型为int,对于变量y的初始化声明“long y=(long) x;”,其对应的汇编指令是( )。
喵查答案:movslq %edx, %rax
movzlq %edx, %rax
movq %rdx, %rax
movl %edx, %eax
8
以下有关x86-64传送指令的叙述中,错误的是( )。
相比IA-32,增加了movq指令,可传送64位数据
movl相当于movzlq,能将目的寄存器高32位清0
喵查答案:pushq和popq分别对ESP寄存器减8和加8
movzbq的功能是将8位寄存器内容零扩展为64位
9
以下有关x86-64对齐方式的叙述中,错误的是( )。
short型数据必须按2字节边界对齐
int、float型数据必须按4字节边界对齐
long、double、指针型数据必须按8字节边界对齐
喵查答案:long double型数据在内存占12字节空间(96位)
10
以下有关x86-64寄存器的叙述中,错误的是( )。
用来存放将要执行的指令的地址的指令指针寄存器为64位的RIP
基址寄存器和编址寄存器都可以是任意一个64位的通用寄存器
喵查答案:任何浮点操作数都被分配在浮点寄存器栈(ST(0)~ST(7))中
128位的XMM寄存器从原来IA-32中的8个增加到16个
第十周 链接概述和目标文件格式
1 以下关于ELF目标文件的ELF头的叙述中,错误的是( )。
喵查答案:包含了ELF头本身的长度和目标文件的长度
包含了操作系统版本和机器结构类型等信息
包含了节头表和程序头表各自的起始位置和长度
数据结构在可重定位和可执行两种目标文件中完全一样
2
以下关于可重定位目标文件的叙述中,错误的是( )。
在.text节中包含相应模块内所有机器代码
喵查答案:在.data节中包含相应模块内所有变量的初始值
在.rodata节中包含相应模块内所有只读数据
在.rel.text节和.rel.data节中包含相应模块内所有可重定位信息
3 以下关于链接器基本功能的叙述中,错误的是( )。
将每个符号引用与唯一的一个符号定义进行关联
将每个.o文件中的.data节、.text节和.bss节合并
喵查答案:确定每个符号(包括全局变量和局部变量)的首地址
根据所定义符号的首地址对符号的引用进行重定位
4
以下关于ELF目标文件格式的叙述中,错误的是( )。
可重定位目标文件是ELF格式的链接视图,由不同的节组成
可执行目标文件是ELF格式的执行视图,由不同的段组成
喵查答案:可重定位和可执行两种目标文件中的数据都是二进制表示的补码形式
可重定位和可执行两种目标文件中的代码都是二进制表示的指令形式
5 以下是有关链接所带来的好处和不足的叙述,错误的是( )。
使得程序员可以分模块开发程序,有利于提高大规模程序的开发效率
使得公共函数库可以为所有程序共享使用,有利于代码重用和提高效率
使得程序员仅需重新编译修改过的源程序模块,从而节省程序开发时间
喵查答案:使得所生成的可执行目标代码中包含了更多公共库函数代码,所占空间大
6 以下是有关使用GCC生成C语言程序的可执行文件的叙述,其中错误的是( )。
预处理的结果还是一个C语言源程序文件,属于可读的文本文件
经过预处理、编译和汇编处理的结果是一个可重定位目标文件
每个C语言源程序文件生成一个对应的可重定位目标文件
喵查答案:只要在链接命令中指定所有的相关可重定位目标文件就能生成可执行文件
7 以下是有关使用GCC生成C语言程序的可执行文件的叙述,其中错误的是( )。
第一步预处理,对#include、#define、#ifdef等预处理命令进行处理
喵查答案:第二步编译,将预处理结果编译转换为二进制形式的汇编语言程序代码
第三步汇编,将汇编语言代码汇编转换为机器指令表示的机器语言代码
第四步链接,将多个模块的机器语言代码链接生成可执行目标程序文件
8 以下关于ELF可执行目标文件的程序头表(段头表)的叙述中,错误的是( )。
喵查答案:用于描述可执行文件中的节与主存中的存储段之间的映射关系
通过段头表可获得可装入段或特殊段的类型、在文件中的偏移位置及长度
描述了每个可装入段的起始虚拟地址、存储长度、存取方式和对齐方式
.text节和.rodata节都包含在只读代码段,而.data节和.bss节都包含在读写数据段
9 以下关于ELF可重定位和可执行两种目标文件格式比较的叙述中,错误的是( )。
可重定位目标文件中有可重定位节.rel.text和.rel.data,而在可执行目标文件中则没有
喵查答案:可重定位目标文件中有初始化程序段.init节,而在可执行目标文件中则没有
可执行目标文件中有程序头表(段头表),而在可重定位目标文件中则没有
可执行目标文件的ELF头中有具体程序入口地址,而在可重定位目标文件中则为0
10 以下关于ELF目标文件的节头表的叙述中,错误的是( )。
喵查答案:每个表项用来记录某个节的内容以及相关描述信息
通过节头表可获得节的名称、类型、起始地址和长度
描述了每个可装入节的起始虚拟地址、对齐和存取方式
数据结构在可重定位和可执行两种目标文件中完全一样
第十一周 符号及符号解析
1 假设调用关系如下:func.o→libx.a和liby.a中的函数,libx.a→libz.a中的函数,libx.a和liby.a之间、liby.a和libz.a相互独立,则以下几个命令行中,静态链接发生错误的命令是( )。
gcc -static –o myfunc func.o libx.a liby.a libz.a
喵查答案:gcc -static –o myfunc func.o liby.a libz.a libx.a
gcc -static –o myfunc func.o libx.a libz.a liby.a
gcc -static –o myfunc func.o liby.a libx.a libz.a
2 以下是两个源程序文件:
/* m1.c */ /* m2.c */
#include
int x=100; double x;
short y=1, z=2;
int main() void p1()
{ {
p1(); x= -1.0;
printf(“x=%d, z=%d\n”, x, z); }
} 上述程序执行的结果是( )。提示:1074790400=2^30+2^20,16400=2^14+2^4。
x=100, z=2
x=-1, z=2
x=-1074790400, z=0
喵查答案: x=0, z=-16400
3
以下是两个源程序文件:
/* m1.c */ /* m2.c */
int x=100; float x;
int p1(viod); static main=1;
int main() int p1()
{ {
x= p1(); int p1=main + (int) x;
return x; return p1;
} } 对于上述两个源程序文件链接时的符号解析,错误的是( )。
m1中对x的两处引用都与m1中对x的定义绑定
喵查答案:m2中对x的引用与m2中对x的定义绑定
m2中的变量p1与函数p1被分配在不同存储区
虽然x、main和p1都出现了多次定义,但不会发生链接错误
4
以下是两个源程序文件:
/* m1.c */ /* m2.c */
int p1; int main=1;
int main() int p1()
{ {
int p1= p1(); int p1=main++;
return p1; return main;
} } 对于上述两个源程序文件链接时的符号解析,错误的是( )。
在m1中,定义了一个强符号main和一个弱符号p1
在m2中,定义了一个强符号p1和一个强符号main
喵查答案:在模块m1的所有语句中,对符号p1的引用一共有三处
因为出现了两个强符号main,所以会发生链接错误
5
以下是两个源程序文件:
/* m1.c */ /* m2.c */
int p1(viod); static int main=1;
int main() int p1()
{ {
int p1= p1(); main++;
return p1; return main;
} } 对于上述两个源程序文件链接时的符号解析,错误的是( )。
在m1中,定义了一个强符号main和一个弱符号p1
在m2中,定义了一个强符号p1和一个局部符号main
在m1中,对m2中定义的强符号p1的引用只有一处
喵查答案:因为出现了两个强符号main,所以会发生链接错误
6 以下有关强符号和弱符号的符号解析的叙述中,错误的是( )。
一个符号名只能有一个强符号,否则符号解析失败
一个符号名可以有多个弱符号,任选一个为其定义
一个符号名可以有一个强符号和多个弱符号,强符号为其定义
喵查答案:一个符号名可以仅出现在引用处或仅出现在定义处
7 以下是有关链接过程中符号解析(符号绑定)的叙述,其中错误的是( )。
符号解析的目的是将符号引用与某目标模块中定义的符号建立关联
喵查答案:同一个符号名可能在多个模块中有定义,每个定义处的符号都须分配空间
本地符号的解析比较简单,只要与本模块内定义的符号关联即可
全局符号(包括外部全局符号)需将模块内的引用与模块外的定义符号绑定
8 以下有关ELF目标文件的符号表的叙述中,错误的是( )。
可重定位和可执行两种目标文件中都有符号表且数据结构一样
符号表定义在.symtab节中,每个表项描述某个符号的相应信息
通过符号表可获得符号的名称、所在节及在节中偏移地址和长度
喵查答案:符号表中包含了所有定义符号的描述信息,包括局部变量的相关信息
9 若x为局部变量,xp、y和z是全局变量,则以下判断中错误的是( )。
喵查答案:赋值语句“int y=x+z;”中,y和z都是符号的引用
赋值语句“y=x+z;”中,y和z都是符号的引用
静态局部变量声明“static int x=*xp;”中,xp是符号的引用
赋值语句“y=x+*xp;”中,y和xp都是符号的引用
10 以下是链接过程中对符号定义的判断,其中错误的是( )。
全局变量声明“int x, y;”中,x和y都是符号的定义
喵查答案:全局变量声明“int *xp=&x;”中,xp和x都是符号的定义
静态局部变量声明“static int x=*xp;”中,x是符号的定义
函数内的局部变量声明“short x=200;”中,x不是符号的定义
第十二周 重定位及动态链接
1 一个共享库文件(.so文件)由多个模块(.o文件)生成。在生成共享库文件的过程中,需要对.o文件进行处理,以生成位置无关代码。以下有关位置无关代码(PIC)生成的叙述中,错误的是( )。
模块内函数之间的调用可用PC相对地址实现,无需动态链接器进行重定位
模块内数据的引用无需动态链接器进行重定位,因为引用与定义间相对位置固定
模块外数据的引用需要动态链接器进行重定位,重定位时在GOT中填入外部数据的地址
喵查答案:模块间函数调用需要动态链接器进行重定位,重定位时在GOT和PLT中填入相应内容
2 以下是有关静态链接和动态链接比较的叙述,其中错误的是( )。
静态库函数代码包含在进程代码段中,而共享库函数代码不包含在进程代码段中
静态库函数代码包含在可执行目标文件中,而共享库函数代码不包含在可执行目标文件中
静态库函数更新后需对程序重新编译和链接,而共享库函数更新后程序无需重新编译和链接
喵查答案:静态链接情况下静态库函数在加载时被链接,动态链接情况下共享库函数可在加载或运行时被链接
3 以下是有关动态链接及其所链接的共享库以及动态链接生成的可执行目标文件的叙述,其中错误的是( )。
共享库在Linux下称为动态共享对象(.so),在Windows下称为动态链接库(.dll)
生成的可执行目标文件是部分链接的,也即,其中还有部分引用没有进行重定位
喵查答案:可执行目标文件由动态链接器对可重定位目标文件和共享库中部分信息进行链接而成
可执行目标文件在加载或执行时,系统将会调出动态链接器利用共享库对其进行动态链接
4
以下是在Linux系统中启动并加载可执行目标文件过程中shell命令行解释程序所做的部分操作:
① 构造构造argv和envp
② 调用fork()系统调用函数
③ 调用execve()系统调用函数
④ 读入命令(可执行文件名)及参数 启动并加载可执行目标文件的正确步骤是( )。
①→②→③→④
②→④→①→③
喵查答案:④→①→②→③
④→①→③→②
5
以下是有关在Linux系统中加载可执行目标文件的叙述,其中错误的是( )。
可执行目标文件的加载通过execve()函数调用的加载器来完成
加载器通过可执行目标文件中的程序头表对可装入段进行加载
喵查答案:在可执行目标文件的加载过程中,其中的指令和数据被读入主存
任何可执行目标文件中的可装入段被映射到一个统一的虚拟地址空间
6 以下是有关在Linux系统中启动可执行目标文件执行的叙述,其中错误的是( )。
喵查答案:可在CUI(命令行用户界面)中双击可执行目标文件对应的图标来启动其执行
可在CUI(命令行用户界面)中的命令行提示符后输入对应的命令来启动其执行
可以通过在一个程序中调用execve()系统调用函数来启动可执行文件执行
不管是哪种启动执行方式,最终都是通过调用execve()系统调用函数实现的
7 假定“int buf[2]={10,50};”所定义的buf被分配在静态数据区,其首地址为0x8048930,bufp1为全局变量,也被分配在静态数据区。以下关于“bufp1 = &buf[1];”的重定位的描述中,错误的是( )。
喵查答案:在可重定位目标文件的.rel.data节中,有一个与bufp1相关的重定位条目
在可重定位目标文件的.rel.text节中,有一个与buf相关的重定位条目
在相应的重定位条目中,对bufp1和buf的引用均采用绝对地址方式
可用一条mov指令实现该赋值语句,该mov指令中有两处需要重定位
8 假定“int buf[2]={10,50};”所定义的buf被分配在静态数据区,其首地址为0x8048930,bufp1为全局变量,被分配在buf随后的存储空间。以下关于“int *bufp1 = &buf[1];”的重定位的描述中,错误的是( )。
bufp1的地址为0x8048938,重定位前的内容为04H、00H、00H、00H
在可重定位目标文件的.rel.data节中,有一个引用buf的重定位条目
喵查答案:在相应的重定位条目中,对bufp1和buf的引用均采用绝对地址方式
在可执行目标文件中,地址0x8048938开始的4个字节为34H、89H、04H、08H
9 以下有关重定位信息的叙述中,错误的是( )。
喵查答案:重定位信息是由编译器在生成汇编指令时产生的
指令中的重定位信息在可重定位目标文件的.rel.text节中
数据中的重定位信息在可重定位目标文件的.rel.data节中
重定位信息包含需重定位的位置、绑定的符号和重定位类型
10 以下有关重定位功能的叙述中,错误的是( )。
重定位的最终目标是重新确定各模块合并后每个引用所指向的目标地址
重定位的第一步应先将相同的节合并,且将具有相同存取属性的节合并成段
重定位的第二步是确定每个段的起始地址,并确定段内每个定义处符号的地址
喵查答案:重定位的最后一步是将引用处的地址修改为与之关联(绑定)的定义处的首地址
计算机系统基础(一) –程序的表示、转换与链接 期末考试
1 以下有关动态链接的叙述中,错误的是( )。
将共享代码从可执行文件中分离出来形成共享库文件,在加载或执行可执行文件时进行动态链接
生成的共享库文件是位置无关代码(PIC),动态链接器可将共享库代码映射到任意地址运行
共享库中不同模块之间引用数据或调用函数时,需要使用全局偏移表(GOT)来动态填入地址
喵查答案:共享库中模块内或不同模块之间引用数据或调用函数时,都需要生成过程链接表(PLT)代码
2 假定“int buf[4]={100, 20, 1, 8};”所定义的buf被分配在静态数据区,其首地址为0x08048930,“int *bufp1;”为未初始化全局变量。以下关于“bufp1 = &buf[1];”的重定位的描述中,错误的是( )。
buf被定义在.data节中,共占16个字节
bufp1被定义在.bss节中,共占4个字节
bufp1和buf对应的重定位信息都在.rel.text节中
喵查答案:bufp1和buf重定位处的初值都是0且都采用绝对地址方式
3
以下是在IA-32系统上运行的一个程序:
int x= –200;
void main ( )
{ unsigned x;
printf(“x=%d\n”, x);
}
对于程序运行结果的叙述,其中正确的是( )。
因为格式符是%d,所以打印出来的结果应是x= – 200
因为-200被转换成了无符号数,所以打印结果不应该是x= – 200
因为x既是全局变量又是局部变量,被定义了两次,所以链接时会出错
喵查答案:因为打印结果是局部变量x的值,而局部变量x未赋初值,所以结果为随机值
4 以下是关于IA-32架构的栈帧中所存放信息的叙述,其中错误的是( )。
每个栈帧的底部存放的是EBP寄存器内容
喵查答案:因为静态变量是局部的,因此被存放在栈帧中
每递归调用一次递归过程就生成一个新的栈帧
调用过程对应栈帧中最后存放的总是返回地址
5 以下关于各类控制转移指令的叙述中,错误的是( )。
无条件转移指令(JMP)直接将转移目标地址送到EIP寄存器中
条件转移指令(Jcc)将根据EFLAGS寄存器中的标志信息进行条件判断
喵查答案:条件转移指令(Jcc)的判断条件可用于整数之间和浮点数之间的大小比较
调用指令(CALL)和返回指令(RET)都是特殊的无条件转移指令
6 假设 R[ax]=FFD0H,R[bx]=7FE5H,执行指令“subw %bx, %ax”后,寄存器的内容和各标志的变化为( )。
R[ax]=7FEBH,OF=0,SF=0,CF=1,ZF=0
R[bx]=7FEBH,OF=1,SF=1,CF=1,ZF=0
喵查答案: R[ax]=7FEBH,OF=1,SF=0,CF=0,ZF=0
R[bx]=7FEBH,OF=0,SF=1,CF=0,ZF=0
7 设SignExt[x]表示对x符号扩展,ZeroExt[x]表示对x零扩展。IA-32中指令“movzwl %cx, -16(%ebp)”的功能是( )。
M[R[ebp]-16]←SignExt[R[cx]]
R[cx]←SignExt [M[R[ebp]-16]]
喵查答案:M[R[ebp]-16]←ZeroExt[R[cx]]
R[cx]←ZeroExt [M[R[ebp]-16]]
8
某C语言程序中对数组变量b的声明为“short b[10][5];”,sum为int型,有一条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]所在的地址在ECX中,j在EDI中,则“sum+= b[i][j];”所对应的指令或指令序列(AT&T格式)可以是( )。
addl 0(%edi, %ecx, 2), %eax
addl 0(%ecx, %edi, 2), %eax
movzwl 0(%edi, %ecx, 2), %edx
addl %edx, %eax
喵查答案:movswl 0(%ecx, %edi, 2), %edxaddl %edx, %eax
9 假定整数加法指令、整数减法指令和移位指令所需时钟周期都为1,整数乘法指令所需时钟周期为8。若x为整型变量,为了使计算36*x所用时钟周期数最少,编译器应选用的最佳指令序列为( )。
1条乘法指令
喵查答案:两条左移指令和1条加法指令
4条左移指令和3条减法指令
3条左移指令和两条加法指令
10 若int型变量x的最高有效字节全变0,其余各位不变,则对应C语言表达式为( )。
(x <>8
( x >> 8) << 8
喵查答案: ((unsigned) x <>8
((unsigned) x >> 8) << 8
11 假定某数采用IEEE 754单精度浮点数格式表示为00000001H,则该数的值是( )。
喵查答案:1.0×2^(-149)
1.0×2^(-150)
1.00…01×2^(-127)
NaN(非数)
12 假定某数采用IEEE 754单精度浮点数格式表示为C820 0000H,则该数的值是( )。
–1.01×2^17
–1.01×2^144
喵查答案:–1.25×2^17
–1.25×2^144
13 –1.0625采用IEEE 754单精度浮点数格式表示的结果(十六进制形式)是( )。
3F880000H
喵查答案:BF880000H
40080000H
C0080000H
14
已知IA-32采用小端方式,有一个IA-32机器中的可执行文件反汇编后得到的机器级表示如下,其中左边冒号前为指令地址,中间为机器指令,右边为汇编指令。
……
80483d2: 81 ec 10 01 00 00 sub $0x110, %esp
……
80483de: 8b 85 01 ff ff ff mov 0xffffff01(%ebp), %eax
上述划线部分表示的立即数的值分别是( )。
268435456,33554432
喵查答案:272,–255
268435456,–255
272,33554432
15 在ISO C90标准下执行以下关系表达式,结果为“真”的是( )。
–1 < 0U
2147483647 > –2147483648
喵查答案:(unsigned) –1 > –2
2147483647 < (int) 2147483648U
16
考虑以下C语言代码:
unsigned short usi=65530;
short si=usi;
执行上述程序段后,si的值是( )。
65530
–65530
–5
喵查答案:–6
17 下列数中最小的数为( )。
101 0110B
喵查答案:73O
66D
3FH
18 以下有关机器指令和汇编指令的叙述中,错误的是( )。
机器指令和汇编指令一一对应,功能相同
喵查答案:机器指令和汇编指令都能被计算机直接执行
汇编指令中用符号表示操作码和地址码
汇编指令中用十进制或十六进制表示立即数
19 以下有关冯∙诺依曼结构思想的叙述中,错误的是( )。
计算机由运算器、存储器、控制器和I/O设备组成
程序由指令构成,计算机能自动执行程序中一条一条指令
喵查答案:指令和数据都放在存储器中,两者在形式上有差别
计算机内部以二进制形式表示指令和数据
20 以下有关指令集体系结构的叙述中,错误的是( )。
指令集体系结构是一种规定
喵查答案:指令集体系结构是对软件的一种抽象
指令集体系结构位于软件和硬件的交界面
指令集体系结构在计算机系统层次中必不可少
21 以下有关动态链接的叙述中,错误的是( )。
将共享代码从可执行文件中分离出来形成共享库文件,在加载或执行可执行文件时进行动态链接
生成的共享库文件是位置无关代码(PIC),动态链接器可将共享库代码映射到任意地址运行
共享库中不同模块之间引用数据或调用函数时,需要使用全局偏移表(GOT)来动态填入地址
喵查答案:共享库中模块内或不同模块之间引用数据或调用函数时,都需要生成过程链接表(PLT)代码
22 假定“int buf[4]={100, 20, 1, 8};”所定义的buf被分配在静态数据区,其首地址为0x08048930,“int *bufp1;”为未初始化全局变量。以下关于“bufp1 = &buf[1];”的重定位的描述中,错误的是( )。
buf被定义在.data节中,共占16个字节
bufp1被定义在.bss节中,共占4个字节
bufp1和buf对应的重定位信息都在.rel.text节中
喵查答案:bufp1和buf重定位处的初值都是0且都采用绝对地址方式
23
以下是在IA-32系统上运行的一个程序:
int x= –200;
void main ( )
{ unsigned x;
printf(“x=%d\n”, x);
}
对于程序运行结果的叙述,其中正确的是( )。
因为格式符是%d,所以打印出来的结果应是x= – 200
因为-200被转换成了无符号数,所以打印结果不应该是x= – 200
因为x既是全局变量又是局部变量,被定义了两次,所以链接时会出错
喵查答案:因为打印结果是局部变量x的值,而局部变量x未赋初值,所以结果为随机值
24 以下是关于IA-32架构的栈帧中所存放信息的叙述,其中错误的是( )。
每个栈帧的底部存放的是EBP寄存器内容
喵查答案:因为静态变量是局部的,因此被存放在栈帧中
每递归调用一次递归过程就生成一个新的栈帧
调用过程对应栈帧中最后存放的总是返回地址
25 以下关于各类控制转移指令的叙述中,错误的是( )。
无条件转移指令(JMP)直接将转移目标地址送到EIP寄存器中
条件转移指令(Jcc)将根据EFLAGS寄存器中的标志信息进行条件判断
喵查答案:条件转移指令(Jcc)的判断条件可用于整数之间和浮点数之间的大小比较
调用指令(CALL)和返回指令(RET)都是特殊的无条件转移指令
26 假设 R[ax]=FFD0H,R[bx]=7FE5H,执行指令“subw %bx, %ax”后,寄存器的内容和各标志的变化为( )。
R[ax]=7FEBH,OF=0,SF=0,CF=1,ZF=0
R[bx]=7FEBH,OF=1,SF=1,CF=1,ZF=0
喵查答案: R[ax]=7FEBH,OF=1,SF=0,CF=0,ZF=0
R[bx]=7FEBH,OF=0,SF=1,CF=0,ZF=0
27 设SignExt[x]表示对x符号扩展,ZeroExt[x]表示对x零扩展。IA-32中指令“movzwl %cx, -16(%ebp)”的功能是( )。
M[R[ebp]-16]←SignExt[R[cx]]
R[cx]←SignExt [M[R[ebp]-16]]
喵查答案:M[R[ebp]-16]←ZeroExt[R[cx]]
R[cx]←ZeroExt [M[R[ebp]-16]]
28
某C语言程序中对数组变量b的声明为“short b[10][5];”,sum为int型,有一条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]所在的地址在ECX中,j在EDI中,则“sum+= b[i][j];”所对应的指令或指令序列(AT&T格式)可以是( )。
addl 0(%edi, %ecx, 2), %eax
addl 0(%ecx, %edi, 2), %eax
movzwl 0(%edi, %ecx, 2), %edx
addl %edx, %eax
喵查答案:movswl 0(%ecx, %edi, 2), %edxaddl %edx, %eax
29 假定整数加法指令、整数减法指令和移位指令所需时钟周期都为1,整数乘法指令所需时钟周期为8。若x为整型变量,为了使计算36*x所用时钟周期数最少,编译器应选用的最佳指令序列为( )。
1条乘法指令
喵查答案:两条左移指令和1条加法指令
4条左移指令和3条减法指令
3条左移指令和两条加法指令
30 若int型变量x的最高有效字节全变0,其余各位不变,则对应C语言表达式为( )。
(x <>8
( x >> 8) << 8
喵查答案: ((unsigned) x <>8
((unsigned) x >> 8) << 8
31 假定某数采用IEEE 754单精度浮点数格式表示为00000001H,则该数的值是( )。
喵查答案:1.0×2^(-149)
1.0×2^(-150)
1.00…01×2^(-127)
NaN(非数)
32 假定某数采用IEEE 754单精度浮点数格式表示为C820 0000H,则该数的值是( )。
–1.01×2^17
–1.01×2^144
喵查答案:–1.25×2^17
–1.25×2^144
33 –1.0625采用IEEE 754单精度浮点数格式表示的结果(十六进制形式)是( )。
3F880000H
喵查答案:BF880000H
40080000H
C0080000H
34
已知IA-32采用小端方式,有一个IA-32机器中的可执行文件反汇编后得到的机器级表示如下,其中左边冒号前为指令地址,中间为机器指令,右边为汇编指令。
……
80483d2: 81 ec 10 01 00 00 sub $0x110, %esp
……
80483de: 8b 85 01 ff ff ff mov 0xffffff01(%ebp), %eax
上述划线部分表示的立即数的值分别是( )。
268435456,33554432
喵查答案:272,–255
268435456,–255
272,33554432
35 在ISO C90标准下执行以下关系表达式,结果为“真”的是( )。
–1 < 0U
2147483647 > –2147483648
喵查答案:(unsigned) –1 > –2
2147483647 < (int) 2147483648U
36
考虑以下C语言代码:
unsigned short usi=65530;
short si=usi;
执行上述程序段后,si的值是( )。
65530
–65530
–5
喵查答案:–6
37 下列数中最小的数为( )。
101 0110B
喵查答案:73O
66D
3FH
38 以下有关机器指令和汇编指令的叙述中,错误的是( )。
机器指令和汇编指令一一对应,功能相同
喵查答案:机器指令和汇编指令都能被计算机直接执行
汇编指令中用符号表示操作码和地址码
汇编指令中用十进制或十六进制表示立即数
39 以下有关冯∙诺依曼结构思想的叙述中,错误的是( )。
计算机由运算器、存储器、控制器和I/O设备组成
程序由指令构成,计算机能自动执行程序中一条一条指令
喵查答案:指令和数据都放在存储器中,两者在形式上有差别
计算机内部以二进制形式表示指令和数据
40 以下有关指令集体系结构的叙述中,错误的是( )。
指令集体系结构是一种规定
喵查答案:指令集体系结构是对软件的一种抽象
指令集体系结构位于软件和硬件的交界面
指令集体系结构在计算机系统层次中必不可少
41 CPU内部数据通路是指CPU内部的数据流经的路径以及路径上的部件,主要是CPU内部进行数据运算、存储和传送的部件,这些部件的宽度基本上要一致,才能相互匹配。所谓( )通常是指CPU内部用于整数运算的数据通路的宽度。
喵查答案:字长
42 计算机系统为层次结构,处在软件层次和硬件层次交界面的是指令集体系结构。指令集体系结构的英文缩写为( )。
喵查答案:ISA
43 共享库文件是一种特殊的可重定位目标文件,其中记录了相应的代码、数据、重定位和符号表信息,能在可执行目标文件装入或运行时被动态地装入到内存并自动被链接,这个过程称为动态链接(dynamic link),由一个称为( )的程序来完成。
喵查答案:动态链接器##%_YZPRLFH_%##动态链接程序
44 共享库以动态链接的方式被多个加载过程中的或正在执行的应用程序共享,因而共享库的动态链接有两个方面的特点:一是共享性,二是( )。
喵查答案:动态性
45 用( )指令表示的机器语言程序和用汇编指令表示的汇编语言程序统称为机器级程序,是对应高级语言程序的机器级表示。
喵查答案:机器
46 若两个float型变量(用IEEE 754单精度浮点格式表示)x和y的机器数分别表示为x=98737E2FH,y= C03652B3H,则在计算x–y时,第一步对阶操作的结果[Ex–Ey]补为( )。
喵查答案:1011 0000##%_YZPRLFH_%##10110000
47 补码乘法运算的情况下,可以通过乘积的高n位和低n位之间的关系来进行溢出判断。判断规则是:若高n位中每一位都与低n位的最高位相同,则( )。
喵查答案:不溢出
48 若8位带符号整数的补码表示为1001 0101,则左移一位后的结果为( )。
喵查答案:溢出##%_YZPRLFH_%##0010 1010##%_YZPRLFH_%##00101010
49 若8位带符号整数的补码表示为1001 0101,则右移一位后的结果为( )。
喵查答案:1100 1010##%_YZPRLFH_%##11001010
50 将数据的最高有效字节MSB存放在高地址而将最低有效字节LSB存放在低地址的方式为( )端方式。该方式下数据的地址就是LSB所在的地址。
喵查答案:小
/pay