第五周课下测试(ch03)补交
1、( 多选题 | 1 分)
有关gdb调试汇编,下面说法正确的是()
- A .
可以用disas反汇编当前函数 - B .
以16进制形式打印%rax中内容的命令是 print /x $rax - C .
可以用info registers查看所有寄存器的值 - D .
可以用info frame 查看所有栈帧的信息 - E .
可以使用up,down切换栈帧
ABCE
书P194
A:disas 反汇编当前函数
B:print /x $rax 以十六进制输出%rax的内容
C:info registers查看所有寄存器的值
D:info frame查看有关当前栈帧的信息,并非所有栈帧的信息,故不对
E:使用 up down ,跳转不同堆栈,查询其中的堆栈简要信息
2、( 多选题 | 1 分)
x86-64 Linux汇编中,构建栈帧的语句是( )
A .
movq %rbp, %rsp
popq %rbp- B .
enter - C .
leave - D .
pushq %rbp
movq %rsp, %rbp
BD
enter等价于
pushq %rbp
movq %rsp, %rbp
3、( 多选题 | 1 分)
Linux汇编中,销毁栈帧的语句是( )
- A .
movq %rbp, %rsp
popq %rbp - B .
leave - C .
enter - D .
pushq %rbp
movq %rsp, %rbp
AB
leave等价于:
movq %rbp, %rsp
popq %rbp
4、函数调用过程中,栈用来( )
- A .
传递参数 - B .
存储返回信息 - C .
保存寄存器 - D .
局部存储
ABCD
书P164
A:“用栈来管理他的过程所需要的存储空间,栈和程序寄存器存放着传递控制和数据、分配内存所需要的信息”即传递参数
B:“当前正在执行的过程的帧总是在栈顶。当过程P调用过程Q时,会把返回地址压入栈中”即存储返回信息
C:“Q的代码会扩展当前栈的边界,分配她的栈帧所需的空间。在这个空间中,他可以保存寄存器的值,分配局部变量空间”即保存寄存器
D:“为了提高空间和时间效率,x86-64过程只分配自己所需要的栈帧部分”即局部存储
5、( 多选题 | 1 分)
有关C语言的控制语句和汇编指令的关系说法正确的是()
- A .
可以使用汇编的有条件和无条件跳转来实现C语言的条件分支 - B .
可以使用数据的条件转移来实现C语言的条件分支 - C .
可以使用数据的条件转移来实现C语言的循环 - D .
可以使用条件测试和跳转组合起来实现循环
正确答案: A B D 你的答案: 未作答
ABD
A:举例gotodiff_se函数
B:P145 3·6·6一种代替的策略就是使用数据的条件转移,来实现条件分支
C、D:汇编中没有循环结构的指令可以用条件测试和跳转组合来实现循环的效果,故选D
6、( 多选题 | 1 分)
下面的跳转指令与ZF有关的是()
- A .
jmp - B .
je - C .
js - D .
ja - E .
jb - F .
jbe
BDF
见P1391图3-15
7、( 多选题 | 1 分)
假设用ADD指令完成C表达式t=a+b的功能,有关条件码寄存器的说法正确的是()
- A .
若t==0 ,则ZF=1 - B .
若t<0, 则CF=1 - C .
若t<0, 则SF=1 - D .
若(a<0==b<0)&&(t<0 != a<0), 则OF=1 - E .
若(a<0==b<0)&&(t<0 != a<0), 则CF=1 - F .
leaq指令不影响条件码寄存器 - G .
cmp指令不影响条件码寄存器
ADF
ZF:零标志。最近的操作得出的结果为0,故当t==0,ZF=1,A对
CF:进位标志。最近的操作使最高位产生了进位。B E不对
SF:符号标志。最近的操作得到的结果为负数。
[所以为啥不选C啊?????]
OF:溢出标志。最近的操作导致一个补码溢出——正溢出或负溢出。(a<0==b<0)&&(t<0!=a<0) 有符号溢出,故选D
leaq指令不改变任何条件码,选F
CMP指令根据两个操作数之差来设置条件码。除了只设置条件码而不更新目的寄存器之外,与SUB指令的行为是一样的。
8、有关移位指令,下面说法正确的是()
- A .
SAL和SHL效果一样 - B .
移位量只能是一个立即数 - C .
移位量可以放在%cl中 - D .
移位量可以放在%cx中 - E .
SAR和SHR效果一样
AC
A:左移指令有俩个名字:SAL和SHL效果一样。
B、C、D:移位量可以是一个立即数,或者放在单字节寄存器%cl中。
E:右移指令不同,SAR执行算术移位,SHR执行逻辑移位
9、( 多选题 | 1 分)
对于下面的值,有关算术运算的指令正确的是()
Image 1.png
- A .
addq %rcx,(%rax), 目的地址是0x100 - B .
addq %rcx,(%rax), 目的地址的内容是0x100 - C .
subq %rdx, 8(%rax) 的值是0xA8 - D .
incq 16(%rax)值是12
ABC
我参考了这篇[部落格](http://blog.csdn.net/qq_35524916/article/details/61421411)
10、( 多选题 | 1 分)
假设%rax中的值为x, %rcx中的值为y,关于leaq指令,下面正确的()
- A .
leaq 6(%rax), %rdx; %rdx中值为6+x - B .
leaq 6(%rax), %rdx; %rdx中值为6x - C .
leaq 7(%rax, %rax,8), %rdx; %rdx中值为9x - D .
leaq 7(%rax, %rax,8), %rdx; %rdx中值为63x - E .
leaq 7(%rax, %rax,8), %rdx; %rdx中值为15x
我参考了这篇[部落格](http://blog.csdn.net/swordmanwk/article/details/41169953)
11、以下代码是将void decode1(long xp, long yp, long *zp)反汇编的结果,下面说法正确的是()
Image 6.png
A .
从汇编代码看出,decode1的参数先入栈的是zp- B .
从汇编代码看出,decode1的参数先入栈的是xp - C .
函数功能等价于 t=x; x=y; y=z; z=t; - D .
函数功能等价于 x=y; y=z; z=x;
C
xp、yp和zp分别存储在对应的寄存器%rdi、%rsi和%rdx中。
12、( 单选题 | 1 分)
x86-64 Linux中,函数调用的返回值存在()寄存器中。
- A .
%rax - B .
%rbx - C .
%rcx - D .
%rsp - E .
%rbp
书P120第一行
13、( 单选题 | 1 分)
x86-64 Linux中,%rsp的值为0x108, pushq %eax后,%rsp的值为()
- A .
0x100 - B .
0x108 - C .
0x110 - D .
0x118
p128: pushq %rsp-8
14、( 单选题 | 1 分)
x86-64 Linux中,%rbp的值为0x108, pushq %eax后,%rbp的值为()
- A .
0x100 - B .
0x108 - C .
0x110 - D .
0x118
p128,push不影响%rbp的值。
15、x86-64 Linux中,有关MOV,下面正确的是()
- A .
movw $0x50, %eax - B .
movw %bp, %sp - C .
movl ($1234), ($2345) - D .
movb $10, (%rsp) - E .
movq %rax, 4(%rbp) - F .
movb (%rdi, %rcx), %ah
p122 ,p123, 注意内存之间不能直接mov,要用寄存器中转。b,w,l,q表示的长度要和寄存器匹配。
16、对于图中内存地址和寄存器的值,下面说法正确的是()
Image 5.png
- A .
%rax的值是0x100 - B .
(%rax)的值是0x100 - C .
(%rax)的值是0x104 - D .
(%rax)的值是0xFF - E .
4(%rax)的值是0xAB - F .
(%rax,%rcx,4)的值是0xAB - G .
(%rax,%rcx,4)的值是0x104
ADEF
%rax :返回值
%rcx:第四个参数
%rdx:第三个参数
17、x86-64 Linux中,操作数的类型有()
- A .
立即数 - B .
寄存器 - C .
内存引用 - D .
IO引用
ABC
书P121
“各种不同的操作数被分为三种类型:立即数,寄存器,内存引用”
18、( 单选题 | 1 分)
x86-64中,()寄存器用来保存运行时栈的结束位置(栈顶)
- A .
%rax - B .
%rbx - C .
%rbp - D .
%rsp
D
书P120
"其中最特别的是栈指针%rsp,用来指明运行时栈的结束位置"
19、( 单选题 | 1 分)
movl一次传送()字节的数据
- A .
1 - B .
2 - C .
4 - D .
8
C
书P119
“movl(传送双字)”即传送4字节
20、( 单选题 | 1 分)
x86-64 Linux中,push %rbx对应的机器码是()
- A .
0x53 - B .
0xd38948 - C .
0x4889d3 - D .
0x5b
A
书P115
下方代码
21、( 单选题 | 1 分)
x86-64中指令长度是()字节
- A .
1 - B .
2 - C .
4 - D .
1-4 - E .
1-8 - F .
1-15 - G .
1-16 - H .
以上都不对
F
书P116
“x86-64的指令长度从1到15个字节不等”
22、( 单选题 | 1 分)
X86-64中虚拟地址的数量目前是()个
- A .
2^16 - B .
2^32 - C .
2^48 - D .
2^64
C
书P114
“在目前的实现中,这些地址的高16位必须设置为0,所以一个地址实际上能够指定的是2^48或64TB范围内的一个字节”
23、( 单选题 | 1 分)
要实现c中的if,while所需的条件变化,需要()寄存器中的信息。
- A .
通用 - B .
向量 - C .
条件码 - D .
整数
C
书p114
“条件码寄存器保存着最近执行的算数或逻辑指令的状态信息。他们用来实现控制或数据流中的条件变化,比如说用来实现if和while语句”
24、( 单选题 | 1 分)
程序计数器(PC) 指示将要执行的下一条指令在内存中的地址,X86-64中,PC指()
- A .
%rsp - B .
%rip - C .
%rbp - D .
%rax
B
书P113
“程序计数器(通常成为“PC”,在x86-64中用%rip表示)给出将要执行的下一条指令在内存中的地址”
25、( 单选题 | 1 分)
Linux中,对目标代码code.o进行反汇编的命令是()
- A .
gcc -c code.o - B .
asm code.o - C .
od code.o - D .
objdump -d code.o
D
书P115
“在Linux系统中,带‘-d’命令行标志的程序OBJDUMP(表示“object dump”)可以充当这个角色:linux> objdump -d mstore.o”
26、( 多选题 | 1 分)
对于机器级编程,要深入理解两种抽象()
- A .
ISA - B .
进程 - C .
文件 - D .
虚拟地址
AD
书P113
“对于机器级编程来说,其中两种抽象尤为重要。第一种是有指令集体系结构或指令集结构(ISA)来定义的机器级程序的格式和行为第二种抽象是机器级程序使用的内存地址是虚拟地址”
27、( 单选题 | 1 分)
Intel的处理模型中()首次引入超线程技术。
- A .
Pentium III - B .
Pentium 4 - C .
Pentium 4E - D .
Core 2
C
书P111
“Pentium 4E,增加了超线程技术”
28、( 单选题 | 1 分)
Intel的处理模型中()首次将体系结构扩展到32位,增加了平坦寻址模式。
- A .
8087 - B .
80286 - C .
i386 - D .
i486
C
书P111
“i386.将体系结构扩展到32位”