Exercise 6            Name       _________________    Points __/20

Give the corresponding Assembly code to do the following.
1. (8 pt)    void f1(int X[], int n) {
                for(int i=0; i<n; i++)
                    X[i] = X[i]*2;

             }

 

.data
      A dword 8, 3, 2, 7, 9
.code
f1   proc       C, X:ptr dword, n:dword
      local       i:dword
      mov       eSi, X
      mov       i, 0
  @for:
      mov       eBx, n
      cmp       i, eBx
      jl           @do
      jmp       @endfor
  @do:
      mov       eBx, i
      mov       eAx, [eSi+eBx*4]
      mov       eCx, 2
      iMul        eCx
      mov       [eSi+eBx*4], eAx
      inc          i
      jmp       @for
 @endfor:
      ret 
f1 endp
2. (2 pt)    int A[] = {8, 3, 2, 7, 9};

             f1(A, 5);

 

invoke f1, addr A, 5
 
3. (5 pt)    int gcd(a, b) {
               if (b == 0)
                  return a;
               else
                  return gcd(b, a mod b);
             }
.code
gcd       proc C, a:dword, b:dword
  .IF b == 0
      mov       eAx, a
  .ELSE
      mov       eAx, a
      mov       eDx, 0
      div         b
      invoke   gcd, b, eDx
  .ENDIF
      ret 
gcd endp

main   proc
          invoke gcd, 18, 15
          exit
main  endp
         end main
4. (5 pt)    int f3(int X[], int n) {
                if( n < 0)
                   return 0;
                else
                   return f3( X, n-1) + X[n];
             }
 .data
	A	dword	8,7,6,5,4,3,2,1
.code
f3	proc	C, X:ptr dword, n:sdword
	.IF	n<0
		mov		eAx, 0
	.ELSE
		mov		eCx, n
		dec		eCx
		invoke		f3, X, eCx
		mov		eSi, X
		mov		eBx, n
		add		eAx, [eSi+eBx*4]
	.ENDIF
		ret
f3	endp

main	proc
	invoke	f3, addr A, 7
	exit
main	endp
	end	main