(1)考虑下面这个for循环的汇编代码
looper:
pushl%ebp
movl%esp, %ebp
subl$16, %esp
movl$0, -8(%ebp)
movl$0, -4(%ebp)
jmp.L2
.L4:
movl-4(%ebp), %eax
sall$2, %eax
addl12(%ebp), %eax
movl(%eax), %eax
cmpl-8(%ebp), %eax
jle.L3
movl-4(%ebp), %eax
sall$2, %eax
addl12(%ebp), %eax
movl(%eax), %eax
movl%eax, -8(%ebp)
.L3:
addl$1, -8(%ebp)
addl$2, -4(%ebp)
.L2:
movl-4(%ebp), %eax
cmpl8(%ebp), %eax
jl.L4
movl-8(%ebp), %eax
leave
ret
根据以上的汇编代码,完成相应的for循环C程序代码(注意该程序有返回值)。
int looper(int n, int *a)
{
int i;
int x=0;
for(i= 0 ; i
{______________________________________
if(a[i]>x)//2分
x=a[i];// 2分
x++;//1分
}______________________________________
return x;// 1分
}
(2)
根据已有的结构(structure)和联合(union)的声明以及C函数void test(int i, s2 *bp)的IA32 汇编代码,推断出结构s1的完整声明和s2中CNT的值;之后再根据推断结果以及IA32汇编代码,推断补齐相应的C程序代码。
下面是要使用到的结构和联合的声明,函数void test(int i, s2 *bp)及其IA32 汇编代码。
struct s1 { struct s2 { union u1 {
int left; struct s1 *h;
s1 a[CNT]; struct s2 *i;
int right; char j;
}; union u1 b;};
char c;
};
void test(int i, s2 *bp)
{
int n=bp->left+bp->right;
s1 *ap=&bp->a[i];
ap->x[ap->idx]=n;
}
其IA32汇编代码为:
test:
pushl%ebp
movl%esp, %ebp
subl$16, %esp
movl12(%ebp), %eax
movl(%eax), %edx
movl12(%ebp), %eax
movl184(%eax), %eax
leal(%edx,%eax), %eax
movl%eax, -4(%ebp)
movl12(%ebp), %eax
leal4(%eax), %ecx
movl8(%ebp), %edx
movl%edx, %eax
sall$2, %eax
addl%edx, %eax
sall$2, %eax
leal(%ecx,%eax), %eax
movl%eax, -8(%ebp)
movl-8(%ebp), %eax
movl(%eax), %edx
movl-8(%ebp), %eax
movl-4(%ebp), %ecx
movl%ecx, 4(%eax,%edx,4)
leave
ret
1. CNT=___9_____//2分
2. 写出s1的完整声明。
____struct s1{
int idx;//2分
int x[4];//2分
___}____________________________________
____________________