The purpose of this project is to gain a greater understanding of the Intel 32-bit instruction set and understand how a compiler translates C code into assembly language. By compiling the program in unoptimized mode you will hopefully see a fairly clear translation. When running in optimization mode, you will see how well compilers can optimize your code. To compile an unoptimized version use: gcc -Wa,-adhln -g -masm=intel -m32 "Project 2.c" > "Project 2.asm" To compile an optimized version use: gcc -Wa,-adhln -O -masm=intel -m32 "Project 2.c" > "Project 2-o.asm" The -Wa,-adhln option causes gcc to generate intermixed source and assembly code. The -masm=intel option causes gcc to generate assembly code in intel format. The -m32 generates 32-bit code. The -g option generates unoptimized code while -O generates optimized code. The generated code includes quite a few directives that can be ignored. Most of the directives begin with a period (.). There are also a few call instructions to procedures that you may not know what they mean that can be ignored. For example: call __x86.get_pc_thunk.bx add ebx, OFFSET FLAT:_GLOBAL_OFFSET_TABLE_ The following questions should be answered using the unoptimized code. In detail explain the code generated for line 82 (k = function1(i, j);). For this and all further questions in which you are asked to explain the code generated in detail, I expect you to copy the generated code and add a comment for each line. For example: 006e C745FC00 mov DWORD PTR -4[ebp], 0 ; initialize i In detail explain the code generated for function2 (line 28 through 39). The following questions should be answered using the optimized code. In detail explain the code generated for function1. How are function calls optimized? The following questions should be answered using by comparing the unoptimized code and the optimized code. Compare the code generated by function4 in the unoptimized and optimized versions. Explain the optimizations. C code. Need to optimized and unpotimized versions that show the assembly language. /* Project 2 */ /* GCC */ /* gcc -Wa,-adhln -g -masm=intel -m32 "Project 2.c" > "Project 2-g.asm" */ /* gcc -Wa,-adhln -O -masm=intel -m32 "Project 2.c" > "Project 2-o.asm" */ #include #define NOINLINE __attribute__ ((noinline)) static NOINLINE int function1(int x, int y) { int i; int sum; int values[10]; sum = 0; for (i = 0; i < 10; i++) { values[i] = 10 * i + x * y; sum += values[i]; } return (sum); } 28. static int NOINLINE function2(int *values, int valuesLen) { int i; int sum; sum = 0; for (i = 0; i < valuesLen; i++) { sum += values[i]; } 39. return (sum); } static NOINLINE int function3(int x) { int y; y = x / 10; return (y); } static NOINLINE int function4(int a, int b, int c, int d) { int r; if (a > b) r = a; else if (a > c) r = 2 * a; else if (a > d) r = 3 * a; else r = -1; return (r); } int main(int argc, char **argv) { int i; int j; int k; int values[10]; i = 1; j = 2; 82. k = function1(i, j); printf("function1: i = %d, j = %d, k = %d\n", i, j, k); for (i = 0; i < 10; i++) { values[i] = i; } k = function2(values, 10); printf("function2: k = %d\n", k); k = function3(100); printf("function3: k = %d\n", k); k = function4(1, 2, 3, 4); printf("function4: k = %d\n", k); return (0); } I have labeled some lines of code
The purpose of this project is to gain a greater understanding of the Intel 32-bit instruction set and understand how a compiler translates C code into assembly language. By compiling the
To compile an unoptimized version use:
gcc -Wa,-adhln -g -masm=intel -m32 "Project 2.c" > "Project 2.asm"
To compile an optimized version use:
gcc -Wa,-adhln -O -masm=intel -m32 "Project 2.c" > "Project 2-o.asm"
The -Wa,-adhln option causes gcc to generate intermixed source and assembly code.
The -masm=intel option causes gcc to generate assembly code in intel format.
The -m32 generates 32-bit code.
The -g option generates unoptimized code while -O generates optimized code.
The generated code includes quite a few directives that can be ignored. Most of the directives begin with a period (.). There are also a few call instructions to procedures that you may not know what they mean that can be ignored. For example:
call __x86.get_pc_thunk.bx
add ebx, OFFSET FLAT:_GLOBAL_OFFSET_TABLE_
The following questions should be answered using the unoptimized code.
In detail explain the code generated for line 82 (k = function1(i, j);). For this and all further questions in which you are asked to explain the code generated in detail, I expect you to copy the generated code and add a comment for each line. For example:
006e C745FC00 mov DWORD PTR -4[ebp], 0 ; initialize i
- In detail explain the code generated for function2 (line 28 through 39).
The following questions should be answered using the optimized code.
- In detail explain the code generated for function1.
- How are function calls optimized?
The following questions should be answered using by comparing the unoptimized code and the optimized code.
- Compare the code generated by function4 in the unoptimized and optimized versions. Explain the optimizations.
C code. Need to optimized and unpotimized versions that show the assembly language.
/* Project 2 */
/* GCC */
/* gcc -Wa,-adhln -g -masm=intel -m32 "Project 2.c" > "Project 2-g.asm" */
/* gcc -Wa,-adhln -O -masm=intel -m32 "Project 2.c" > "Project 2-o.asm" */
#include <stdio.h>
#define NOINLINE __attribute__ ((noinline))
static NOINLINE int function1(int x, int y)
{
int i;
int sum;
int values[10];
sum = 0;
for (i = 0; i < 10; i++) {
values[i] = 10 * i + x * y;
sum += values[i];
}
return (sum);
}
28. static int NOINLINE function2(int *values, int valuesLen)
{
int i;
int sum;
sum = 0;
for (i = 0; i < valuesLen; i++) {
sum += values[i];
}
39. return (sum);
}
static NOINLINE int function3(int x)
{
int y;
y = x / 10;
return (y);
}
static NOINLINE int function4(int a, int b, int c, int d)
{
int r;
if (a > b)
r = a;
else if (a > c)
r = 2 * a;
else if (a > d)
r = 3 * a;
else
r = -1;
return (r);
}
int main(int argc, char **argv)
{
int i;
int j;
int k;
int values[10];
i = 1;
j = 2;
82. k = function1(i, j);
printf("function1: i = %d, j = %d, k = %d\n", i, j, k);
for (i = 0; i < 10; i++) {
values[i] = i;
}
k = function2(values, 10);
printf("function2: k = %d\n", k);
k = function3(100);
printf("function3: k = %d\n", k);
k = function4(1, 2, 3, 4);
printf("function4: k = %d\n", k);
return (0);
}
I have labeled some lines of code
Trending now
This is a popular solution!
Step by step
Solved in 2 steps
In detail explain the code generated for function2 (line 28 through 39).