Compare commits
3 Commits
707f983fe9
...
assembly
Author | SHA1 | Date | |
---|---|---|---|
e614d43ea9
|
|||
1b31f532df
|
|||
d85183c7a6
|
@ -3,10 +3,10 @@
|
||||
# obtain one at https://mozilla.org/MPL/2.0/.
|
||||
|
||||
.global _is_alpha, _is_digit, _is_alnum, _is_upper, _is_lower
|
||||
.global _write_out, _read_file, _write_error, _put_char, _printi
|
||||
.global _get, _memcmp, _memchr, _memmem, _memcpy
|
||||
.global _divide_by_zero_error, _exit, _mmap
|
||||
.global _strings_index, _string_equal
|
||||
.global _write_s, _read_file, _write_error, _write_c, _write_i, _print_i
|
||||
.global _memcmp, _memchr, _memmem, _memcpy, _mmap
|
||||
.global _current, _get, _advance, _label_counter
|
||||
.global _divide_by_zero_error, _exit, _strings_index, _string_equal
|
||||
|
||||
.section .rodata
|
||||
|
||||
@ -175,16 +175,20 @@ _is_alnum:
|
||||
addi sp, sp, 16
|
||||
ret
|
||||
|
||||
.type _write_out, @function
|
||||
_write_out:
|
||||
# Writes a string to the standard output.
|
||||
#
|
||||
# Parameters:
|
||||
# a0 - Length of the string.
|
||||
# a1 - String pointer.
|
||||
.type _write_s, @function
|
||||
_write_s:
|
||||
# Prologue.
|
||||
addi sp, sp, -8
|
||||
sw ra, 4(sp)
|
||||
sw s0, 0(sp)
|
||||
addi s0, sp, 8
|
||||
|
||||
mv a2, a1
|
||||
mv a1, a0
|
||||
mv a2, a0
|
||||
li a0, STDOUT
|
||||
li a7, SYS_WRITE
|
||||
ecall
|
||||
@ -244,53 +248,87 @@ _divide_by_zero_error:
|
||||
ecall
|
||||
ret
|
||||
|
||||
# a0 - Whole number.
|
||||
# Writes a number to a string buffer.
|
||||
#
|
||||
# t0 - Local buffer.
|
||||
# t1 - Constant 10.
|
||||
# a1 - Local buffer.
|
||||
# t2 - Current character.
|
||||
# t3 - Whether the number is negative.
|
||||
.type printi, @function
|
||||
_printi:
|
||||
addi sp, sp, -16
|
||||
sw s0, 0(sp)
|
||||
sw ra, 4(sp)
|
||||
addi s0, sp, 16
|
||||
addi t1, zero, 10
|
||||
addi a1, s0, -1
|
||||
#
|
||||
# Parameters:
|
||||
# a0 - Whole number.
|
||||
# a1 - Buffer pointer.
|
||||
#
|
||||
# Sets a0 to the length of the written number.
|
||||
.type _print_i, @function
|
||||
_print_i:
|
||||
addi sp, sp, -32
|
||||
sw ra, 28(sp)
|
||||
sw s0, 24(sp)
|
||||
addi s0, sp, 32
|
||||
|
||||
addi t3, zero, 0
|
||||
bge a0, zero, .digit10
|
||||
addi t3, zero, 1
|
||||
sub a0, zero, a0
|
||||
li t1, 10
|
||||
addi t0, s0, -9
|
||||
|
||||
.digit10:
|
||||
li t3, 0
|
||||
bgez a0, .Lprint_i_digit10
|
||||
li t3, 1
|
||||
neg a0, a0
|
||||
|
||||
.Lprint_i_digit10:
|
||||
rem t2, a0, t1
|
||||
addi t2, t2, '0'
|
||||
sb t2, 0(a1)
|
||||
sb t2, 0(t0)
|
||||
div a0, a0, t1
|
||||
addi a1, a1, -1
|
||||
bne zero, a0, .digit10
|
||||
addi t0, t0, -1
|
||||
bne zero, a0, .Lprint_i_digit10
|
||||
|
||||
beq zero, t3, .write_call
|
||||
beq zero, t3, .Lprint_i_write_call
|
||||
addi t2, zero, '-'
|
||||
sb t2, 0(a1)
|
||||
addi a1, a1, -1
|
||||
sb t2, 0(t0)
|
||||
addi t0, t0, -1
|
||||
|
||||
.write_call:
|
||||
addi a0, zero, 1
|
||||
addi a1, a1, 1
|
||||
sub a2, s0, a1
|
||||
addi a7, zero, 64 # write
|
||||
ecall
|
||||
.Lprint_i_write_call:
|
||||
mv a0, a1
|
||||
addi a1, t0, 1
|
||||
sub a2, s0, t0
|
||||
addi a2, a2, -9
|
||||
sw a2, 0(sp)
|
||||
|
||||
lw s0, 0(sp)
|
||||
lw ra, 4(sp)
|
||||
addi sp, sp, 16
|
||||
call _memcpy
|
||||
|
||||
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
|
||||
|
||||
# Writes a character from a0 into the standard output.
|
||||
.type _put_char, @function
|
||||
_put_char:
|
||||
.type _write_c, @function
|
||||
_write_c:
|
||||
# Prologue
|
||||
addi sp, sp, -16
|
||||
sw ra, 12(sp)
|
||||
@ -560,3 +598,33 @@ _mmap:
|
||||
ecall
|
||||
|
||||
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
|
||||
|
@ -62,5 +62,7 @@
|
||||
#
|
||||
.equ TYPE_PRIMITIVE, 0x01
|
||||
.equ TYPE_POINTER, 0x02
|
||||
.equ TYPE_PROCEDURE, 0x03
|
||||
.equ INFO_PARAMETER, 0x10
|
||||
.equ INFO_LOCAL, 0x20
|
||||
.equ INFO_PROCEDURE, 0x30
|
||||
|
832
boot/stage1.s
832
boot/stage1.s
File diff suppressed because it is too large
Load Diff
595
boot/stage2.elna
595
boot/stage2.elna
File diff suppressed because it is too large
Load Diff
@ -3,8 +3,8 @@
|
||||
# obtain one at https://mozilla.org/MPL/2.0/.
|
||||
|
||||
.global symbol_table
|
||||
.global symbol_table_build, symbol_table_find, symbol_table_insert, symbol_table_dump
|
||||
.global symbol_table_make_pointer, symbol_table_make_parameter, symbol_table_make_local
|
||||
.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, symbol_table_make_procedure
|
||||
|
||||
.include "boot/definitions.inc"
|
||||
|
||||
@ -101,8 +101,8 @@ symbol_table_dump:
|
||||
# a1 - Pointer to the symbol name.
|
||||
#
|
||||
# Sets a0 to the symbol info pointer or 0 if the symbol has not been found.
|
||||
.type symbol_table_find, @function
|
||||
symbol_table_find:
|
||||
.type symbol_table_lookup, @function
|
||||
symbol_table_lookup:
|
||||
# Prologue.
|
||||
addi sp, sp, -32
|
||||
sw ra, 28(sp)
|
||||
@ -121,8 +121,8 @@ symbol_table_find:
|
||||
lw s2, 0(s1)
|
||||
addi s1, s1, 4 # Advance to the first symbol in the table.
|
||||
|
||||
.Lsymbol_table_find_loop:
|
||||
beqz s2, .Lsymbol_table_find_not_found
|
||||
.Lsymbol_table_lookup_loop:
|
||||
beqz s2, .Lsymbol_table_lookup_not_found
|
||||
|
||||
# Compare string lengths.
|
||||
mv a0, s3
|
||||
@ -131,20 +131,20 @@ symbol_table_find:
|
||||
lw a3, 4(s1)
|
||||
call _string_equal
|
||||
|
||||
beqz a0, .Lsymbol_table_find_continue
|
||||
beqz a0, .Lsymbol_table_lookup_continue
|
||||
|
||||
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 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
|
||||
|
||||
.Lsymbol_table_find_end:
|
||||
.Lsymbol_table_lookup_end:
|
||||
lw s1, 20(sp)
|
||||
lw s2, 16(sp)
|
||||
lw s3, 12(sp)
|
||||
@ -208,14 +208,32 @@ symbol_table_make_local:
|
||||
li a0, 12
|
||||
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.
|
||||
#
|
||||
# Parameters:
|
||||
# a0 - Symbol name length.
|
||||
# a1 - Symbol name pointer.
|
||||
# a2 - Symbol pointer.
|
||||
.type symbol_table_insert, @function
|
||||
symbol_table_insert:
|
||||
.type symbol_table_enter, @function
|
||||
symbol_table_enter:
|
||||
la t0, symbol_table
|
||||
|
||||
lw t1, 0(t0) # Current table length.
|
||||
@ -250,27 +268,27 @@ symbol_table_build:
|
||||
li a0, 3 # Length of the word "Int".
|
||||
la a1, symbol_builtin_name_int
|
||||
la a2, symbol_builtin_type_int
|
||||
call symbol_table_insert
|
||||
call symbol_table_enter
|
||||
|
||||
li a0, 4 # Length of the word "Word".
|
||||
la a1, symbol_builtin_name_word
|
||||
la a2, symbol_builtin_type_word
|
||||
call symbol_table_insert
|
||||
call symbol_table_enter
|
||||
|
||||
li a0, 4 # Length of the word "Byte".
|
||||
la a1, symbol_builtin_name_byte
|
||||
la a2, symbol_builtin_type_byte
|
||||
call symbol_table_insert
|
||||
call symbol_table_enter
|
||||
|
||||
li a0, 4 # Length of the word "Char".
|
||||
la a1, symbol_builtin_name_char
|
||||
la a2, symbol_builtin_type_char
|
||||
call symbol_table_insert
|
||||
call symbol_table_enter
|
||||
|
||||
li a0, 4 # Length of the word "Bool".
|
||||
la a1, symbol_builtin_name_bool
|
||||
la a2, symbol_builtin_type_bool
|
||||
call symbol_table_insert
|
||||
call symbol_table_enter
|
||||
|
||||
# Epilogue.
|
||||
lw ra, 12(sp)
|
||||
|
@ -1,14 +1,14 @@
|
||||
program
|
||||
|
||||
proc _main(x: Word)
|
||||
var loca0: Word
|
||||
loca4: Word
|
||||
proc main(x: Word, y: Word)
|
||||
begin
|
||||
loca0 := 0x0a2c3061;
|
||||
loca4 := x;
|
||||
_write_out(@loca4, 4)
|
||||
_write_s(4, @x);
|
||||
_write_s(4, @y);
|
||||
|
||||
y := 0x0a2c3063;
|
||||
_write_s(4, @y)
|
||||
end
|
||||
|
||||
begin
|
||||
_main()
|
||||
main(0x0a2c3061, 0x0a2c3062)
|
||||
end.
|
||||
|
Reference in New Issue
Block a user