Last active
August 16, 2016 11:56
-
-
Save Itay2805/db1f50e98767cc6c572f20275c030457 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
}; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[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