Assembly Questions 12 Q 1 Consider the following
Assembly Questions 12 תרגול
Q 1 Consider the following assembly representation of a function foo containing a for loop
Q 1 Fill in the blanks to provide the functionality of the loop int foo(int a) { int i; int result = _______; for( ________; i++) { __________________; } return result; }
Answer int foo(int a) { int i; int result = a + 2; for (i=0; i < a; i++) { result += (i + 5); result *= (i + 3); } return result; }
Q 2 Which of the functions compiled into the assembly code shown?
Q 3
Q 3 Is the variable val stored on the stack? If so, at what byte offset(relative to %ebp) is it stored, and why is it necessary to store it on the stack? answer: yes, -4, Need to pass pointer to it to recursive call Is the variable val 2 stored on the stack? If so, at what byte offset(relative to %ebp) is it stored, and why is it necessary to store it on the stack? answer: no
Q 3 What (if anything) is stored at -24(%ebp)? If something is stored there, why is it necessary to store it? answer: the value of %ebx is saved here, because %ebx is a callee-save register What (if anything) is stored at -8(%ebp)? If something is stored there, why is it necessary to store it? answer: nothing is stored here.
Q 4 Optimized the following Assembly code as much as possible: movl $0, %eax movl $0, %edx movl 8(%ebp), %ebx. L 1: cmpl %eax, %ebx jle. L 2 movl 12(%ebp), %ecx addl %eax, %ecx addl %ecx, %edx incl %eax jmp. L 1. L 2: movl %edx, %eax
Q 4 The small and obvious things: Replace all movl $0 with xorl. Instead of using both %eax and %ebx – we can initialized %eax to 8(%ebp) and reduce it till we get zero (save the need in a saved register!) We can read the value of 12(%ebp) outside the loop and increased it by one instead of adding the index. The big improvement: Notice we are calculating the sum of an Arithmetic Series. Therefore, instead of using loops we can just calculate the formula – a much more efficient solution!
Q 5 We are sending an ASCII file over the net from computer A to computer B. Will it always be possible for computer B to read the file while knowing nothing on computer A? Same as before only now we are sending a different file coded using the utf-8 coding?
Q 5 Yes. In ASCII files each character is coded using one byte. Therefore, computer B doesn’t care if computer A use big or little endians. No. In UTF-8, some of the characters need more then one byte and then computer B must know if computer A use big or little endians.
Q 6 Computer A runs program gcc in 3. 2 seconds. Computer B runs the same program in 2. 9 seconds. Which computer has better performance and by how much? What about computer C, which runs the program in 3. 1 seconds?
Q 6 Performance is relative so we want to measure PB/PA which is the inverse of CPUTA/CPUTB = 3. 2/2. 9 = 1. 103. Thus the performance of computer B is 10% better that computer A. Computer C is 3% (3. 2/3. 1 = 1. 03) better than computer A. And computer B is 7% (3. 1/2. 9 = 1. 07) faster than computer C.
Q 7 You are given the next number in binary representation: 11000000000000000 What is its value if it is: An unsigned int. A float.
Q 7 float = 1 10000000 0100000000000 (-1)1*(1 +. 01)*2(128 -127) = -(1 + 0. 25)*21 = -1. 25*2 = -2. 5 unsigned = 11000000000000000 = (231 + 230 + 221) = 2147483648 + 1073741824 + 2097152 = 3, 223, 322, 624
Q 8 Transfer the next C function info Assembly code: (don’t forget comments!) void swap(int* a, int* b) { int temp; temp = *a; *a = *b; *b = temp; } Answer: many possible solutions
Q 9 What does the spatial locality principal say? What do we use MUXes for? What is the ALU?
Q 10 What is CPI and what is the difference between CPI and CPE Latency and Throughput Data hazards / Control hazzards Stalling / forwarding / load-use hazard Branch prediction
- Slides: 19