diff options
| author | Eugen Wissner <belka@caraus.de> | 2025-05-08 23:36:29 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2025-05-08 23:36:29 +0200 |
| commit | 92f50fff5f8a9ec2db03cc57dbf00a43e64943bf (patch) | |
| tree | 0bb225b4468ff9a9b7f6ad34e38e9bef5b692b11 /boot/symbol.s | |
| parent | 3f11d63a0f86191f010bc0093ee8616c154d9a1b (diff) | |
| download | elna-92f50fff5f8a9ec2db03cc57dbf00a43e64943bf.tar.gz | |
Parse procedure parameters
Diffstat (limited to 'boot/symbol.s')
| -rw-r--r-- | boot/symbol.s | 66 |
1 files changed, 65 insertions, 1 deletions
diff --git a/boot/symbol.s b/boot/symbol.s index 66409aa..a927b0e 100644 --- a/boot/symbol.s +++ b/boot/symbol.s @@ -2,7 +2,7 @@ # v. 2.0. If a copy of the MPL was not distributed with this file, You can # obtain one at https://mozilla.org/MPL/2.0/. -.global symbol_table_build +.global symbol_table_build, symbol_table_find .include "boot/definitions.inc" @@ -49,6 +49,70 @@ symbol_table: .zero SYMBOL_PRIME .section .text +# Searches for a symbol by name. +# +# Parameters: +# a0 - Local symbol table or 0. +# a1 - Length of the symbol to search. +# a2 - Pointer to the symbol name. +# +# Sets a0 to the symbol info. +.type symbol_table_find, @function +symbol_table_find: + # Prologue. + addi sp, sp, -32 + sw ra, 28(sp) + sw s0, 24(sp) + addi s0, sp, 32 + + sw s1, 20(sp) # Current symbol in the table. + sw s2, 16(sp) # Symbol table length. + sw s3, 12(sp) # Length of the symbol to search. + sw s4, 8(sp) # Pointer to the symbol to search. + + mv s3, a1 + mv s4, a2 + + la s1, symbol_table + 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 + + # Compare string lengths. + lw a2, 0(s1) + bne s3, a2, .Lsymbol_table_find_continue + + # If lengths match, compare the content. + mv a0, s4 + lw a1, 4(s1) + call _memcmp + + bnez a0, .Lsymbol_table_find_continue + + lw a0, 8(s1) # Pointer to the symbol. + j .Lsymbol_table_end + +.Lsymbol_table_find_continue: + addi s2, s2, -1 + j .Lsymbol_table_find_loop + +.Lsymbol_table_find_not_found: + li a0, 0 + +.Lsymbol_table_end: + lw s1, 20(sp) + lw s2, 16(sp) + lw s3, 12(sp) + lw s4, 8(sp) + + # Epilogue. + lw ra, 28(sp) + lw s0, 24(sp) + addi sp, sp, 32 + ret + # Build the initial symbols. # # Sets a0 to the pointer to the global symbol table. |
