Я новичок в сборке MIPS, я хочу написать процедуру, которая берет адрес памяти строки и адрес памяти другой подпрограммы обратного вызова. Эта процедура будет проходить через каждую букву в строке и для каждой буквы вызовет подпрограмму (это печатает значение ASCII каждой буквы). Псевдо-код будет выглядеть примерно так:Вызов подпрограммы для каждого символа в строке - MIPS
string_for_each(string, subroutine) {
for_each_character_in_string {
subroutine(address_of(character))
}
}
Это то, что мои рутинные выглядит как прямо сейчас:
string_for_each:
addi $sp, $sp, -4 # PUSH return address to caller
sw $ra, 0($sp)
jal loop
lw $ra, 0($sp) # Pop return address to caller
addi $sp, $sp, 4
jr $ra
loop:
lb $t1, 0($a0) # Get current character
beq $t1, $zero, end_for_each # Done when reaching NULL character
jr $a1 # Call callback subroutine
addi $a0, $a0, 1 # Increment to get next character in string
j loop
end_for_each:
jr $ra # Return to caller
Дело в том, что регистр $ a0 содержит адрес в строку, и $ a1 содержит адрес подпрограммы обратного вызова, а адрес текущего символа в строке, которая будет передана подпрограмме обратного вызова, также должна быть в $ a0. Как $ a0 может содержать как начальный адрес строки, так и текущий символ одновременно?
Подпрограмма обратного вызова:
ascii:
.data
STR_the_ascii_value_is:
.asciiz "\nAscii('X') = "
.text
la $t0, STR_the_ascii_value_is
# Replace X with the input character
add $t1, $t0, 8 # Position of X
lb $t2, 0($a0) # Get the Ascii value
sb $t2, 0($t1)
# Print "The Ascii value of..."
add $a0, $t0, $zero
li $v0, 4
syscall
# Append the Ascii value
add $a0, $t2, $zero
li $v0, 1
syscall
jr $ra
_ «? Как $ a0 содержать как начальный адрес строки и текущий символ в то же время» _ Почему не только увеличивает '$ a0' в конце каждая итерация? – Michael
Вам нужно будет сохранить '$ a0' и' $ a1' в другом месте (обычно стек) на время вызова подпрограммы. – Jester
@Michael Да, я пытался что-то вроде этого, чтобы перебирать строку: фунтов \t $ t1, 0 ($ a0) Beq $ t1, $ ноль, конец Адди $ a0, $ a0, 1 Но текущий символ хранится в $ t1 таким образом? – froli