您好,欢迎访问三七文档
习题1.给出以下概念的解释说明。机器语言程序机器指令汇编语言汇编指令汇编语言程序汇编助记符汇编程序反汇编程序机器级程序通用寄存器定点通用寄存器栈指针寄存器指令指针寄存器标志寄存器条件标志(条件码)控制标志寻址方式立即寻址寄存器寻址存储器操作数实地址模式保护模式比例变址非比例变址比例系数(比例因子)MMX指令SSE指令集SIMD多媒体扩展通用寄存器栈(Stack)调用者保存寄存器被调用者保存寄存器帧指针寄存器当前栈帧按值传递参数按地址传递参数嵌套调用递归调用缓冲区溢出缓冲区溢出攻击栈随机化2.简单回答下列问题。(1)一条机器指令通常由哪些字段组成?各字段的含义分别是什么?(2)将一个高级语言源程序转换成计算机能直接执行的机器代码通常需要哪几个步骤?(3)IA-32中的逻辑运算指令如何生成条件标志?移位指令可能会改变哪些条件标志?(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),%eax4.使用汇编器处理以下各行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),%ax5.假设变量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_typedst_type机器级表示charintintcharintunsignedshortintunsignedcharunsignedcharunsignedintint6.假设某个C语言函数func的原型声明如下:voidfunc(int*xptr,int*yptr,int*zptr);函数func的过程体对应的机器级代码用AT&T汇编形式表示如下:1movl8(%ebp),%eax2movl12(%ebp),%ebx3movl16(%ebp),%ecx4movl(%ebx),%edx5movl(%ecx),%esi6movl(%eax),%edi7movl%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),%edx8.假设以下地址以及寄存器中存放的机器数如表3.13所示。表3.13题8用表地址机器数寄存器机器数0x80493000xfffffff0EAX0x080493000x80494000x80000008EBX0x000001000x80493840x80f7ff00ECX0x000000100x80493800x908f12a8EDX0x00000080分别说明执行以下指令后,哪些地址或寄存器中的内容会发生改变?改变后的内容是什么?条件标志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%cx9.假设函数operate的部分C代码如下:1intoperate(intx,inty,intz,intk)2{3intv=;4returnv;5}以下汇编代码用来实现第3行语句的功能,请写出每条汇编指令的注释,并根据以下汇编代码,填写operate函数缺失的部分。1movl12(%ebp),%ecx2sall$8,%ecx3movl8(%ebp),%eax4movl20(%ebp),%edx5imull%edx,%eax6movl16(%ebp),%edx7andl$65520,%edx8addl%ecx,%edx9subl%edx,%eax10.假设函数product的C语言代码如下,其中num_type是用typedef声明的数据类型。1voidproduct(num_type*d,unsignedx,num_typey){2*d=x*y;3}函数product的过程体对应的主要汇编代码如下:1movl12(%ebp),%eax2movl20(%ebp),%ecx3imull%eax,%ecx4mull16(%ebp)5leal(%ecx,%edx),%edx6movl8(%ebp),%ecx7movl%eax,(%ecx)8movl%edx,4(%ecx)请给出上述每条汇编指令的注释,并说明num_type是什么类型。11.已知IA-32是小端方式处理器,根据给出的IA-32机器代码的反汇编结果(部分信息用x表示)回答问题。(1)已知je指令的操作码为01110100,je指令的转移目标地址是什么?call指令中的转移目标地址0x80483b1是如何反汇编出来的?804838c:7408jexxxxxxx804838e:e81e000000call80483b1test(2)已知jb指令的操作码为01110010,jb指令的转移目标地址是什么?movl指令中的目的地址如何反汇编出来的?8048390:72f6jbxxxxxxx8048392:c60500a8040801movl$0x1,0x804a8008048399:000000(3)已知jle指令的操作码为01111110,mov指令的地址是什么?xxxxxxx:7e16jle80492e0xxxxxxx:89d0mov%edx,%eax(4)已知jmp指令的转移目标地址采用相对寻址方式,jmp指令操作码为11101001,其转移目标地址是什么?8048296:e900ffffffjmpxxxxxxx804829b:29c2sub%eax,%edx12.已知函数comp的C语言代码及其过程体对应的汇编代码如下:要求回答下列问题或完成下列任务。(1)给出每条汇编指令的注释,并说明为什么C代码只有一个if语句而汇编代码有两条条件转移指令。(2)按照书中图3.22给出的“if()goto…”语句形式写出汇编代码对应的C语言代码。13.已知函数func的C语言代码框架及其过程体对应的汇编代码如下,根据对应的汇编代码填写C代码中缺失的表达式。1voidcomp(charx,int*p)2{3if(p&&x0)4*p+=x;5}1movb8(%ebp),%dl2movl12(%ebp),%eax3testl%eax,%eax4je.L15testb$0x80,%dl6je.L17addb%dl,(%eax)8.L1:14.已知函数do_loop的C语言代码如下:1shortdo_loop(shortx,shorty,shortk){2do{3x*=(y%k);4k--;5}while((k0)&&(yk));6returnx;7}函数do_loop的过程体对应的汇编代码如下:1movw8(%ebp),%bx2movw12(%ebp),%si3movw16(%ebp),%cx4.L1:5movw%si,%dx6movw%dx,%ax7sarw$15,%dx8idiv%cx9imulw%dx,%bx10decw%cx11testw%cx,%cx12jle.L213cmpw%cx,%si14jg.L115.L2:16movswl%bx,%eax请回答下列问题或完成下列任务:1intfunc(intx,inty)2{3intz=;4if(){5if()6z=;7else8z=;9}elseif()10z=;11returnz;12}1movl8(%ebp),%eax2movl12(%ebp),%edx3cmpl$-100,%eax4jg.L15cmpl%eax,%edx6jle.L27addl%edx,%eax8jmp.L39.L2:10subl%edx,%eax11jmp.L312.L1:13cmpl$16,%eax14jl.L415andl%edx,%eax16jmp.L317.L4:18imull%edx,%eax19.L3:(1)给每条汇编指令添加注释,并说明每条指令执行后,目的寄存器中存放的是什么信息?(2)上述函数过程体中用到了哪些被调用者保存寄存器和哪些调用者保存寄存器?在该函数过程体前面的准备阶段哪些寄存器必须保存到栈中?(3)为什么第7行中的DX寄存器需要算术右移15位?15.已知函数f1的C语言代码框架及其过程体对应的汇编代码如下,根据对应的汇编代码填写C代码中缺失部分,并说明函数f1的功能。16.已知函数sw的C语言代码框架如下:intsw(intx){intv=0;switch(x){/*switch语句中的处理部分省略*/}returnv;}对函数sw进行编译,得到函数过程体中开始部分的汇编代码以及跳转表如下:回答下列问题:函数sw中的switch语句处理部分标号的取值情况如何?标号的取值在什么情况下执行default分支?哪些标号的取值会执行同一个case分支?17.已知函数test的入口参数有a、b、c和p,C语言过程体代码如下:*p=a;returnb*c;函数test过程体对应的汇编代码如下:1movl20(%ebp),%edx2movsbw8(%ebp),%ax1movl8(%ebp),%eax2addl$3,%eax3cmpl$7,%eax4ja.L75jmp*.L8(,%eax,4)6.L7:7……8……1.L8:2.long.L73.long.L24.long.L25.long.L36.long.L47.long.L58.long.L79.long.L61intf1(unsignedx)2{3inty=0;4while(){5;6}7return;8}1movl8(%ebp),%edx2movl$0,%eax3testl%edx,%edx4je.L15.L2:6xorl%edx,%eax7shrl$1,%edx8jne.L29.L1:10andl$1,%eax3movw%ax,(%edx)4movzwl12(%ebp),%eax5movzwl16(%ebp),%
本文标题:第三章习题-ddg
链接地址:https://www.777doc.com/doc-2120403 .html