Assignment #4: Intel x86 Assembly, Conditionals, and Loops

Assigned: Friday, Mar. 20
Due: Friday, Mar. 27   Monday, Mar. 30 by midnight

Contents:


Overview

Topic: The Intel x86 ISA, x86 Assembly Programming, Conditionals (if-then-else), and Loops (while, for, and do-while)
Related Reading: Chapter 3 and class notes


Practice Problems

Practice problems from the textbook (answers are at the end of the chapter):


Problems to be Submitted (25 points)

When you turn in your assignment, you must include a signed cover sheet (PDF version) with your assignment (you're assignment will not be graded without a completed cover sheet).

You are allowed to submit your assignment via email, but if you choose to do so, you must bring a hardcopy of your assignment along with a completed cover sheet to the instructor at the next class. (Note: Do not email the instructor any .zip file attachments, as SLU's email may not accept these emails; i.e. the instructor may not receive your email.)

  1. (5 points)

    Given the following C code:

             if (a - 3 > b)
    	     c = a + 7;
    	 else if (b > (c & 7))
                 c = b >> 3;
    	 else
    	     c = -1;
    

    Given the equivalent Intel x86 assembly code.

    Assume that: variables a, b, and c are in registers %eax, %ebx, and %ecx, respectively.

  2. (5 points)

    Given the following assembly program, hw4_prob2.s, determine the equivalent C code corresponding to the procedure hw4_prob2(), and fill in the blanks below:

    Note 1: These blanks may include assignment statements and/or other conditional (if-then-else) statements. Also, you may not need to use all the blanks (in the conditional's true and false code bodies).

    Note 2: This file can be downloaded along with a Makefile in hw4_code.zip.

        int hw4_prob2 (int x, int y)
        {
            int result = ________________________________________;
    
            if (( x ___________________________) || ( ___________________________))
            {
                _________________________________________________;		// one or more of these lines will start with:   result = 
    
                _________________________________________________;
    
                _________________________________________________;
    
                _________________________________________________;
    
                _________________________________________________;
            }
            else
            {
                _________________________________________________;		// one or more of these lines will start with:   result = 
    
                _________________________________________________;
    
                _________________________________________________;
    
                _________________________________________________;
    
                _________________________________________________;
            }
    
            return result;
        }
    

  3. (5 points)

    Problem 3.56 at the end of Chapter 3 (p. 296).

  4. (5 points)

    Given the following x86 assembly code that sums the numbers from 1 to N:

          movl  $0, %eax			# %eax:  sum = 0
          movl  $1, %ecx			# %ecx:  i = 1
    
          LOOP:
    	 addl  %ecx, %eax
             addl  $1, %ecx
    
             cmpl  %edi, %ecx
             jle   LOOP
    
          LOOP_EXIT:
    	 ...
    

    Note: The variables of i, N, and sum are stored in registers %ecx, %edi, and %eax, respectively.

    1. What one line would you need to add and/or change in order to sum the following number sequence?
             1 4 7 10 13 16 19 22 25 28 ...

    2. What two lines (of the original code) would you need to add and/or change in order to compute the factorial of N?

    3. What one line lines (of the original code) would you need to add and/or change in order to compute the sum of squares from 1 to N?
             i.e. 1^2 + 2^2 + 3^2 + 4^2 + 5^2 + ...
                 = 1 + 4 + 9 + 16 + 25 + ...

    4. Add a conditional to the loop that checks if the number is even or odd, and negates the value if it's odd. In essence, this will generate the sum:        -1 + 2 - 3 + 4 - 5 + 6 - 7 + 8 - 9 + ...

      Hint: What one bit in a binary integer representation indicates whether the number is even or odd? And what bit-wise Boolean operation can you use to isolate that number?

  5. (5 points)

    Using the same C program for the Fibonacci sequence as on Exam #1:

          a = 0;			 // F(0)
          b = 1;			 // F(1)
    
          for (i = 2; i < n; i++)
          {
              c = b + a;		 // F(i)
              a = b;
              b = c;
          }
    

    Give the equivalent sequence of assembly instructions for computing the Nth value of the Fibonacci sequence

    1. First, give the equivalent assembly in the form of a WHILE or FOR loop.
    2. Then, give the equivalent assembly in the form of a (converted) DO-WHILE loop.