From: Luke Lau Date: Wed, 24 Jul 2019 13:29:45 +0000 (+0100) Subject: Fix string addressing and clobbered register X-Git-Url: http://git.lukelau.me/?p=scheme.git;a=commitdiff_plain;h=dea4c4e4d1be8c0a90bb165bde1e362dc204e061 Fix string addressing and clobbered register --- diff --git a/codegen.scm b/codegen.scm index 25d99a1..4848d4d 100644 --- a/codegen.scm +++ b/codegen.scm @@ -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")) @@ -213,7 +216,7 @@ ('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"))))