diff --git a/2015/02/main.asm b/2015/02/main.asm
index 150608c..ed97c0f 100644
--- a/2015/02/main.asm
+++ b/2015/02/main.asm
@@ -12,6 +12,7 @@ entryPoint:
 
   push rbx
   push r12
+  push r13
   sub rsp, 32
 
   ; rax = reserved for math
@@ -24,9 +25,11 @@ entryPoint:
   ; r10 = second dimension
   ; r11 = third dimension
   ; r12 = total wrapping paper required
+  ; r13 = total ribbon length required
 
   xor rdx, rdx
   xor r12, r12
+  xor r13, r13
 
 .nextLine:
   call .nextNumber
@@ -53,21 +56,31 @@ entryPoint:
   mov rax, 2
   mul r9
   mul r10
-  add r12, rax ; add 2 * dim1 * dim2
+  add r12, rax ; add 2 * dim1 * dim2 to wrapping paper length
 
   mov rax, 2
   mul r9
   mul r11
-  add r12, rax ; add 2 * dim1 * dim3
+  add r12, rax ; add 2 * dim1 * dim3 to wrapping paper length
 
   mov rax, 2
   mul r10
   mul r11
-  add r12, rax ; add 2 * dim2 * dim3
+  add r12, rax ; add 2 * dim2 * dim3 to wrapping paper length
 
   mov rax, r9
   mul r10
-  add r12, rax ; add square area of smallest side
+  add r12, rax ; add square area of smallest side to wrapping paper length
+
+  add r13, r9
+  add r13, r9
+  add r13, r10
+  add r13, r10 ; add smallest perimeter to the ribbon length
+
+  mov rax, r9
+  mul r10
+  mul r11
+  add r13, rax ; add volume of the present to the ribbon length
 
   movzx rbx, byte [ rcx ] ; read current character
   cmp bl, 0               ; if we have not reached end of string yet,
@@ -77,7 +90,12 @@ entryPoint:
   mov rdx, r12
   call print
 
+  lea rcx, [ print_ribbon_length ]
+  mov rdx, r13
+  call print
+
   add rsp, 32
+  pop r13
   pop r12
   pop rbx
 
@@ -111,3 +129,4 @@ entryPoint:
 section .data
 
 print_wrapping_paper: db `Wrapping paper required: %d\n`, 0
+print_ribbon_length:  db `Ribbon length required: %d\n`, 0