CS 208 s21 — Learning Block #9

Table of Contents

1 Review

Write down the difference between leaq and movq 1

Given 0xf000 in %rdx, 0x0100 in %rcx (omitting additional leading zeros), what memory addresses do the following operands access?2

  • 0x8(%rdx)
  • (%rdx,%rcx)
  • (%rdx,%rcx,4)
  • 0x80(,%rdx,2)

2 C to Assembly

Translate this C code to assembly3

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)

3 Practice

  • Do CSPP practice problems 3.6 (p. 192), 3.7 (p. 193), 3.10 (p. 196), and 3.11 (p. 197)
    • To do the comparison for 3.11 part C, you can write an assembly file containing both instructions (e.g., xor_test.s), compile it to an object file (xor_test.o) and use objdump to print out the bytes. See section 3.2.2 of CSPP for an example.

Footnotes:

1

mov copies the source to the destination, possibly computing a memory address and reading or writing a value there, while lea computes a memory address and stores that address in a register (instead of going to memory)

2
  • 0x8(%rdx) accesses 0xf008
  • (%rdx,%rcx) accesses 0xf100
  • (%rdx,%rcx,4) accesses 0xf400
  • 0x80(,%rdx,2) accesses 0x1e080
3

One possible assembly implementation of arith:

arith:
    leaq    (%rdi,%rsi), %rax    // performs x + y using leaq
    addq    %rdx, %rax           // %rax now holds x + y + z (t2)
    leaq    (%rsi,%rsi,2), %rcx  // performs y * 3 using leaq
    salq    $4, %rcx             // %rcx now holds y * 48, since left shift 4 multiplies by 2^4 (16), and y * 3 * 16 == y * 48
    leaq    4(%rdi,%rcx), %rcx   // %rcx now holds y * 48 + x + 4 (t5 = t3 + t4)
    imulq   %rcx, %rax           // %rax now holds t2 * t5
    ret                          // return using %rax as the return value