Fix string addressing and clobbered register
authorLuke Lau <luke.lau@intel.com>
Wed, 24 Jul 2019 13:29:45 +0000 (14:29 +0100)
committerLuke Lau <luke.lau@intel.com>
Wed, 24 Jul 2019 13:29:45 +0000 (14:29 +0100)
codegen.scm

index 25d99a199da43889ef289b1e6af1292595aa4af0..4848d4ddfa98731899f6b2ca92413b45eb3086ce 100644 (file)
@@ -50,6 +50,9 @@
 (define (codegen-print x si env)
   (codegen-expr x si env) ; x should be a static-string, producing a label
 
+                     ; make a copy of string address since %rax and %rdi are clobbered
+  (emit "mov %rax, %rbx")
+  
                      ; get the length of the null terminated string
   (emit "mov %rax, %rdi")
   (emit "xor %al, %al")   ; set %al to 0
@@ -61,7 +64,7 @@
   (emit "dec %rcx")
   
   (emit "mov %rcx, %rdx") ; number of bytes
-  (emit "mov %rax, %rsi") ; addr of string
+  (emit "mov %rbx, %rsi") ; addr of string
   (emit "mov $1, %rax") ; file handle 1 (stdout)
   (emit "mov $1, %rdi") ; syscall 1 (write)
   (emit "syscall"))
     ('bool-literal (emit "movq $~a, %rax" (if e 1 0)))
     ('int-literal (emit "movq $~a, %rax" e))
     
-    ('static-string (emit "movq (~a), %rax" (cadr e))) ; move label
+    ('static-string (emit "lea ~a, %rax" (cadr e))) ; move label
 
     (else (error #f "don't know how to codegen this"))))