Homework 1: Numerical Representations and Disassembly of Object Files
Assigned  Wednesday, January 18, 2017 

Due Date  Monday, January 30, 2017 at 5:00pm (17:00) 
Submissions  Submit a PDF file of your solutions to the course's Assignment Drop Box. 
Introduction
The purpose of written homework assignments is to get you thinking about the topics being covered in lecture and in readings in the textbook that are not represented in the handson, programming lab assignments. These written assignments also better prepare you for exams. It is worth noting that the book contains many practice problems similar to the problems we ask on these written assignments! The solutions for those practice problems are located at the end of each chapter and should give you a feel for the kind of answers we expect you to turn in for these kind of assignments.
Logistics
Please write up your answers one page per problem and submit them as a PDF file in the online dropbox. This simplifies our grading and ensures we read your answers clearly. We recommend that you type up your answers (Word or just plaintext is probably fine) as it ensures we can read them easily, but you may also scan a handwritten assignment and submit it as a PDF, provided it is legible.
We will provide solutions to all of the problems in the written homework assignments in a timely fashion after the assignment is due. This may be around 4 or 5 days after the due date, in general, because some students may use late days.
Make sure you are using the 3rd edition of Computer Systems: A Programmer's Perspective. If you're not using the right book, you might be doing the wrong problems!
Questions
Answer the following problems, some from the 3rd edition of the textbook.

Suppose we are given the task of generating code to multiply integer variable x by various different constant factors K. To be efficient, we want to use only the operations +, , and <<. For the following values of K, write C expressions to perform the multiplication using as few operations as you can:
 K = 21
 K = 15
 K = 42
 Homework Problem 2.82 (pp. 135136), parts A, B, and C.
 Note:
random()
generates a number between 0 and Tmax (not Umax; in other words: 0 to 2^{31}1).  By “describe the underlying mathematical principles” when the given property always holds, we do not mean you need a formal proof, just an informal description of why it works.
 Note:

Consider this Java method, which uses the Java standard library's
Math.abs
for computing the absolute value of anint
:public static void interesting(int x) { if (Math.abs(x) < 0) { System.out.println("absolutely strange"); } }

There is one argument to
interesting
that causes absolutely strange to be printed. What is that argument in binary (base2) and decimal (base10)?  Give code (in C or Java) for how to implement absolute value in a straightforward way (do not use shifts or masks or anything like that).
 Explain how your code in part (b) leads to the behavior observed in part (a). Explain both in terms of “numbers” (you can use base10) and in terms of “bits” what happens when the code executes.

What is the C library function for computing the absolute value of a C
int
and what is its definition when given your answer to part (a)? Feel free to use websearch when answering this part.

There is one argument to
 Recall that a floating point number is of the form:
(1)^{S} x Mantissa x 2^{Exponent}. The mantissa and
exponent refer to the VALUES (not the binary encoding). Also recall that the mantissa ranges from 1.0 to
(almost) 2.0.
Tell us the decimal values of the mantissa and exponent for the (decimal)
number 13.6875 and how this would be
encoded in IEEE 754 representation (32 bits), including the binary
encodings
M
andE
of the representation. (RecallM
= Mantissa  1.0 for normalized numbers.) Your answer should contain these parts and you should show how you calculated each value: Decimal values for Mantissa and Exponent such that (1)^S * Mantissa * 2^Exponent = 13.6875
 Binary values for
M
andE
exactly as they will appear in the full 32bit representation of 13.6875 in IEEE floating point.  The full 32bit IEEE floating point representation (in bits) of 13.6875
 Homework Problem 3.58 (pp. 311). You may use any number of temporary variables in your solution; your code does not have to match up exactly linebyline with the given assembly code. It just needs to be C code that accomplishes the same thing.
 For this problem you will use the jackofalltrades tool
objdump
to examine executable programs on Linux. Be sure to work on this problem on the CSE home VM or attu. You will need a copy of the code that you turned in for Lab 1 (your code does not have to be entirely correct or complete, but at least some of your puzzle functions should be filled in). Run
make
in your Lab 1 directory to build your code. Run the commandobjdump t btest  grep text
and examine the output. What type of thing do some of the strings in the rightmost column of the output represent? (you do not need to identify what all of them refer to)  Use
objdump
to disassemble your btest code (review the lecture slides or check the man page to find the right flag). Find the labels in the assembly code corresponding to your bit puzzle functions. What x86 assembly instructions appear to perform rightshift and leftshift operations?  Most Linux distributions include several
other useful programs for examining binary files containing machine code.
Try out commands such as
ldd
,file
,nm
,strings
andreadelf
, and try other flags withobjdump
. Report something neat, unusual, or unexpected that you find. Don't forget to use the man pages to learn more about all of these programs.  Extra Credit (a little): run the
objdump t
command on a different program on the system  choose one in the /usr/bin/ directory. You will likely see the output "SYMBOL TABLE: no symbols". Why doesobjdump t
appear to work on your program, but not on others?
 Run