Compare commits

3 Commits

6 changed files with 772 additions and 875 deletions

View File

@ -3,10 +3,10 @@
# obtain one at https://mozilla.org/MPL/2.0/. # obtain one at https://mozilla.org/MPL/2.0/.
.global _is_alpha, _is_digit, _is_alnum, _is_upper, _is_lower .global _is_alpha, _is_digit, _is_alnum, _is_upper, _is_lower
.global _write_out, _read_file, _write_error, _put_char, _printi .global _write_s, _read_file, _write_error, _write_c, _write_i, _print_i
.global _get, _memcmp, _memchr, _memmem, _memcpy .global _memcmp, _memchr, _memmem, _memcpy, _mmap
.global _divide_by_zero_error, _exit, _mmap .global _current, _get, _advance, _label_counter
.global _strings_index, _string_equal .global _divide_by_zero_error, _exit, _strings_index, _string_equal
.section .rodata .section .rodata
@ -175,16 +175,20 @@ _is_alnum:
addi sp, sp, 16 addi sp, sp, 16
ret ret
.type _write_out, @function # Writes a string to the standard output.
_write_out: #
# Parameters:
# a0 - Length of the string.
# a1 - String pointer.
.type _write_s, @function
_write_s:
# Prologue. # Prologue.
addi sp, sp, -8 addi sp, sp, -8
sw ra, 4(sp) sw ra, 4(sp)
sw s0, 0(sp) sw s0, 0(sp)
addi s0, sp, 8 addi s0, sp, 8
mv a2, a1 mv a2, a0
mv a1, a0
li a0, STDOUT li a0, STDOUT
li a7, SYS_WRITE li a7, SYS_WRITE
ecall ecall
@ -244,53 +248,87 @@ _divide_by_zero_error:
ecall ecall
ret ret
# a0 - Whole number. # Writes a number to a string buffer.
#
# t0 - Local buffer.
# t1 - Constant 10. # t1 - Constant 10.
# a1 - Local buffer.
# t2 - Current character. # t2 - Current character.
# t3 - Whether the number is negative. # t3 - Whether the number is negative.
.type printi, @function #
_printi: # Parameters:
addi sp, sp, -16 # a0 - Whole number.
sw s0, 0(sp) # a1 - Buffer pointer.
sw ra, 4(sp) #
addi s0, sp, 16 # Sets a0 to the length of the written number.
addi t1, zero, 10 .type _print_i, @function
addi a1, s0, -1 _print_i:
addi sp, sp, -32
sw ra, 28(sp)
sw s0, 24(sp)
addi s0, sp, 32
addi t3, zero, 0 li t1, 10
bge a0, zero, .digit10 addi t0, s0, -9
addi t3, zero, 1
sub a0, zero, a0
.digit10: li t3, 0
bgez a0, .Lprint_i_digit10
li t3, 1
neg a0, a0
.Lprint_i_digit10:
rem t2, a0, t1 rem t2, a0, t1
addi t2, t2, '0' addi t2, t2, '0'
sb t2, 0(a1) sb t2, 0(t0)
div a0, a0, t1 div a0, a0, t1
addi a1, a1, -1 addi t0, t0, -1
bne zero, a0, .digit10 bne zero, a0, .Lprint_i_digit10
beq zero, t3, .write_call beq zero, t3, .Lprint_i_write_call
addi t2, zero, '-' addi t2, zero, '-'
sb t2, 0(a1) sb t2, 0(t0)
addi a1, a1, -1 addi t0, t0, -1
.write_call: .Lprint_i_write_call:
addi a0, zero, 1 mv a0, a1
addi a1, a1, 1 addi a1, t0, 1
sub a2, s0, a1 sub a2, s0, t0
addi a7, zero, 64 # write addi a2, a2, -9
ecall sw a2, 0(sp)
lw s0, 0(sp) call _memcpy
lw ra, 4(sp)
addi sp, sp, 16 lw a0, 0(sp)
lw ra, 28(sp)
lw s0, 24(sp)
addi sp, sp, 32
ret
# Writes a number to the standard output.
#
# Parameters:
# a0 - Whole number.
.type _write_i, @function
_write_i:
addi sp, sp, -32
sw ra, 28(sp)
sw s0, 24(sp)
addi s0, sp, 32
addi a1, sp, 0
call _print_i
addi a1, sp, 0
call _write_s
lw ra, 28(sp)
lw s0, 24(sp)
addi sp, sp, 32
ret ret
# Writes a character from a0 into the standard output. # Writes a character from a0 into the standard output.
.type _put_char, @function .type _write_c, @function
_put_char: _write_c:
# Prologue # Prologue
addi sp, sp, -16 addi sp, sp, -16
sw ra, 12(sp) sw ra, 12(sp)
@ -560,3 +598,33 @@ _mmap:
ecall ecall
ret ret
# Sets the a0 to the current position in the source text (s1).
.type _current, @function
_current:
mv a0, s1
ret
# Advances the position of the source text.
#
# Parameters:
# a0 - The number of bytes to advance.
.type _advance, @function
_advance:
add s1, s1, a0
ret
# Advances the global label counter by 1 setting a0 to the previous value.
#
# Parameters:
# a0 - If it is 0, resets the counter to 1.
.type _label_counter, @function
_label_counter:
bnez a0, .Llabel_counter_advance
li s2, 0
.Llabel_counter_advance:
mv a0, s2
addi s2, s2, 1
ret

View File

@ -62,5 +62,7 @@
# #
.equ TYPE_PRIMITIVE, 0x01 .equ TYPE_PRIMITIVE, 0x01
.equ TYPE_POINTER, 0x02 .equ TYPE_POINTER, 0x02
.equ TYPE_PROCEDURE, 0x03
.equ INFO_PARAMETER, 0x10 .equ INFO_PARAMETER, 0x10
.equ INFO_LOCAL, 0x20 .equ INFO_LOCAL, 0x20
.equ INFO_PROCEDURE, 0x30

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -3,8 +3,8 @@
# obtain one at https://mozilla.org/MPL/2.0/. # obtain one at https://mozilla.org/MPL/2.0/.
.global symbol_table .global symbol_table
.global symbol_table_build, symbol_table_find, symbol_table_insert, symbol_table_dump .global symbol_table_build, symbol_table_lookup, symbol_table_enter, symbol_table_dump
.global symbol_table_make_pointer, symbol_table_make_parameter, symbol_table_make_local .global symbol_table_make_pointer, symbol_table_make_parameter, symbol_table_make_local, symbol_table_make_procedure
.include "boot/definitions.inc" .include "boot/definitions.inc"
@ -101,8 +101,8 @@ symbol_table_dump:
# a1 - Pointer to the symbol name. # a1 - Pointer to the symbol name.
# #
# Sets a0 to the symbol info pointer or 0 if the symbol has not been found. # Sets a0 to the symbol info pointer or 0 if the symbol has not been found.
.type symbol_table_find, @function .type symbol_table_lookup, @function
symbol_table_find: symbol_table_lookup:
# Prologue. # Prologue.
addi sp, sp, -32 addi sp, sp, -32
sw ra, 28(sp) sw ra, 28(sp)
@ -121,8 +121,8 @@ symbol_table_find:
lw s2, 0(s1) lw s2, 0(s1)
addi s1, s1, 4 # Advance to the first symbol in the table. addi s1, s1, 4 # Advance to the first symbol in the table.
.Lsymbol_table_find_loop: .Lsymbol_table_lookup_loop:
beqz s2, .Lsymbol_table_find_not_found beqz s2, .Lsymbol_table_lookup_not_found
# Compare string lengths. # Compare string lengths.
mv a0, s3 mv a0, s3
@ -131,20 +131,20 @@ symbol_table_find:
lw a3, 4(s1) lw a3, 4(s1)
call _string_equal call _string_equal
beqz a0, .Lsymbol_table_find_continue beqz a0, .Lsymbol_table_lookup_continue
lw a0, 8(s1) # Pointer to the symbol. lw a0, 8(s1) # Pointer to the symbol.
j .Lsymbol_table_find_end j .Lsymbol_table_lookup_end
.Lsymbol_table_find_continue: .Lsymbol_table_lookup_continue:
addi s1, s1, 12 addi s1, s1, 12
addi s2, s2, -1 addi s2, s2, -1
j .Lsymbol_table_find_loop j .Lsymbol_table_lookup_loop
.Lsymbol_table_find_not_found: .Lsymbol_table_lookup_not_found:
li a0, 0 li a0, 0
.Lsymbol_table_find_end: .Lsymbol_table_lookup_end:
lw s1, 20(sp) lw s1, 20(sp)
lw s2, 16(sp) lw s2, 16(sp)
lw s3, 12(sp) lw s3, 12(sp)
@ -208,14 +208,32 @@ symbol_table_make_local:
li a0, 12 li a0, 12
ret ret
# Creates a procedure type and procedure info objects refering the type.
#
# Parameters:
# a0 - Output memory.
#
# Sets a0 to the size of newly created info object in bytes.
.type symbol_table_make_procedure, @function
symbol_table_make_procedure:
li t0, TYPE_PROCEDURE
sw t0, 8(a0)
li t0, INFO_PROCEDURE
sw t0, 0(a0)
sw a0, 4(a0) # Procedure type stored in the same memory segment.
li a0, 12
ret
# Inserts a symbol into the table. # Inserts a symbol into the table.
# #
# Parameters: # Parameters:
# a0 - Symbol name length. # a0 - Symbol name length.
# a1 - Symbol name pointer. # a1 - Symbol name pointer.
# a2 - Symbol pointer. # a2 - Symbol pointer.
.type symbol_table_insert, @function .type symbol_table_enter, @function
symbol_table_insert: symbol_table_enter:
la t0, symbol_table la t0, symbol_table
lw t1, 0(t0) # Current table length. lw t1, 0(t0) # Current table length.
@ -250,27 +268,27 @@ symbol_table_build:
li a0, 3 # Length of the word "Int". li a0, 3 # Length of the word "Int".
la a1, symbol_builtin_name_int la a1, symbol_builtin_name_int
la a2, symbol_builtin_type_int la a2, symbol_builtin_type_int
call symbol_table_insert call symbol_table_enter
li a0, 4 # Length of the word "Word". li a0, 4 # Length of the word "Word".
la a1, symbol_builtin_name_word la a1, symbol_builtin_name_word
la a2, symbol_builtin_type_word la a2, symbol_builtin_type_word
call symbol_table_insert call symbol_table_enter
li a0, 4 # Length of the word "Byte". li a0, 4 # Length of the word "Byte".
la a1, symbol_builtin_name_byte la a1, symbol_builtin_name_byte
la a2, symbol_builtin_type_byte la a2, symbol_builtin_type_byte
call symbol_table_insert call symbol_table_enter
li a0, 4 # Length of the word "Char". li a0, 4 # Length of the word "Char".
la a1, symbol_builtin_name_char la a1, symbol_builtin_name_char
la a2, symbol_builtin_type_char la a2, symbol_builtin_type_char
call symbol_table_insert call symbol_table_enter
li a0, 4 # Length of the word "Bool". li a0, 4 # Length of the word "Bool".
la a1, symbol_builtin_name_bool la a1, symbol_builtin_name_bool
la a2, symbol_builtin_type_bool la a2, symbol_builtin_type_bool
call symbol_table_insert call symbol_table_enter
# Epilogue. # Epilogue.
lw ra, 12(sp) lw ra, 12(sp)

View File

@ -1,14 +1,14 @@
program program
proc _main(x: Word) proc main(x: Word, y: Word)
var loca0: Word
loca4: Word
begin begin
loca0 := 0x0a2c3061; _write_s(4, @x);
loca4 := x; _write_s(4, @y);
_write_out(@loca4, 4)
y := 0x0a2c3063;
_write_s(4, @y)
end end
begin begin
_main() main(0x0a2c3061, 0x0a2c3062)
end. end.