第三章习题ddg剖析Word文档格式.docx
《第三章习题ddg剖析Word文档格式.docx》由会员分享,可在线阅读,更多相关《第三章习题ddg剖析Word文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
移位指令可能会改变哪些条件标志?
(4)执行条件转移指令时所用到的条件标志信息从何而来?
请举例说明。
(5)无条件转移指令和调用指令的相同点和不同点是什么?
(6)按值传递参数和按地址传递参数两种方式有哪些不同点?
(7)为什么在递归深度较深时递归调用的时间开销和空间开销都会较大?
(8)为什么数据在存储器中最好按地址对齐方式存放?
(9)造成缓冲区溢出的根本原因是什么?
3.对于以下AT&
T格式汇编指令,根据操作数的长度确定对应指令助记符中的长度后缀,并说明每个操作数的寻址方式。
(1)mov8(%ebp,%ebx,4),%ax
(2)mov%al,12(%ebp)
(3)add(,%ebx,4),%ebx
(4)or(%ebx),%dh
(5)push$0xF8
(6)mov$0xFFF0,%eax
(7)test%cx,%cx
(8)lea8(%ebx,%esi),%eax
4.使用汇编器处理以下各行AT&
T格式代码时都会产生错误,请说明每一行存在什么错误。
(1)movl0xFF,(%eax)
(2)movb%ax,12(%ebp)
(3)addl%ecx,$0xF0
(4)orw$0xFFFF0,(%ebx)
(5)addb$0xF8,(%dl)
(6)movl%bx,%eax
(7)andl%esi,%esx
(8)movw8(%ebp,,4),%ax
5.假设变量x和ptr的类型声明如下:
src_typex;
dst_type*ptr;
这里,src_type和dst_type是用typedef声明的数据类型。
有以下一个C语言赋值语句:
*ptr=(dst_type)x;
若x存储在寄存器EAX或AX或AL中,ptr存储在寄存器EDX中,则对于表3.12中给出的src_type和dst_type的类型组合,写出实现上述赋值语句的机器级代码。
要求用AT&
T格式汇编指令表示机器级代码。
表3.12题5用表
src_type
dst_type
机器级表示
char
int
unsigned
short
unsignedchar
6.假设某个C语言函数func的原型声明如下:
voidfunc(int*xptr,int*yptr,int*zptr);
函数func的过程体对应的机器级代码用AT&
T汇编形式表示如下:
1movl8(%ebp),%eax
2movl12(%ebp),%ebx
3movl16(%ebp),%ecx
4movl(%ebx),%edx
5movl(%ecx),%esi
6movl(%eax),%edi
7movl%edi,(%ebx)
8movl%edx,(%ecx)
9movl%esi,(%eax)
请回答下列问题或完成下列任务。
(1)在过程体开始时三个入口参数对应实参所存放的存储单元地址是什么?
(提示:
当前栈帧底部由帧指针寄存器EBP指示)
(2)根据上述机器级代码写出函数func的C语言代码。
7.假设变量x和y分别存放在寄存器EAX和ECX中,请给出以下每条指令执行后寄存器EDX中的结果。
(1)leal(%eax),%edx
(2)leal4(%eax,%ecx),%edx
(3)leal(%eax,%ecx,8),%edx
(4)leal0xC(%ecx,%eax,2),%edx
(5)leal(,%eax,4),%edx
(6)leal(%eax,%ecx),%edx
8.假设以下地址以及寄存器中存放的机器数如表3.13所示。
表3.13题8用表
地址
机器数
寄存器
0x8049300
0xfffffff0
EAX
0x08049300
0x8049400
0x80000008
EBX
0x00000100
0x8049384
0x80f7ff00
ECX
0x00000010
0x8049380
0x908f12a8
EDX
0x00000080
分别说明执行以下指令后,哪些地址或寄存器中的内容会发生改变?
改变后的内容是什么?
条件标志OF、SF、ZF和CF会发生什么改变?
(1)addl(%eax),%edx
(2)subl(%eax,%ebx),%ecx
(3)orw4(%eax,%ecx,8),%bx
(4)testb$0x80,%dl
(5)imull$32,(%eax,%edx)
(6)decw%cx
9.假设函数operate的部分C代码如下:
1intoperate(intx,inty,intz,intk)
2{
3intv=;
4returnv;
5}
以下汇编代码用来实现第3行语句的功能,请写出每条汇编指令的注释,并根据以下汇编代码,填写operate函数缺失的部分。
1movl12(%ebp),%ecx
2sall$8,%ecx
3movl8(%ebp),%eax
4movl20(%ebp),%edx
5imull%edx,%eax
6movl16(%ebp),%edx
7andl$65520,%edx
8addl%ecx,%edx
9subl%edx,%eax
10.假设函数product的C语言代码如下,其中num_type是用typedef声明的数据类型。
1voidproduct(num_type*d,unsignedx,num_typey){
2*d=x*y;
3}
函数product的过程体对应的主要汇编代码如下:
1movl12(%ebp),%eax
2movl20(%ebp),%ecx
3imull%eax,%ecx
4mull16(%ebp)
5leal(%ecx,%edx),%edx
6movl8(%ebp),%ecx
7movl%eax,(%ecx)
8movl%edx,4(%ecx)
请给出上述每条汇编指令的注释,并说明num_type是什么类型。
11.已知IA-32是小端方式处理器,根据给出的IA-32机器代码的反汇编结果(部分信息用x表示)回答问题。
(1)已知je指令的操作码为01110100,je指令的转移目标地址是什么?
call指令中的转移目标地址0x80483b1是如何反汇编出来的?
804838c:
7408jexxxxxxx
804838e:
e81e000000call80483b1<
test>
(2)已知jb指令的操作码为01110010,jb指令的转移目标地址是什么?
movl指令中的目的地址如何反汇编出来的?
8048390:
72f6jbxxxxxxx
8048392:
c60500a8040801movl$0x1,0x804a800
8048399:
000000
(3)已知jle指令的操作码为01111110,mov指令的地址是什么?
xxxxxxx:
7e16jle80492e0
89d0mov%edx,%eax
(4)已知jmp指令的转移目标地址采用相对寻址方式,jmp指令操作码为11101001,其转移目标地址是什么?
8048296:
e900ffffffjmpxxxxxxx
804829b:
29c2sub%eax,%edx
12.已知函数comp的C语言代码及其过程体对应的汇编代码如下:
要求回答下列问题或完成下列任务。
(1)给出每条汇编指令的注释,并说明为什么C代码只有一个if语句而汇编代码有两条条件转移指令。
(2)按照书中图3.22给出的“if()goto…”语句形式写出汇编代码对应的C语言代码。
13.已知函数func的C语言代码框架及其过程体对应的汇编代码如下,根据对应的汇编代码填写C代码中缺失的表达式。
14.已知函数do_loop的C语言代码如下:
1shortdo_loop(shortx,shorty,shortk){
2do{
3x*=(y%k);
4k--;
5}while((k>
0)&
&
(y>
k));
6returnx;
7}
函数do_loop的过程体对应的汇编代码如下:
1movw8(%ebp),%bx
2movw12(%ebp),%si
3movw16(%ebp),%cx
4.L1:
5movw%si,%dx
6movw%dx,%ax
7sarw$15,%dx
8idiv%cx
9imulw%dx,%bx
10decw%cx
11testw%cx,%cx
12jle.L2
13cmpw%cx,%si
14jg.L1
15.L2:
16movswl%bx,%eax
请回答下列问题或完成下列任务:
(1)给每条汇编指令添加注释,并说明每条指令执行后,目的寄存器中存放的是什么信息?
(2)上述函数过程体中用到了哪些被调用者保存寄存器和哪些调用者保存寄存器?
在该函数过程体前面的准备阶段哪些寄存器必须保存到栈中?
(3)为什么第7行中的DX寄存器需要算术右移15位?
15.已知函数f1的C语言代码框架及其过程体对应的汇编代码如下,根据对应的汇编代码填写C代码中缺失部分,并说明函数f1的功能。
16.已知函数sw的C语言代码框架如下:
intsw(intx){
intv=0;
switch(x){
/*switch语句中的处理部分省略*/
}
retu