CS 208 w20 lecture 8 outline
1 Why Study Assembly?
- Understand optimizations made by the compiler and how your high-level code might affect them
 - High-level languages can hide details we need to know
- Ex. investigate exactly where data is stored—can be crucial for concurrent programs
 
 - Write more secure software
- Many of the ways programs can be attacked involve exploiting the way programs store their run-time control information
 
 
2 Registers
3 Addressing Modes
| Type | Form | Operand value | Name | 
|---|---|---|---|
| immediate | $Imm | Imm | immediate | 
| register | \(\mathtt{r}_a\) | \(\mathsf{R}[\mathtt{r}_a]\) | register | 
| memory | Imm | \(\mathsf{M}[Imm]\) | absolute | 
| memory | \((\mathtt{r}_a)\) | \(\mathsf{M}[\mathsf{R}[\mathtt{r}_a]]\) | indirect | 
| memory | \(Imm(\mathtt{r}_b)\) | \(\mathsf{M}[Imm + \mathsf{R}[\mathtt{r}_b]]\) | base + displacement | 
| memory | \(Imm(\mathtt{r}_b, \mathtt{r}_i)\) | \(\mathsf{M}[Imm + \mathsf{R}[\mathtt{r}_b] + \mathsf{R}[\mathtt{r}_i]]\) | indexed | 
| memory | \(Imm(\mathtt{r}_b, \mathtt{r}_i, s)\) | \(\mathsf{M}[Imm + \mathsf{R}[\mathtt{r}_b] + \mathsf{R}[\mathtt{r}_i]\cdot s]\) | scaled indexed | 
Why only 1, 2, 4, and 8 for scaling factor?
3.1 Exercises
0xf000 in %rdx, 0x0100 in %rcx (omitting leading zeros)
0x8(%rdx)→0xf008(%rdx,%rcx)→0xf100(%rdx,%rcx,4)→0xf4000x80(,%rdx,2)→0x1e080- What value does 
%raxhold after these instructions? 
:
    mov $0x0070000077070000, %rdx
    mov %edx, %eax
    add %rax, %rax
4 Thinking in Assembly
4.1 Assembly to C
A C function with the signature long f(long *p, long i) compiled to the following assembly code:
f: movq %rsi, %rax addq (%rdi), %rax movq %rax, (%rdi) ret
| Register | Use | 
|---|---|
%rdi | 
1st argument (p) | 
%rsi | 
2nd argument (i) | 
Write the C code for this function.
long f(long *p, long i) { *p += i; return *p }
How would the assembly change if the return statement were removed?
4.2 lea Instruction
- "load effective address", but more often "lovely efficient arithmetic"
 - instead of reading from the memory location given by the source operand, copies the effective address to the destination
- generate pointers for later memory references
 - can also do a muliply and an addition in a single instruction
leaq 7(%rdx, %rdx, 4), %raxwill set%raxequal to5 * %rdx + 7
 
 - destination must be a register
 
4.3 C to Assembly
Translate this C code to assembly
long arith(long x, long y, long z) { long t1 = x + y; long t2 = z + t1; long t3 = x + 4; long t4 = y * 48; long t5 = t3 + t4; long rval = t2 * t5; return rval; }
| Register | Use | 
|---|---|
%rdi | 
1st argument (x) | 
%rsi | 
2nd argument (y) | 
%rdx | 
3rd argument (z) | 
arith: leaq (%rdi,%rsi), %rax addq %rdx, %rax leaq (%rsi,%rsi,2), %rcx salq $4, %rcx leaq 4(%rdi,%rcx), %rcx imulq %rcx, %rax ret
Examples on godbolt.org: https://godbolt.org/z/j_WZwW