1. Consider the following assembly code: // x at %ebp + 8, n at %ebp + 12 movl m
ID: 3589616 • Letter: 1
Question
1. Consider the following assembly code: // x at %ebp + 8, n at %ebp + 12 movl movl movl movl 8(%ebp ) , %esi 12 ( %ebp ) , %ebx $-1, %edi $1, %eax 5.L2 movl and1 xor1 movl sall %edx , %eax %esi, %eax %eax , %edi %ebx, %ecx %cl, %edx 10 11 test1%edx ,%edx 12 jne L2 13 movl %edi,eax The preceding code was generated by compiling C code that had the following overall form int loop(int x, int n) int result = int mask; for (mask - -; mask ; mask = result return result; Your task is to fill in the missing parts of the C code to get a program equivalent to the generated assembly code. Recall that the result of the function is returned in register eax You will find it helpful to examine the assembly code before, during, and after the loop to form a consistent mapping between the registers and the program variables A. Which registers hold program values x, n, result, and mask? B. What are the initial values of result and mask? C. What is the test condition for mask? D. How does mask get updated? E. How does result get updated? F. Fil in all the missing parts of the C codeExplanation / Answer
Solution:
A. Which registers hold program values x, n, result, and mask?
| Variable| | Register |
result.
F. Fill in all the missing parts of the code.
long loop(long x, long n) {
long result= -1;
I hope this helps if you find any problem. Please comment below. Don't forget to give a thumbs up if you liked it. :)
A. Which registers hold program values x, n, result, and mask?
| Variable| | Register |
| x | ---> | %esi | | n | ---> | %ebx | | result| ---> | %edi | | mask | ---> | %edx | B. What are the initial values of result and mask? The initial value for result is -1 and the initial value for mask is 1 C. What is the test condition for mask? The condition that test mask is mask not equal to zero(mask not zero). D. How does mask get updated? The mask value is holds by the register %edx, therefore mask get updated every time %edx is shifted to the left by n bits in line 10, test the instruction in line 11 only changes the flags and does not change the register value. E. How does result get updated? The result is updated Bitwise applied on mask and x and the result XORed withresult.
F. Fill in all the missing parts of the code.
long loop(long x, long n) {
long result= -1;
long mask; for (mask =1; mask !=0; mask = mask<<n) { result ^= (mask & x); } return result; }I hope this helps if you find any problem. Please comment below. Don't forget to give a thumbs up if you liked it. :)
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.