Branching
Branching
Goal
Map Slang branching operations
loop:
goto loopto assembly, e.g.,
loop:
jmp loopLabels
Named locations in the code.
labelname:
mov $1, %raxWhere is code stored?
How are locations represented in the machine?
What address does the label correspond to at runtime?
Unconditional branching/jump
jmp loopAddresses are relative to the instruction pointer
Absolute address can be specified with a value in a register
For our compiler, we’ll only need to use labels
Assembler will compute relative offset for us
Conditional branching
How can we represent conditional statements in machine-like code?
int x = read_int();
if (x > 10) {
x = 11;
}
x += 1;
print_int(x);begin main()
locals x, result
x = read_int()
if x <= 10 goto falselabel
x = 11
falselabel:
x = x + 1
result = print_int(x)
return 0
end functionWhy is the condition inverted?
Won’t need compile to Slang but should understand how conditionals are translated to branch instructions.
Assembly translation:
.file "stdin"
.section .note.GNU-stack,"",@progbits
.text
.globl main
.type main, @function
main:
# prologue, update stack pointer
pushq %rbp # save old base ponter
movq %rsp, %rbp # set new base pointer
push %rbx # %rbx is callee-saved
# allocate stack space for locals
sub $24, %rsp
call read_int
add $0, %rsp
mov %rax, -16(%rbp)
# ifgoto x 10 to falselabel
mov -16(%rbp), %rax
mov $10, %rbx
cmp %rbx, %rax
jle falselabel
# assign 11 to x
mov $11, %rax
mov %rax, -16(%rbp)
falselabel:
# operation x 1 to x
mov -16(%rbp), %rax
mov $1, %rbx
add %rbx, %rax
mov %rax, -16(%rbp)
mov -16(%rbp), %rdi
call print_int
add $0, %rsp
mov %rax, -24(%rbp)
# set return value
mov $0, %rax
# epilogue
add $24, %rsp
pop %rbx # restore %rbx
pop %rbp # restore old base pointer
retAccessing variables
How we do access x’s data?
if x <= 10 goto falselabel
x = 11
falselabel:
x = x + 1Symbol table
locals x, result| Variable | Offset |
|---|---|
| x | -16 |
| result | -24 |
mov -16(%rbp), %raxLoad from the stack frame, e.g., -16(%rbp)
Comparing operands
cmp %rbx, %raxhttps://www.felixcloutier.com/x86/cmp
Where does the result go?
Sets the EFLAGS internal register https://en.wikibooks.html/wiki/X86_Assembly/X86_Architecture
x86’s conditional jumps
jle jump if result of comparison is less than or equal
to
jle falselabelhttps://www.felixcloutier.com/x86/jcc
ifgoto translation
Slang
if x <= 10 goto falselabelAssembly (assuming %rbx and %rax already
set)
cmp %rbx, %rax # %rbx is 10, %rax is x
jle falselabel # jump if rax <= rbxNote assembly operand order!
Just like subtraction, left operand is the second operand.
Other condition codes
| ASM Op | Slang Op | Jump if… |
|---|---|---|
je |
= | Equal |
jne |
!= | Not equal |
jl |
< | Less than |
jle |
<= | Less than or equal |
jg |
> | Greater than |
jge |
>= | Greater than or equal |
Pattern of conditional jumps
Slang pattern
if OPERAND1 OPERATOR OPERAND2 goto LABELConvert operator to ASM jCC. Assembly code template:
mov OPERAND1, %rax
mov OPERAND2, %rbx
cmp %rbx, %rax # %rbx is 10, %rax is x
jOP LABELComplete example
if x <= 10 goto falselabel
x = 11
falselabel:
x = x + 1Assembly translation
if x <= 10 goto falselabel
# Get operands
mov -16(%rbp), %rax
mov $10, %rbxcmp %rbx, %raxjle falselabelx = 11
mov $11, %rax
mov %rax, -16(%rbp)falselabel:
# Label
falselabel:x = x + 1
# x := x + 1
mov -16(%rbp), %rax
mov $1, %rbx
add %rbx, %rax
mov %rax, -16(%rbp)(Optional) C to Slang
We won’t be automatically compiling from C to Slang in this class, but these are examples of hand translating them.