第三章习题-ddg-

发布时间 : 星期二 文章第三章习题-ddg- 更新完毕开始阅读

5 .L3: 6 movl íi, êx 7 andl íx, êx 8 xorl êx, %esi 9 movl ìx, ?x 10 shrl %bl, íi 11 testl íi, íi 12 jne .L3 13 movl %esi, êx

上述代码根据以下lproc函数的C代码编译生成: 1 2 3 4 5 6 7 8

int {

lproc(int x, int k)

int val = ; int i;

for (i= ; i ; i = ) { val ^= ; }

return val;

9 }

回答下列问题或完成下列任务。 (1)给每条汇编指令添加注释。

(2)参数x和k分别存放在哪个寄存器中?局部变量val和i分别存放在哪个寄存器中? (3)局部变量val和i的初始值分别是什么? (4)循环终止条件是什么?循环控制变量i是如何被修改的? (5)填写C代码中的缺失部分。

32.假设你需要维护一个大型C语言程序,其部分代码如下:

1 typedef struct { 2 unsigned l_data; 3 line_struct x[LEN]; 4 unsigned r_data; 5 } str_type; 6 7 void proc(int i, str_type *sptr) { 8 unsigned val = sptr->l_data + sptr->r_data; 9 line_struct *xptr = &sptr->x[i]; 10 xptr->a[xptr->idx] = val; 11 }

编译时常量LEN以及结构类型line_struct的声明都在一个你无权访问的文件中,但是,你有代码的.o版本

(可重定位目标)文件,通过OBJDUMP 反汇编该文件后,得到函数proc对应的反汇编结果如下,根据反汇编结果推断常量LEN的值以及结构类型line_struct的完整声明(假设其中只有成员a和idx)。

1 00000000 : 2 0: 55 3 1: 89 e5 4 3: 53 5 4: 8b 45 08 6 7: 8b 4d 0c 7 a: 6b d8 1c 8 d: 8d 14 c5 00 00 00 00 9 14: 29 c2 10 16: 03 54 19 04 11 1a: 8b 81 c8 00 00 00 12 20: 03 01 13 22: 89 44 91 08 14 26: 5b 15 27: 5d 16 28: c3

push mov push mov mov imul lea sub add mov add mov pop pop ret

?p

%esp, ?p ?x

0x8(?p), êx 0xc(?p), ìx $0x1c, êx, ?x 0x0(, êx, 8), íx êx, íx

0x4(ìx, ?x, 1), íx 0xc8(ìx), êx (ìx), êx

êx, 0x8(ìx, íx, 4) ?x ?p

33.假设嵌套的联合数据类型node声明如下: 1 union node { 2 struct { 3 int *ptr; 4 int data1; 5 } n1; 6 struct { 7 int data2; 8 union node *next; 9 } n2; 10 }; 有一个进行链表处理的过程chain_proc的部分C代码如下:

1 void chain_proc(union node *uptr) {

2 uptr-> = *(uptr-> ) – uptr-> ; 3 }

过程chain_proc的过程体对应的汇编代码如下: 1 movl 8(?p), íx 2 movl 4(íx), ìx 3 movl (ìx), êx 4 movl (êx), êx 5 subl (íx), êx 6 movl êx, 4(ìx)

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

(1)node类型中结构成员n1.ptr、n1.data1、n2.data2、n2.next的偏移量分别是多少? (2)node类型总大小占多少字节?

(3)根据汇编代码写出chain_proc的C代码中缺失的表达式。

34.以下声明用于构建一棵二叉树: 1 typedef struct TREE *tree_ptr; 2 struct TREE { 3 tree_ptr left; 4 tree_ptr right; 5 long val;

6 } ; 有一个进行二叉树处理的函数trace的原型为“long trace( tree_ptr tptr) ;”,其过程体对应的x86-64汇编代

码(64位版本)如下: 1 trace: 2 movl $0, êx 3 testq %rdi, %rdi 4 je .L2 5 .L3: 6 movq 16(%rdi), %rax 7 movq (%rdi), %rdi 8 testq %rdi, %rdi 9 jne .L3 10 .L2: 11 rep //在此相当于空操作指令,避免使ret指令作为跳转目的指令 12 ret

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

(1)函数trace的入口参数tptr通过哪个寄存器传递? (2)写出函数trace完整的C语言代码。 (3)说明函数trace的功能。

联系合同范文客服:xxxxx#qq.com(#替换为@)