ABI Compliance
-
Write a program with a global variable named
my_var
of type int (32 bits), initialized with the value 10 and a functionvoid increment_my_var()
that increments 1 to this global variable. -
Write a program that uses only caller-save registers and the sp and ra registers, it must have a function called 'my_function' that receives three values and does the following:
-
Computes the sum of the first two values:
SUM 1
-
Calls a function called
mystery_function
passingSUM 1
and the first value as parameters in this order:CALL 1
-
Computes the difference between the second value and the returned value of the
mystery_function
(CALL 1
):DIFF 1
-
Sums the third value to the difference (
DIFF 1
):SUM 2
-
Calls
mystery_function
again passing the sum above (SUM 2
) and the second value as parameters in this order:CALL 2
-
Computes the difference between the third value and the returned value of the
mystery_function
above (CALL 2
):DIFF 2
-
Sums the difference above (
DIFF 2
) withSUM 2
:SUM 3
-
Returns
SUM 3
-
The C code below exemplifies these steps
int my_function(int a, int b, int c){ int aux = b - mystery_function(a+b, a) + c; return c - mystery_function(aux, b) + aux; };
-
-
Convert the following C function to assembly code. Note:
char
andshort
values are extended to 32 bits when stored in the program stack.int operation(){ int a = 1; int b = -2; short c = 3; short d = -4; char e = 5; char f = -6; int g = 7; int h = -8; char i = 9; char j = -10; short k = 11; short l = -12; int m = 13; int n = -14; return mystery_function(a, b, c, d, e, f, g, h, i, j, k, l, m, n); }
-
Convert the following C function to assembly code. Note:
char
andshort
values are extended to 32 bits when stored in the program stack.int operation(int a, int b, short c, short d, char e, char f, int g, int h, char i, char j, short k, short l, int m, int n){ return b + c - f + h + k - m; };
-
Convert the following C function to assembly code.
int operation(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m, int n){ return mystery_function(n, m, l, k, j, i, h, g, f, e, d, c, b, a); };