Homework 1: Numerical Representations and Disassembly of Object Files
Assigned |
Friday, January 15, 2016 |
Due Date |
Monday, January 25, 2016 at 5:00pm (17:00) |
Submissions |
Submit a PDF file of your solutions using 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 hands-on, 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 and submit them as a PDF file in the online
dropbox. This simplifies our grading and ensures we read your answers clearly.
If you do not know how to create a PDF, a quick internet search should help, or
ask the course staff.
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 = 19, K = -7,
and K = 52. Hint: You can do all three multiplications with
a total of 11 operations. Note: You may find Practice problem
2.40 (p. 103) useful to get started on this problem.
- Homework Problem 2.82 (pp. 135-136), parts A, B, and C.
Note: random() generates a number
between 0 and Tmax (not Umax)in otherwords: 0 to 2^31 -
1. (Clarification: 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.)
-
Consider this Java method, which uses the Java standard library's
Math.abs
for computing the absolute value of an int
:
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 (base-2) and decimal (base-10)?
-
Give code 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 base-10) 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 web-search when answering this part.
- Recall that a floating point number is of the form:
(-1)S x M x 2E. M is the mantissa and
2E is the exponent. Also recall that M ranges from 1.0 to
(almost) 2.0.
Tell us the decimal values of M and E for the (decimal)
number 17.15625 and how this would be
encoded in IEEE 754 representation (32 bits), including the binary
values of the
frac
and exp
parts of the
representation. (Recall frac
= M - 1.0.) Your answer
should contain these parts and you should show how you calculated
each value:
- Decimal values for M and E such that (-1)^S * M * 2^E =
17.15625
- Binary values for
frac
and exp
exactly
as they will appear in the full 32-bit representation of 17.15625 in
IEEE floating point.
- The full 32-bit IEEE floating point representation (in bits) of
17.15625
- 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 line-by-line with the given assembly code. It just
needs to be C code that accomplishes the same thing.
- For this problem you will use the jack-of-all-trades 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 command objdump -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 you 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 right-shift and
left-shift 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 and
readelf, and try other flags with objdump. 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 does objdump -t appear to work on your program,
but not on others?