I need to translate this to Y86 code: typedef struct elem { int data; struct ele
ID: 648341 • Letter: I
Question
I need to translate this to Y86 code:
typedef struct elem {
int data;
struct elem *left;
struct elem *right;
} node;
node* search(node *tree, int val) {
if(!tree) {
return NULL;
}
if(val == tree->data) {
return tree;
} else if(val < tree->data) {
return search(tree->left, val);
} else if(val > tree->data){
return search(tree->right, val);
}
}
void matrix_xor(int size, int A[size][size], int B[size][size], int C[size][size]) {
int i, j, k, sum;
for(i=0;i<size;i++){
for(j=0;j<size;j++){
sum=0;
for(k=0;k<size;k++)
sum=sum+(A[i][k]^B[k][j]);
C[i][j]=sum;
}
}
}
Explanation / Answer
s i m p l e :
p u s h l %ebp # s a v e f rame p o i n t e r
r rm o v l %esp , %ebp # c r e a t e new f rame p o i n t e r
mrmovl 8(%ebp ) , %edx # g e t xp
mrmovl 0(%edx ) , %ebx # g e t ? xp
mrmovl 12(%ebp ) , %eax # g e t y
a d d l %ebx , %eax # t = ? xp + y
rmmovl %eax , 0(%edx ) # s t o r e i n ? xp
p o p l %ebp # r e s t o r e f rame p o i n t e r
r e t # r e t u r n t o c a l l e r
s i m p l e :
p u s h l %ebp
r rm o v l %esp , %ebp
mrmovl 8(%ebp ) , %edx
mrmovl 0(%edx ) , %ebx
mrmovl 12(%ebp ) , %e ax
a d d l %ebx , %e ax
rmmovl %eax , 0(%edx )
p o p l %ebp
r e t
l e n 2 : p u s h l %ebp # s a v e f r ame p o i n t e r
r rm o v l %esp , %ebp # c r e a t e new f r ame p o i n t e r
mrmovl 8(%ebp ) , %edx # g e t a
mrmovl 0(%edx ) , %e ax # g e t ?a
x o r l %ecx , %e cx # l e n = 0
jmp L26
L24 : mrmovl 0(%edx ) , %e ax # g e t ?a
i r m o v l $1 , %e s i
a d d l %e s i , %e cx # l e n++
L26 : i r m o v l $4 , %e s i
a d d l %e s i , %edx # a++
a n d l %eax , %e ax # ?a == 0?
j n e L24
r rm o v l %ecx , %e ax # t h e r e t u r n v a l u e
r rm o v l %ebp , %e s p # c l e a n f r ame
p o p l %ebp # r e s t o r e f r ame p o i n t e r
r e t # r e t u r n t o c a l l e r
s i m p l e :
p u s h l %ebp # s a v e f rame p o i n t e r
r rm o v l %esp , %ebp # c r e a t e new f rame p o i n t e r
mrmovl 8(%ebp ) , %edx # g e t xp
mrmovl 0(%edx ) , %ebx # g e t ? xp
mrmovl 12(%ebp ) , %eax # g e t y
a d d l %ebx , %eax # t = ? xp + y
rmmovl %eax , 0(%edx ) # s t o r e i n ? xp
p o p l %ebp # r e s t o r e f rame p o i n t e r
r e t # r e t u r n t o c a l l e r
s i m p l e :
p u s h l %ebp
r rm o v l %esp , %ebp
mrmovl 8(%ebp ) , %edx
mrmovl 0(%edx ) , %ebx
mrmovl 12(%ebp ) , %e ax
a d d l %ebx , %e ax
rmmovl %eax , 0(%edx )
p o p l %ebp
r e t
l e n 2 : p u s h l %ebp # s a v e f r ame p o i n t e r
r rm o v l %esp , %ebp # c r e a t e new f r ame p o i n t e r
mrmovl 8(%ebp ) , %edx # g e t a
mrmovl 0(%edx ) , %e ax # g e t ?a
x o r l %ecx , %e cx # l e n = 0
jmp L26
L24 : mrmovl 0(%edx ) , %e ax # g e t ?a
i r m o v l $1 , %e s i
a d d l %e s i , %e cx # l e n++
L26 : i r m o v l $4 , %e s i
a d d l %e s i , %edx # a++
a n d l %eax , %e ax # ?a == 0?
j n e L24
r rm o v l %ecx , %e ax # t h e r e t u r n v a l u e
r rm o v l %ebp , %e s p # c l e a n f r ame
p o p l %ebp # r e s t o r e f r ame p o i n t e r
r e t # r e t u r n t o c a l l e r