P112页,第4题
题目
请依据a中的反汇编代码,将b中对应的C语言代码补充完全。
a)
# void cond(int a, int *p)
# a in %edi, p in %esi
cond:
testl %esi, %esi
je .L1
cmpl %edi, (%esi)
jge .L1
movl %edi, (%esi)
.L1:
ret
b)
void cond(int a, int *p)
{
if (p && ______)
______ = ______;
}
答案
b)
void cond(int a, int *p)
{
if (p && *p < a)
*p = a;
}
P112页,第5题
题目
有一段汇编代码如下,试画出其逻辑流程图并写出对应该流程图的C语言goto版本,变量名可自行拟定。
movl 0x0, %eax
cmpl %edx, 0
jz .L2
jg .L1
movl 0xffffffff, %eax
jmp .L2
.L1:
movl 0x1, %eax
.L2:
ret
答案
注:图片来源@Smile_laughter
假设x in eax, y in edx
int func()
{
int x = 0, y;
if (y == 0)
goto L2;
else if (y < 0)
goto L1;
else{
x = -1;
goto L2;
}
L1:
x = 1;
L2:
return x;
}
P112页,第6题
题目
已知有下面一段不完整的C语言代码及其对应的汇编代码,请依据汇编代码将C语言代码填写完整。
C语言代码:
unsigned puzzle(unsigned n)
{
if(_____)
return 1;
else
return 1 + puzzle(_____);
}
汇编代码:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
cmpl $0, 8(%ebp)
jne .L2
movl $1, -4(%ebp)
jmp .L3
.L2:
movl 8(%ebp), %eax
shrl 3, %eax
movl %eax, (%esp)
call puzzle
addl $1, %eax
mov %eax, -4(%ebp)
.L3:
movl -4(%ebp), %eax
leave
ret
答案
unsigned puzzle(unsigned n)
{
if(n == 0)
return 1;
else
return 1 + puzzle(n / 8);
}