Skip to content

Instantly share code, notes, and snippets.

@Itay2805
Last active August 16, 2016 11:56
Show Gist options
  • Save Itay2805/db1f50e98767cc6c572f20275c030457 to your computer and use it in GitHub Desktop.
Save Itay2805/db1f50e98767cc6c572f20275c030457 to your computer and use it in GitHub Desktop.
class Main {
str : String <- "This is a test\n";
test : Test <- new Test;
main() : Object {
test.method();
print(str);
abort();
};
};
class Test {
a : Int <- 5;
b : Int <- 6;
method() : SELF_TYPE {
print(a);
print(b);
self;
}
};
[extern printf]
[extern scanf]
[extern exit]
[section code]
[global main]
main:
push rbp
mov rbp, rsp
jmp __internal_end_class_definition
;; Object class definition
class_Object_abort_V_Object:
mov rsi, abort_str
mov rdi, str_fmt
xor al, al
call printf
xor rdi, rdi
call exit
mov rax, rbp
ret
class_Object_type_name_V_String:
mov rax, class_typename_Object
ret
;; Main class definition
class_Main_abort_V_Object:
call class_Object_abort_V_Object
ret
class_Main_type_name_V_String:
mov rax, class_typename_Main
ret
class_Main_main_V_Object:
push rbp
lea rbp, [rbp - 8]
call class_Test_method_V_Test
pop rbp
;; print string
mov rsi, [rbp - 0]
mov rdi, str_fmt
xor al, al
call printf
;; abort
call class_Main_abort_V_Object
ret
class_Test_abort_V_Object:
call class_Object_abort_V_Object
ret
class_Test_type_name_V_String:
mov rax, class_typename_Test
ret
class_Test_method_V_Test:
;; print A
mov rsi, [rbp - 0]
mov rdi, num_fmt
xor al, al
call printf
;; print B
mov rsi, [rbp - 8]
mov rdi, num_fmt
xor al, al
call printf
;; return self
mov rax, rbp
ret
__internal_end_class_definition:
;; Create Main class
push rbp
mov rsp, rbp
;; local variable str : String
;; local variable test : Test
sub rsp, 24
;; Set the str var
mov qword [rbp - 0], class_attribute_str
;; Set the test var
mov qword [rbp - 8 - 0], 5
mov qword [rbp - 8 - 8], 6
call class_Main_main_V_Object
mov rsp, rbp
pop rbp
ret
[section rodata]
;; Needed strings
abort_str:
db "abort", 10, 0
str_fmt:
db "%s", 0
num_fmt:
db "%d", 0
;; Class typenames
class_typename_Object:
db "Object", 0
class_typename_Main:
db "Main", 0
class_typename_Test:
db "Test", 0
;; Class attributes
;; Main class attributes
class_attribute_str:
db "This is a test", 10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment