习 题
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_type x;
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 | |
int | char | |
int | unsigned | |
short | int | |
unsigned char | unsigned | |
char | unsigned | |
int | int | |
6. 假设某个C语言函数func的原型声明如下:
void func(int *xptr, int *yptr, int *zptr);
函数func的过程体对应的机器级代码用AT&T汇编形式表示如下:
1 movl 8(%ebp), %eax
2 movl 12(%ebp), %ebx
3 movl 16(%ebp), %ecx
4 movl (%ebx), %edx
5 movl (%ecx), %esi
6 movl (%eax), %edi
7 movl %edi, (%ebx)
8 movl %edx, (%ecx)
9 movl %esi, (%eax)
请回答下列问题或完成下列任务。
(1)在过程体开始时三个入口参数对应实参所存放的存储单元地址是什么?(提示:当前栈帧底部由帧指针寄存器EBP指示)
(2)根据上述机器级代码写出函数func的C语言代码。
7. 假设变量x和y分别存放在寄存器EAX和ECX中,请给出以下每条指令执行后寄存器EDX中的结果。
(1)leal (%eax), %edx
(2)leal 4(%eax, %ecx), %edx
(3)leal (%eax, %ecx, 8), %edx
(4)leal 0xC(%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)orw 4(%eax, %ecx, 8), %bx
(4)testb $0x80, %dl
(5)imull $32, (%eax, %edx)
(6)decw %cx
9. 假设函数operate的部分C代码如下:
1 int operate(int x, int y, int z, int k)
2 {
3 int v = ;
4 return v;
5 }
以下汇编代码用来实现第3行语句的功能,请写出每条汇编指令的注释,并根据以下汇编代码,填写operate函数缺失的部分。
1 movl 12(%ebp), %ecx
2 sall $8, %ecx
3 movl 8(%ebp), %eax
4 movl 20(%ebp), %edx
5 imull %edx, %eax
6 movl 16(%ebp), %edx
7 andl $65520, %edx
8 addl %ecx, %edx
9 subl %edx, %eax
10. 假设函数product的C语言代码如下,其中num_type是用typedef声明的数据类型。
1 void product(num_type *d, unsigned x, num_type y ) {
2 *d = x*y;
3 }
函数product的过程体对应的主要汇编代码如下:
1 movl 12(%ebp), %eax
2 movl 20(%ebp), %ecx
3 imull %eax, %ecx
4 mull 16(%ebp)
5 leal (%ecx, %edx), %edx
6 movl 8(%ebp), %ecx
7 movl %eax, (%ecx)
8 movl %edx, 4(%ecx)
请给出上述每条汇编指令的注释,并说明num_type是什么类型。
11.已知IA-32是小端方式处理器,根据给出的IA-32机器代码的反汇编结果(部分信息用x表示)回答问题。
(1)已知je指令的操作码为01110100,je指令的转移目标地址是什么?call指令中的转移目标地址0x80483b1是如何反汇编出来的?
804838c : 74 08 je xxxxxxx
804838e: e8 1e 00 00 00 call 80483b1<test>
(2)已知jb指令的操作码为01110010,jb指令的转移目标地址是什么?movl指令中的目的地址如何反汇编出来的?
8048390: 72 f6 jb xxxxxxx
8048392: c6 05 00 a8 04 08 01 movl $0x1, 0x804a800
8048399: 00 00 00
(3)已知jle指令的操作码为01111110,mov指令的地址是什么?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论