第三章习题-ddg 下载本文

内容发布更新时间 : 2024/11/15 10:46:51星期一 下面是文章的全部内容请认真阅读。

习 题

1. 给出以下概念的解释说明。

机器语言程序 机器指令 汇编语言 汇编指令 汇编语言程序 汇编助记符 汇编程序 反汇编程序 机器级程序 通用寄存器 定点通用寄存器 栈指针寄存器 指令指针寄存器 标志寄存器 条件标志(条件码) 控制标志 寻址方式 立即寻址 寄存器寻址 存储器操作数 实地址模式 保护模式 比例变址 非比例变址 比例系数(比例因子) MMX指令 SSE指令集 SIMD 多媒体扩展通用寄存器 栈(Stack) 调用者保存寄存器 被调用者保存寄存器 帧指针寄存器 当前栈帧 按值传递参数 按地址传递参数 嵌套调用 递归调用 缓冲区溢出 缓冲区溢出攻击 栈随机化 2. 简单回答下列问题。

(1)一条机器指令通常由哪些字段组成?各字段的含义分别是什么?

(2)将一个高级语言源程序转换成计算机能直接执行的机器代码通常需要哪几个步骤? (3)IA-32中的逻辑运算指令如何生成条件标志?移位指令可能会改变哪些条件标志? (4)执行条件转移指令时所用到的条件标志信息从何而来?请举例说明。 (5)无条件转移指令和调用指令的相同点和不同点是什么? (6)按值传递参数和按地址传递参数两种方式有哪些不同点?

(7)为什么在递归深度较深时递归调用的时间开销和空间开销都会较大? (8)为什么数据在存储器中最好按地址对齐方式存放? (9)造成缓冲区溢出的根本原因是什么?

3. 对于以下AT&T格式汇编指令,根据操作数的长度确定对应指令助记符中的长度后缀,并说明每个操作数的寻

址方式。

(1)mov 8(?p, ?x, 4), %ax (2)mov %al, 12(?p) (3)add ( , ?x,4), ?x (4)or (?x), %dh (5)push $0xF8

(6)mov $0xFFF0, êx (7)test %cx, %cx

(8)lea 8(?x, %esi), êx

4. 使用汇编器处理以下各行AT&T格式代码时都会产生错误,请说明每一行存在什么错误。 (1)movl 0xFF, (êx) (2)movb %ax, 12(?p) (3)addl ìx, $0xF0

(4)orw $0xFFFF0, (?x) (5)addb $0xF8, (%dl)

(6)movl %bx, êx (7)andl %esi, %esx

(8)movw 8(?p, , 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 char int int short unsigned char char int dst_type int char unsigned int unsigned unsigned int 机器级表示

6. 假设某个C语言函数func的原型声明如下:

void func(int *xptr, int *yptr, int *zptr);

函数func的过程体对应的机器级代码用AT&T汇编形式表示如下:

1 movl 8(?p), êx 2 movl 12(?p), ?x 3 movl 16(?p), ìx 4 movl (?x), íx 5 movl (ìx), %esi 6 movl (êx), íi 7 movl íi, (?x) 8 movl íx, (ìx) 9 movl %esi, (êx)

请回答下列问题或完成下列任务。

(1)在过程体开始时三个入口参数对应实参所存放的存储单元地址是什么?(提示:当前栈帧底部由帧指针寄存器EBP指示)

(2)根据上述机器级代码写出函数func的C语言代码。

7. 假设变量x和y分别存放在寄存器EAX和ECX中,请给出以下每条指令执行后寄存器EDX中的结果。

(1)leal (êx), íx

(2)leal 4(êx, ìx), íx (3)leal (êx, ìx, 8), íx (4)leal 0xC(ìx, êx, 2), íx

(5)leal ( , êx, 4), íx (6)leal (êx, ìx), íx

8. 假设以下地址以及寄存器中存放的机器数如表3.13所示。

地址 0x8049300 0x8049400 0x8049384 0x8049380 机器数 0xfffffff0 0x80000008 0x80f7ff00 0x908f12a8 表3.13 题8用表 寄存器 EAX EBX ECX EDX 机器数 0x08049300 0x00000100 0x00000010 0x00000080 分别说明执行以下指令后,哪些地址或寄存器中的内容会发生改变?改变后的内容是什么?条件标志OF、SF、ZF和CF会发生什么改变? (1)addl (êx), íx

(2)subl (êx, ?x), ìx (3)orw 4(êx, ìx, 8), %bx (4)testb $0x80, %dl

(5)imull $32, (êx, íx) (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 2 3 4 5 6 7 8 9 10.

movl sall movl movl imull movl andl addl subl

12(?p), ìx $8, ìx

8(?p), êx 20(?p), íx íx, êx 16(?p), íx $65520, íx ìx, íx íx, êx

假设函数product的C语言代码如下,其中num_type是用typedef声明的数据类型。

1 void product(num_type *d, unsigned x, num_type y ) { 2 *d = x*y; 3 }

函数product的过程体对应的主要汇编代码如下: 1 2

movl movl

12(?p), êx 20(?p), ìx

3 imull êx, ìx 4 mull 16(?p) 5 leal (ìx, íx), íx 6 movl 8(?p), ìx 7 movl êx, (ìx) 8 movl íx, 4(ìx)

请给出上述每条汇编指令的注释,并说明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

(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指令的地址是什么?

xxxxxxx: 7e 16 jle 80492e0 xxxxxxx: 89 d0 mov íx, êx

(4)已知jmp指令的转移目标地址采用相对寻址方式,jmp指令操作码为11101001,其转移目标地址是什么?

8048296: 804829b:

e9 00 ff ff ff 29 c2

jmp xxxxxxx sub êx, íx

12.已知函数comp的C语言代码及其过程体对应的汇编代码如下:

1 void comp(char x, int *p) 2 {

3 if (p && x<0) 4

*p += x;

5 }

1 movb 8(?p), %dl 2 movl 12(?p), êx 3 testl êx, êx 4 je .L1 5 testb $0x80, %dl 6 je .L1

7 addb %dl, (êx) 8 .L1:

要求回答下列问题或完成下列任务。

(1)给出每条汇编指令的注释,并说明为什么C代码只有一个if语句而汇编代码有两条条件转移指令。 (2)按照书中图3.22给出的“if () goto …”语句形式写出汇编代码对应的C语言代码。

13.已知函数func的C语言代码框架及其过程体对应的汇编代码如下,根据对应的汇编代码填写C代码中缺失的表

达式。

1 int func(int x, int y) 2 { 3 int z = ; 4 if ( ) { 5 if ( ) 6 z = ; 7 else 8 z = ; 9 } else if ( ) 10 z = ; 11 return z; 12 }

14.已知函数do_loop的C语言代码如下:

1 short do_loop(short x, short y, short k) { 2 do { 3 x*=(y%k) ; 4 k--; 5 } while ((k>0) && (y>k)); 6 return x; 7 }

函数do_loop的过程体对应的汇编代码如下:1 movw 8(?p), %bx 2 movw 12(?p), %si 3 movw 16(?p), %cx 4 .L1:

5 movw %si, %dx 6 movw %dx, %ax 7 sarw $15, %dx 8 idiv %cx 9 imulw %dx, %bx 10 decw %cx

11 testw %cx, %cx 12 jle .L2

13 cmpw %cx, %si 14 jg .L1 15 .L2:

16 movswl %bx, êx

请回答下列问题或完成下列任务:

1 movl 8(?p), êx 2 movl 12(?p), íx 3 cmpl $-100, êx 4 jg .L1 5 cmpl êx, íx 6 jle .L2

7 addl íx, êx 8 jmp .L3 9 .L2:

10 subl íx, êx 11 jmp .L3 12 .L1:

13 cmpl $16, êx 14 jl .L4 15 andl íx, êx 16 jmp .L3 17 .L4:

18 imull íx, êx 19 .L3: