1-Translate the following C code into IA-64. Your translation must be compliant
ID: 3710902 • Letter: 1
Question
1-Translate the following C code into IA-64. Your translation must be compliant with the gcc compiler
conventions.
long sum(long A[], long size, long i){
if ( i >= size || i < 0)
return 0;
return A[i] + sum(A, size, i+1);
}
long F1(int A[], int size){
long i;
for (i = 0; i < size; i++)
if (i % 2 == 0)
A[i] = i << 2;
else
A[i] = i >> 1;
return sum(A, size, 0);
{
===================
2-Below is the C code and corresponding assembly code:
int a[M][N];
int b[N][M];
int F1(int i, int j) {
a[i][j] = b[j][i];
return(i);
}
F1:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
sall $3, %eax
movl %eax, %ecx
addl 12(%ebp), %ecx
movl 12(%ebp), %edx
movl %edx, %eax
sall %eax
addl %edx, %eax
leal 0(,%eax,4), %edx
addl %edx, %eax
addl 8(%ebp), %eax
movl b(,%eax,4), %eax
movl %eax, a(,%ecx,4)
movl 8(%ebp), %eax
leave
ret
You job is to determine what M and N
M =
N =
(help me to write question 1 code from c code to assembly 64
and in question 2 to find M and N )
(In COMPUTER SYSTEM LANGUAGE)
assembly
Explanation / Answer
************Question 1***************************
long sum(long A[], long size, long i){
if ( i >= size || i < 0)
return 0;
return A[i] + sum(A, size, i+1);
}
long F1(long A[], int size){ //change int[] to long [] else it will through compiler error
long i;
for (i = 0; i < size; i++){
if (i % 2 == 0)
A[i] = i << 2;
else
A[i] = i >> 1;
}
return sum(A, size, 0);//here , it will say "error: cannot convert 'int*' to 'long int*' for argument '1' to 'long int sum(long int*, long int, long int)' "
}
Corresponding Assembly code Below:::::::::::
sum(long*, long, long):
push rbp
mov rbp, rsp
push rbx
sub rsp, 40
mov QWORD PTR [rbp-24], rdi
mov QWORD PTR [rbp-32], rsi
mov QWORD PTR [rbp-40], rdx
mov rax, QWORD PTR [rbp-40]
cmp rax, QWORD PTR [rbp-32]
jge .L2
cmp QWORD PTR [rbp-40], 0
jns .L3
.L2:
mov eax, 0
jmp .L4
.L3:
mov rax, QWORD PTR [rbp-40]
lea rdx, [0+rax*8]
mov rax, QWORD PTR [rbp-24]
add rax, rdx
mov rbx, QWORD PTR [rax]
mov rax, QWORD PTR [rbp-40]
lea rdx, [rax+1]
mov rcx, QWORD PTR [rbp-32]
mov rax, QWORD PTR [rbp-24]
mov rsi, rcx
mov rdi, rax
call sum(long*, long, long)
add rax, rbx
.L4:
add rsp, 40
pop rbx
pop rbp
ret
F1(long*, int):
push rbp
mov rbp, rsp
sub rsp, 32
mov QWORD PTR [rbp-24], rdi
mov DWORD PTR [rbp-28], esi
mov QWORD PTR [rbp-8], 0
.L9:
mov eax, DWORD PTR [rbp-28]
cdqe
cmp QWORD PTR [rbp-8], rax
jge .L6
mov rax, QWORD PTR [rbp-8]
and eax, 1
test rax, rax
jne .L7
mov rax, QWORD PTR [rbp-8]
lea rdx, [0+rax*8]
mov rax, QWORD PTR [rbp-24]
add rax, rdx
mov rdx, QWORD PTR [rbp-8]
sal rdx, 2
mov QWORD PTR [rax], rdx
jmp .L8
.L7:
mov rax, QWORD PTR [rbp-8]
lea rdx, [0+rax*8]
mov rax, QWORD PTR [rbp-24]
add rax, rdx
mov rdx, QWORD PTR [rbp-8]
sar rdx
mov QWORD PTR [rax], rdx
.L8:
add QWORD PTR [rbp-8], 1
jmp .L9
.L6:
mov eax, DWORD PTR [rbp-28]
movsx rcx, eax
mov rax, QWORD PTR [rbp-24]
mov edx, 0
mov rsi, rcx
mov rdi, rax
call sum(long*, long, long)
leave
ret
************Question 2***************************
int a[M][N];
int b[N][M];
int F1(int i, int j) {
a[i][j] = b[j][i];
return(i);
}
We have to declare the value of M & N before using them.
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.