C to assembly: loops, structs and arrays

We have covered the C calling convention, frame pointers and the assembly code in the previous article. This article will focus on the code generation for:

C to assembly for loops, structure access and array indexing

Code generation for a "while" loop

The following example shows the code generation for a simple while loop. Also note that the function shown below does not use a frame pointer as this function does not have local variables. Since the FRAME_POINTER register is not used, parameter access is carried out by directly taking offsets from the STACK_POINTER register.

Code generation for a while loop

Code generation for a "for" loop

Code generation for the for loop is covered in the example given below.

Code generation for a for loop

Code generation for structure access

The code generation for C structure access is covered here. The example shows the filling of a message structure. This function does not have LINK and UNLK as the local variable p_msg has been assigned to a register, so no space needs to be allocated for local variables on the stack.

Code generation for structure access

Code generation for array indexing

The code below shows an instance of array indexing. The generated code is very inefficient because it leads to a multiply by structure size. This overhead can also be reduced by making the size of the structure a power of 2, i.e. 2, 4, 8, 16 etc. In such cases the compiler would replace the multiply with a shift instruction.

Code generation for array indexing

Most compilers will optimize the above code by directly incrementing the pointer in a loop. The optimized code and the generated assembly code are shown below. This optimization really speeds up array indexing in a loop as multiply/shifts are avoided.

Code generation for array indexing (optimized)

Explore more