So, finally I’ve hacked a basic AMD64 code generator, after so many tries. This code generator is hacked in Common Lisp, and is currently generating a code for a very simple toy like language. I’ve not written any grammar specification for it. It is a LISP like language. This piece of code generator is dedicated to one of my cool friend Edwin Jose, and is thus named as louzer
. Following is an example of the language for which louzer
generates code.
(source
(let principal rate time amount x)
(= principal 1000)
(= rate 10)
(= time 100)
(= x 100)
(= amount
(/ (* principal (* rate time))
100))
(print "Amount (%d) - %d is %d.\\n" amount x (- amount x))
(print "Hello World, louzer\\n"))
The language code is also embedded along with the source code in the LISP file. Following is how I’m using it with GNU clisp implementation:
% clisp louzer.lisp |tee test.S
.section .text
.extern printf
.type main,@function
.globl main
main:
pushq %rbp
movq %rsp, %rbp
subq $40, %rsp
movq $1000, %rbx
movq %rbx, -8(%rbp)
movq $10, %rbx
movq %rbx, -16(%rbp)
movq $100, %rbx
movq %rbx, -24(%rbp)
movq $100, %rbx
movq %rbx, -40(%rbp)
movq -16(%rbp), %rbx
imul -24(%rbp), %rbx
imul -8(%rbp), %rbx
movq %rbx, %rax
movq $100, %rbx
xorq %rdx,%rdx
idiv %rbx
movq %rax, -32(%rbp)
leaq __string_0,%rdi
movq -32(%rbp), %rsi
movq -40(%rbp), %rdx
movq -32(%rbp), %rbx
subq -40(%rbp), %rbx
movq %rbx, %rcx
xorq %rax,%rax
call printf
leaq __string_1,%rdi
xorq %rax,%rax
call printf
xorq %rax, %rax
movq %rbp, %rsp
popq %rbp
ret
.section .rodata
__string_1: .string "Hello, louzer World\n"
__string_0: .string "Amount (%d) - %d is %d.\n"
/* Generated by louzer :) */
Above is the piece of AMD64 assembly code emitted by the louzer
. So, now time to assemble and link the above assembly code and generate the output of the above code.
% cc -o test test.S
% ./test
Amount (10000) - 100 is 9900.
Hello, louzer World
Voila. Oh, sorry to keep you waiting, now you can download the louzer.lisp and have fun. BtW, code is not perfect and has couple of limitations, which I’ve not fixed due to lack of time, as I’ve an exam day after tomorrow. So, I’ll be able to work on it only after 20081219
. Happy hacking codegens…;)
NOTE (for Grammar Nazis): Forgive me for any grammatical mistakes you encounter above, and ofcourse point out the mistake :).
P.S. Forgot to mention, you’ll need an AMD64 architecture CPU, toolchain and POSIX OS to test out above stuff.