Slide 1

Slide 1 text

Simulating a CPU with Ruby Denis Defreyne / RUG::B / April 2, 2015 1

Slide 2

Slide 2 text

May contain nuts. 2 DISCLAIMER

Slide 3

Slide 3 text

3 1. Write an assembler 2. Design an assembly language 3. Design a CPU instruction format 4. Design a CPU instruction set 5. Write an emulator

Slide 4

Slide 4 text

3 1. Write an assembler 2. Design an assembly language 3. Design a CPU instruction format 4. Design a CPU instruction set 5. Write an emulator

Slide 5

Slide 5 text

3 1. Write an assembler 2. Design an assembly language 3. Design a CPU instruction format 4. Design a CPU instruction set 5. Write an emulator

Slide 6

Slide 6 text

3 1. Write an assembler 2. Design an assembly language 3. Design a CPU instruction format 4. Design a CPU instruction set 5. Write an emulator

Slide 7

Slide 7 text

3 1. Write an assembler 2. Design an assembly language 3. Design a CPU instruction format 4. Design a CPU instruction set 5. Write an emulator

Slide 8

Slide 8 text

3 1. Write an assembler 2. Design an assembly language 3. Design a CPU instruction format 4. Design a CPU instruction set 5. Write an emulator

Slide 9

Slide 9 text

4

Slide 10

Slide 10 text

4

Slide 11

Slide 11 text

4

Slide 12

Slide 12 text

5

Slide 13

Slide 13 text

loop do 5

Slide 14

Slide 14 text

loop do grab
 5

Slide 15

Slide 15 text

loop do grab
 case apple_color 5

Slide 16

Slide 16 text

loop do grab
 case apple_color when :red 5

Slide 17

Slide 17 text

loop do grab
 case apple_color when :red move_to(:right) 5

Slide 18

Slide 18 text

loop do grab
 case apple_color when :red move_to(:right) when :green 5

Slide 19

Slide 19 text

loop do grab
 case apple_color when :red move_to(:right) when :green move_to(:left) 5

Slide 20

Slide 20 text

loop do grab
 case apple_color when :red move_to(:right) when :green move_to(:left) end
 5

Slide 21

Slide 21 text

loop do grab
 case apple_color when :red move_to(:right) when :green move_to(:left) end
 release 5

Slide 22

Slide 22 text

loop do grab
 case apple_color when :red move_to(:right) when :green move_to(:left) end
 release move_to(:middle) 5

Slide 23

Slide 23 text

loop do grab
 case apple_color when :red move_to(:right) when :green move_to(:left) end
 release move_to(:middle) end 5

Slide 24

Slide 24 text

A program is a stream of instructions. 6

Slide 25

Slide 25 text

7 loop do grab case apple_color when :red move_to(:right) when :green move_to(:left) end release move_to(:bucket) end

Slide 26

Slide 26 text

7 loop do grab case apple_color when :red move_to(:right) when :green move_to(:left) end release move_to(:bucket) end

Slide 27

Slide 27 text

grab # grab apple 7 loop do grab case apple_color when :red move_to(:right) when :green move_to(:left) end release move_to(:bucket) end

Slide 28

Slide 28 text

grab # grab apple getcolor r0 # r0 now contains apple color 7 loop do grab case apple_color when :red move_to(:right) when :green move_to(:left) end release move_to(:bucket) end

Slide 29

Slide 29 text

grab # grab apple getcolor r0 # r0 now contains apple color cmp r0, 0 # 0 means red 7 loop do grab case apple_color when :red move_to(:right) when :green move_to(:left) end release move_to(:bucket) end

Slide 30

Slide 30 text

grab # grab apple getcolor r0 # r0 now contains apple color cmp r0, 0 # 0 means red je @red # jump if equal (i.e. red) 7 loop do grab case apple_color when :red move_to(:right) when :green move_to(:left) end release move_to(:bucket) end

Slide 31

Slide 31 text

grab # grab apple getcolor r0 # r0 now contains apple color cmp r0, 0 # 0 means red je @red # jump if equal (i.e. red) jmp @green # jump
 7 loop do grab case apple_color when :red move_to(:right) when :green move_to(:left) end release move_to(:bucket) end

Slide 32

Slide 32 text

grab # grab apple getcolor r0 # r0 now contains apple color cmp r0, 0 # 0 means red je @red # jump if equal (i.e. red) jmp @green # jump
 green: 7 loop do grab case apple_color when :red move_to(:right) when :green move_to(:left) end release move_to(:bucket) end

Slide 33

Slide 33 text

grab # grab apple getcolor r0 # r0 now contains apple color cmp r0, 0 # 0 means red je @red # jump if equal (i.e. red) jmp @green # jump
 green: mvarm 1 # move arm (1 means left) 7 loop do grab case apple_color when :red move_to(:right) when :green move_to(:left) end release move_to(:bucket) end

Slide 34

Slide 34 text

grab # grab apple getcolor r0 # r0 now contains apple color cmp r0, 0 # 0 means red je @red # jump if equal (i.e. red) jmp @green # jump
 green: mvarm 1 # move arm (1 means left) jmp @done # jump
 7 loop do grab case apple_color when :red move_to(:right) when :green move_to(:left) end release move_to(:bucket) end

Slide 35

Slide 35 text

grab # grab apple getcolor r0 # r0 now contains apple color cmp r0, 0 # 0 means red je @red # jump if equal (i.e. red) jmp @green # jump
 green: mvarm 1 # move arm (1 means left) jmp @done # jump
 red: 7 loop do grab case apple_color when :red move_to(:right) when :green move_to(:left) end release move_to(:bucket) end

Slide 36

Slide 36 text

grab # grab apple getcolor r0 # r0 now contains apple color cmp r0, 0 # 0 means red je @red # jump if equal (i.e. red) jmp @green # jump
 green: mvarm 1 # move arm (1 means left) jmp @done # jump
 red: mvarm 2 # move arm (2 means right) 7 loop do grab case apple_color when :red move_to(:right) when :green move_to(:left) end release move_to(:bucket) end

Slide 37

Slide 37 text

grab # grab apple getcolor r0 # r0 now contains apple color cmp r0, 0 # 0 means red je @red # jump if equal (i.e. red) jmp @green # jump
 green: mvarm 1 # move arm (1 means left) jmp @done # jump
 red: mvarm 2 # move arm (2 means right) jmp @done # jump
 7 loop do grab case apple_color when :red move_to(:right) when :green move_to(:left) end release move_to(:bucket) end

Slide 38

Slide 38 text

grab # grab apple getcolor r0 # r0 now contains apple color cmp r0, 0 # 0 means red je @red # jump if equal (i.e. red) jmp @green # jump
 green: mvarm 1 # move arm (1 means left) jmp @done # jump
 red: mvarm 2 # move arm (2 means right) jmp @done # jump
 done: 7 loop do grab case apple_color when :red move_to(:right) when :green move_to(:left) end release move_to(:bucket) end

Slide 39

Slide 39 text

grab # grab apple getcolor r0 # r0 now contains apple color cmp r0, 0 # 0 means red je @red # jump if equal (i.e. red) jmp @green # jump
 green: mvarm 1 # move arm (1 means left) jmp @done # jump
 red: mvarm 2 # move arm (2 means right) jmp @done # jump
 done: release # release apple (falls in target pile) 7 loop do grab case apple_color when :red move_to(:right) when :green move_to(:left) end release move_to(:bucket) end

Slide 40

Slide 40 text

grab # grab apple getcolor r0 # r0 now contains apple color cmp r0, 0 # 0 means red je @red # jump if equal (i.e. red) jmp @green # jump
 green: mvarm 1 # move arm (1 means left) jmp @done # jump
 red: mvarm 2 # move arm (2 means right) jmp @done # jump
 done: release # release apple (falls in target pile) mvarm 0 # move arm (0 means middle) 7 loop do grab case apple_color when :red move_to(:right) when :green move_to(:left) end release move_to(:bucket) end

Slide 41

Slide 41 text

grab # grab apple getcolor r0 # r0 now contains apple color cmp r0, 0 # 0 means red je @red # jump if equal (i.e. red) jmp @green # jump
 green: mvarm 1 # move arm (1 means left) jmp @done # jump
 red: mvarm 2 # move arm (2 means right) jmp @done # jump
 done: release # release apple (falls in target pile) mvarm 0 # move arm (0 means middle) jmp @start # jump 7 loop do grab case apple_color when :red move_to(:right) when :green move_to(:left) end release move_to(:bucket) end

Slide 42

Slide 42 text

start: grab # grab apple getcolor r0 # r0 now contains apple color cmp r0, 0 # 0 means red je @red # jump if equal (i.e. red) jmp @green # jump
 green: mvarm 1 # move arm (1 means left) jmp @done # jump
 red: mvarm 2 # move arm (2 means right) jmp @done # jump
 done: release # release apple (falls in target pile) mvarm 0 # move arm (0 means middle) jmp @start # jump 7 loop do grab case apple_color when :red move_to(:right) when :green move_to(:left) end release move_to(:bucket) end

Slide 43

Slide 43 text

start: grab # grab apple getcolor r0 # r0 now contains apple color cmp r0, 0 # 0 means red je @red # jump if equal (i.e. red) jmp @green # jump
 green: mvarm 1 # move arm (1 means left) jmp @done # jump
 red: mvarm 2 # move arm (2 means right) jmp @done # jump
 done: release # release apple (falls in target pile) mvarm 0 # move arm (0 means middle) jmp @start # jump 7 loop do grab case apple_color when :red move_to(:right) when :green move_to(:left) end release move_to(:bucket) end

Slide 44

Slide 44 text

start: grab # grab apple getcolor r0 # r0 now contains apple color cmp r0, 0 # 0 means red je @red # jump if equal (i.e. red) jmp @green # jump
 green: mvarm 1 # move arm (1 means left) jmp @done # jump
 red: mvarm 2 # move arm (2 means right) jmp @done # jump
 done: release # release apple (falls in target pile) mvarm 0 # move arm (0 means middle) jmp @start # jump 7 loop do grab case apple_color when :red move_to(:right) when :green move_to(:left) end release move_to(:bucket) end

Slide 45

Slide 45 text

8

Slide 46

Slide 46 text

lv r0, 123 8

Slide 47

Slide 47 text

lv r0, 123 prn r0 8

Slide 48

Slide 48 text

lv r0, 123 prn r0 halt 8

Slide 49

Slide 49 text

prn is not a realistic instruction. 9 CHEAT #1

Slide 50

Slide 50 text

CHEAT #1 halt is not a realistic instruction. 10 CHEAT #2

Slide 51

Slide 51 text

11

Slide 52

Slide 52 text

lv r0, 100 11

Slide 53

Slide 53 text

lv r0, 100 lv r1, 200 11

Slide 54

Slide 54 text

lv r0, 100 lv r1, 200 add r2, r0, r1 11

Slide 55

Slide 55 text

lv r0, 100 lv r1, 200 add r2, r0, r1 prn r2 11

Slide 56

Slide 56 text

lv r0, 100 lv r1, 200 add r2, r0, r1 prn r2 halt 11

Slide 57

Slide 57 text

def gcd(a, b) while b != 0 t = b b = a % b a = t end a end 12

Slide 58

Slide 58 text

13 def gcd(r0, r1) while r1 != 0 r2 = r1 r1 = r0 % r1 r0 = r2 end r0 end

Slide 59

Slide 59 text

lv r0, 819000 # r0 = 819000 13 def gcd(r0, r1) while r1 != 0 r2 = r1 r1 = r0 % r1 r0 = r2 end r0 end

Slide 60

Slide 60 text

lv r0, 819000 # r0 = 819000 lv r1, 254163 # r1 = 254163
 13 def gcd(r0, r1) while r1 != 0 r2 = r1 r1 = r0 % r1 r0 = r2 end r0 end

Slide 61

Slide 61 text

lv r0, 819000 # r0 = 819000 lv r1, 254163 # r1 = 254163
 
 cmp r1, 0 # compare r1 with 0 13 def gcd(r0, r1) while r1 != 0 r2 = r1 r1 = r0 % r1 r0 = r2 end r0 end

Slide 62

Slide 62 text

lv r0, 819000 # r0 = 819000 lv r1, 254163 # r1 = 254163
 
 cmp r1, 0 # compare r1 with 0 je @end # jump to @end if = 13 def gcd(r0, r1) while r1 != 0 r2 = r1 r1 = r0 % r1 r0 = r2 end r0 end

Slide 63

Slide 63 text

lv r0, 819000 # r0 = 819000 lv r1, 254163 # r1 = 254163
 
 cmp r1, 0 # compare r1 with 0 je @end # jump to @end if = mov r2, r1 # r2 <— r1 13 def gcd(r0, r1) while r1 != 0 r2 = r1 r1 = r0 % r1 r0 = r2 end r0 end

Slide 64

Slide 64 text

lv r0, 819000 # r0 = 819000 lv r1, 254163 # r1 = 254163
 
 cmp r1, 0 # compare r1 with 0 je @end # jump to @end if = mov r2, r1 # r2 <— r1 mod r1, r0, r1 # r1 <— r0 % r1 13 def gcd(r0, r1) while r1 != 0 r2 = r1 r1 = r0 % r1 r0 = r2 end r0 end

Slide 65

Slide 65 text

lv r0, 819000 # r0 = 819000 lv r1, 254163 # r1 = 254163
 
 cmp r1, 0 # compare r1 with 0 je @end # jump to @end if = mov r2, r1 # r2 <— r1 mod r1, r0, r1 # r1 <— r0 % r1 mov r0, r2 # r0 <— r2 13 def gcd(r0, r1) while r1 != 0 r2 = r1 r1 = r0 % r1 r0 = r2 end r0 end

Slide 66

Slide 66 text

lv r0, 819000 # r0 = 819000 lv r1, 254163 # r1 = 254163
 
 cmp r1, 0 # compare r1 with 0 je @end # jump to @end if = mov r2, r1 # r2 <— r1 mod r1, r0, r1 # r1 <— r0 % r1 mov r0, r2 # r0 <— r2 jmp @start # jump to @start
 
 
 13 def gcd(r0, r1) while r1 != 0 r2 = r1 r1 = r0 % r1 r0 = r2 end r0 end

Slide 67

Slide 67 text

lv r0, 819000 # r0 = 819000 lv r1, 254163 # r1 = 254163
 
 cmp r1, 0 # compare r1 with 0 je @end # jump to @end if = mov r2, r1 # r2 <— r1 mod r1, r0, r1 # r1 <— r0 % r1 mov r0, r2 # r0 <— r2 jmp @start # jump to @start
 
 
 13 def gcd(r0, r1) while r1 != 0 r2 = r1 r1 = r0 % r1 r0 = r2 end r0 end 
 
 
 start: 
 
 
 
 
 
 
 


Slide 68

Slide 68 text


 
 
 
 
 
 
 
 
 
 
 end: lv r0, 819000 # r0 = 819000 lv r1, 254163 # r1 = 254163
 
 cmp r1, 0 # compare r1 with 0 je @end # jump to @end if = mov r2, r1 # r2 <— r1 mod r1, r0, r1 # r1 <— r0 % r1 mov r0, r2 # r0 <— r2 jmp @start # jump to @start
 
 
 13 def gcd(r0, r1) while r1 != 0 r2 = r1 r1 = r0 % r1 r0 = r2 end r0 end 
 
 
 start: 
 
 
 
 
 
 
 


Slide 69

Slide 69 text


 
 
 
 
 
 
 
 
 
 
 end: prn r0 # print r0 (our gcd!) lv r0, 819000 # r0 = 819000 lv r1, 254163 # r1 = 254163
 
 cmp r1, 0 # compare r1 with 0 je @end # jump to @end if = mov r2, r1 # r2 <— r1 mod r1, r0, r1 # r1 <— r0 % r1 mov r0, r2 # r0 <— r2 jmp @start # jump to @start
 
 
 13 def gcd(r0, r1) while r1 != 0 r2 = r1 r1 = r0 % r1 r0 = r2 end r0 end 
 
 
 start: 
 
 
 
 
 
 
 


Slide 70

Slide 70 text


 
 
 
 
 
 
 
 
 
 
 end: prn r0 # print r0 (our gcd!) halt # shut down lv r0, 819000 # r0 = 819000 lv r1, 254163 # r1 = 254163
 
 cmp r1, 0 # compare r1 with 0 je @end # jump to @end if = mov r2, r1 # r2 <— r1 mod r1, r0, r1 # r1 <— r0 % r1 mov r0, r2 # r0 <— r2 jmp @start # jump to @start
 
 
 13 def gcd(r0, r1) while r1 != 0 r2 = r1 r1 = r0 % r1 r0 = r2 end r0 end 
 
 
 start: 
 
 
 
 
 
 
 


Slide 71

Slide 71 text

1000 000c 7f38 1001 0003 e0d3 1201 0000 0000 0720 0f02 0113 0100 010f 0002 060c 0e00 ff 14

Slide 72

Slide 72 text

1000 000c 7f38 1001 0003 e0d3 1201 0000 0000 0720 0f02 01 1301 0001 0f00 02 060c 0e00 ff 15

Slide 73

Slide 73 text

1000 000c 7f38 1001 0003 e0d3 1201 0000 0000 0720 0f02 01 1301 0001 0f00 02 060c 0e00 ff 1000 000c 7f38 lv r0, 819000 15

Slide 74

Slide 74 text

1000 000c 7f38 1001 0003 e0d3 1201 0000 0000 0720 0f02 01 1301 0001 0f00 02 060c 0e00 ff 1000 000c 7f38 lv r0, 819000 1001 0003 e0d3 lv r1, 254163 15

Slide 75

Slide 75 text

1000 000c 7f38 1001 0003 e0d3 1201 0000 0000 0720 0f02 01 1301 0001 0f00 02 060c 0e00 ff 1000 000c 7f38 lv r0, 819000 1001 0003 e0d3 lv r1, 254163 1201 0000 0000 cmp r1, 0 15

Slide 76

Slide 76 text

1000 000c 7f38 1001 0003 e0d3 1201 0000 0000 0720 0f02 01 1301 0001 0f00 02 060c 0e00 ff 1000 000c 7f38 lv r0, 819000 1001 0003 e0d3 lv r1, 254163 1201 0000 0000 cmp r1, 0 0720 je @end 15

Slide 77

Slide 77 text

1000 000c 7f38 1001 0003 e0d3 1201 0000 0000 0720 0f02 01 1301 0001 0f00 02 060c 0e00 ff 1000 000c 7f38 lv r0, 819000 1001 0003 e0d3 lv r1, 254163 1201 0000 0000 cmp r1, 0 0720 je @end 0f02 01 mov r2, r1 15

Slide 78

Slide 78 text

1000 000c 7f38 1001 0003 e0d3 1201 0000 0000 0720 0f02 01 1301 0001 0f00 02 060c 0e00 ff 1000 000c 7f38 lv r0, 819000 1001 0003 e0d3 lv r1, 254163 1201 0000 0000 cmp r1, 0 0720 je @end 0f02 01 mov r2, r1 1301 0001 mod r1, r0, r1 15

Slide 79

Slide 79 text

1000 000c 7f38 1001 0003 e0d3 1201 0000 0000 0720 0f02 01 1301 0001 0f00 02 060c 0e00 ff 1000 000c 7f38 lv r0, 819000 1001 0003 e0d3 lv r1, 254163 1201 0000 0000 cmp r1, 0 0720 je @end 0f02 01 mov r2, r1 1301 0001 mod r1, r0, r1 0f00 02 mov r0, r2 15

Slide 80

Slide 80 text

1000 000c 7f38 1001 0003 e0d3 1201 0000 0000 0720 0f02 01 1301 0001 0f00 02 060c 0e00 ff 1000 000c 7f38 lv r0, 819000 1001 0003 e0d3 lv r1, 254163 1201 0000 0000 cmp r1, 0 0720 je @end 0f02 01 mov r2, r1 1301 0001 mod r1, r0, r1 0f00 02 mov r0, r2 060c jmp @start 15

Slide 81

Slide 81 text

1000 000c 7f38 1001 0003 e0d3 1201 0000 0000 0720 0f02 01 1301 0001 0f00 02 060c 0e00 ff 1000 000c 7f38 lv r0, 819000 1001 0003 e0d3 lv r1, 254163 1201 0000 0000 cmp r1, 0 0720 je @end 0f02 01 mov r2, r1 1301 0001 mod r1, r0, r1 0f00 02 mov r0, r2 060c jmp @start 0e00 prn r0 15

Slide 82

Slide 82 text

1000 000c 7f38 1001 0003 e0d3 1201 0000 0000 0720 0f02 01 1301 0001 0f00 02 060c 0e00 ff 1000 000c 7f38 lv r0, 819000 1001 0003 e0d3 lv r1, 254163 1201 0000 0000 cmp r1, 0 0720 je @end 0f02 01 mov r2, r1 1301 0001 mod r1, r0, r1 0f00 02 mov r0, r2 060c jmp @start 0e00 prn r0 ff halt 15

Slide 83

Slide 83 text

Machine code is executed by actual, physical CPUs. Bytecode is executed by virtual machines. 16

Slide 84

Slide 84 text

17 YARV

Slide 85

Slide 85 text

18 JVM

Slide 86

Slide 86 text

0000000000001f76 <_rb_ary_freeze>: 1f76: 55 push %rbp 1f77: 48 89 e5 mov %rsp,%rbp 1f7a: 5d pop %rbp 1f7b: e9 32 b6 07 00 jmpq 7d5b2 <_rb_obj_freeze> 0000000000002483 <_rb_ary_free>: 2483: 55 push %rbp 2484: 48 89 e5 mov %rsp,%rbp 2487: 40 f6 c7 07 test $0x7,%dil 248b: 75 23 jne 24b0 <_rb_ary_free+0x2d> 248d: 48 89 f8 mov %rdi,%rax 2490: 48 83 e0 f7 and $0xfffffffffffffff7,%rax 2494: 74 1a je 24b0 <_rb_ary_free+0x2d> 2496: 48 8b 07 mov (%rdi),%rax 2499: 48 89 c1 mov %rax,%rcx 249c: 48 83 e1 1f and $0x1f,%rcx 24a0: 48 83 f9 1c cmp $0x1c,%rcx 24a4: 74 0a je 24b0 <_rb_ary_free+0x2d> 24a6: 48 25 00 60 00 00 and $0x6000,%rax 24ac: 74 02 je 24b0 <_rb_ary_free+0x2d> 24ae: 5d pop %rbp 24af: c3 retq 24b0: 48 8b 7f 20 mov 0x20(%rdi),%rdi 24b4: 5d pop %rbp 24b5: e9 23 39 04 00 jmpq 45ddd <_ruby_xfree> 19 X86

Slide 87

Slide 87 text

0010c00 : 10c00: e59a1008 ldr r1, [sl, #8] 10c04: e15d0001 cmp sp, r1 10c08: 91a0300e movls r3, lr 10c0c: 9b01a46b blls 79dc0 10c10: 9afffffa bls 10c00 10c14: e52de044 str lr, [sp, #-68]! ; 0xffffffbc 10c18: e59fb19c ldr fp, [pc, #412] ; 10dbc 10c1c: e5db0000 ldrb r0, [fp] 10c20: e3500000 cmp r0, #0 10c24: 0a000062 beq 10db4 10c28: e59f1190 ldr r1, [pc, #400] ; 10dc0 10c2c: e28d0004 add r0, sp, #4 10c30: e4912004 ldr r2, [r1], #4 10c34: e4802004 str r2, [r0], #4 10c38: e4912004 ldr r2, [r1], #4 10c3c: e4802004 str r2, [r0], #4 10c40: eb021a3a bl 97530 10c44: e28d000c add r0, sp, #12 10c48: e5901000 ldr r1, [r0] 10c4c: e5901004 ldr r1, [r0, #4] 10c50: e58d1034 str r1, [sp, #52] ; 0x34 10c54: e59d0034 ldr r0, [sp, #52] ; 0x34 10c58: e3500000 cmp r0, #0 10c5c: 0a000054 beq 10db4 10c60: e59f115c ldr r1, [pc, #348] ; 10dc4 10c64: e28d0004 add r0, sp, #4 10c68: e4912004 ldr r2, [r1], #4 10c6c: e4802004 str r2, [r0], #4 10c70: e4912004 ldr r2, [r1], #4 10c74: e4802004 str r2, [r0], #4 20 ARM

Slide 88

Slide 88 text

21 THE SECRET OF MONKEY ISLAND

Slide 89

Slide 89 text

22

Slide 90

Slide 90 text

22 1. Fetch instruction

Slide 91

Slide 91 text

22 1. Fetch instruction 2. Execute instruction

Slide 92

Slide 92 text

22 1. Fetch instruction 2. Execute instruction 3. Move to next instruction

Slide 93

Slide 93 text

23 RPC Program counter

Slide 94

Slide 94 text

1000 000c 7f38 1001 0003 e0d3 1201 0000 0000 0720 0f02 01 1301 0001 0f00 02 060c 0e00 ff 24 RPC 0

Slide 95

Slide 95 text

1000 000c 7f38 1001 0003 e0d3 1201 0000 0000 0720 0f02 01 1301 0001 0f00 02 060c 0e00 ff 24 RPC 6

Slide 96

Slide 96 text

1000 000c 7f38 1001 0003 e0d3 1201 0000 0000 0720 0f02 01 1301 0001 0f00 02 060c 0e00 ff 24 RPC 12

Slide 97

Slide 97 text

1000 000c 7f38 1001 0003 e0d3 1201 0000 0000 0720 0f02 01 1301 0001 0f00 02 060c 0e00 ff 24 RPC 18

Slide 98

Slide 98 text

1000 000c 7f38 1001 0003 e0d3 1201 0000 0000 0720 0f02 01 1301 0001 0f00 02 060c 0e00 ff 24 RPC 20

Slide 99

Slide 99 text

25 General-purpose registers R0 - R7

Slide 100

Slide 100 text

26 RFLAGS Flags register (equal, greater than)

Slide 101

Slide 101 text

27 j je jne jg jge jl jle cmp mod add sub mul div xor or and shl shr not lw lh lb sw sh sb STACK FUNC SPECIAL call ret push pop prn halt BRANCHING ARITHMETIC mov li MEMORY REG

Slide 102

Slide 102 text

DEMO 28

Slide 103

Slide 103 text

github.com/ddfreyne/rcpu 29

Slide 104

Slide 104 text

30 @ddfreyne [email protected] Denis Defreyne Ask me about Belgian beer.

Slide 105

Slide 105 text

31 This talk would not have been the same without some great assets that I could use for free. The fonts in this presentation are Clear Sans by Intel (01.org/clear-sans) and Ubuntu Mono by Canonical Ltd (font.ubuntu.com). The apple sprite is by http://chrisdesign.wordpress.com/.

Slide 106

Slide 106 text

Extra slides 32

Slide 107

Slide 107 text

33

Slide 108

Slide 108 text

33 25 15

Slide 109

Slide 109 text

33 25 15 RPC + 5

Slide 110

Slide 110 text

33 25 15 RPC + 5 CALLER

Slide 111

Slide 111 text

33 25 15 RPC + 5 CALLER CALLEE

Slide 112

Slide 112 text

33 25 15 RPC + 5 old RBP CALLER CALLEE

Slide 113

Slide 113 text

33 25 15 RPC + 5 old RBP old R0 old R1 old R2 CALLER CALLEE

Slide 114

Slide 114 text

33 25 15 RPC + 5 old RBP CALLER CALLEE

Slide 115

Slide 115 text

33 25 15 RPC + 5 CALLER CALLEE

Slide 116

Slide 116 text

33 25 15 CALLER CALLEE

Slide 117

Slide 117 text

33 CALLER CALLEE

Slide 118

Slide 118 text

34

Slide 119

Slide 119 text

lv r0, 100 34

Slide 120

Slide 120 text

lv r0, 100 cmpi r0, 100 # rflags is now 0x01 (equal) 34

Slide 121

Slide 121 text

lv r0, 100 cmpi r0, 100 # rflags is now 0x01 (equal) cmpi r0, 99 # rflags is now 0x02 (greater than) 34

Slide 122

Slide 122 text

35 RIVEN

Slide 123

Slide 123 text

36 RIVEN

Slide 124

Slide 124 text

37 Z-CODE

Slide 125

Slide 125 text

38 MARGARET HAMILTON