第三章习题-ddg.
习 题
1. 给出以下概念的解释说明。
机器语言程序机器指令汇编语言
汇编指令汇编语言程序汇编助记符
汇编程序反汇编程序机器级程序
通用寄存器定点通用寄存器栈指针寄存器
指令指针寄存器标志寄存器条件标志(条件码)
控制标志寻址方式立即寻址
寄存器寻址存储器操作数实地址模式
保护模式比例变址非比例变址
比例系数(比例因子)MMX指令SSE指令集
SIMD多媒体扩展通用寄存器栈(Stack)
调用者保存寄存器被调用者保存寄存器帧指针寄存器
当前栈帧按值传递参数按地址传递参数
嵌套调用递归调用缓冲区溢出
缓冲区溢出攻击栈随机化
2. 简单回答下列问题。
(1)一条机器指令通常由哪些字段组成?各字段的含义分别是什么?
(2)将一个高级语言源程序转换成计算机能直接执行的机器代码通常需要哪几个步骤?
(3)IA-32中的逻辑运算指令如何生成条件标志?移位指令可能会改变哪些条件标志?
(4)执行条件转移指令时所用到的条件标志信息从何而来?请举例说明。
(5)无条件转移指令和调用指令的相同点和不同点是什么?
(6)按值传递参数和按地址传递参数两种方式有哪些不同点?
(7)为什么在递归深度较深时递归调用的时间开销和空间开销都会较大?
(8)为什么数据在存储器中最好按地址对齐方式存放?
(9)造成缓冲区溢出的根本原因是什么?
3. 对于以下AT&T格式汇编指令,根据操作数的长度确定对应指令助记符中的长度后缀,并说明每个操作数的寻址方式。
(1)mov 8(%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)lea 8(%ebx, %esi), %eax
4. 使用汇编器处理以下各行AT&T格式代码时都会产生错误,请说明每一行存在什么错误。
(1)movl 0xFF, (%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)movw 8(%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_typedst_type机器级表示charintintcharintunsignedshortintunsigned charunsignedcharunsignedintint
6.假设某个C语言函数func的原型声明如下:
void func(int *xptr, int *yptr, int *zptr);
函数func的过程体对应的机器级代码用AT&T汇编形式表示如下:
1movl8(%ebp), %eax
2movl12(%ebp), %ebx
3movl 16(%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)leal 4(%eax, %ecx), %ed