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