После изучения того, что .macro
s было в MARS, я решил сделать несколько, чтобы сделать мой исходный код более читабельным.
Примером такого макроса является мой str ing len gth макрос:
#Gets the length of a string from an address
#Result is in the second operand
#Doesn't count any null-terminators or newlines at the end of the input
#Call example: strlen MyString,$s0
.macro strlen(%str, %i)
la $t0,%str
__strlen_loop:
lb $t1,0($t0)
#Exit the loop if this byte is null ('\0') or a newline ('\n')
beqz $t1,__strlen_end
beq $t1,'\n',__strlen_end
inc $t0 #Increment-by-one macro
j __strlen_loop
__strlen_end:
la $t1,%str
sub %i,$t0,$t1
.end_macro
Этот макрос работает, но для его работы требуется предопределенный адрес (%str
).
Чтобы попытаться устранить эту проблему, я создал следующий str ing len gth для v макро строки alue:
#Gets the string length of a value string (stores the string in .data)
#Call example: strlen_v "Hello World!",$s0
.macro strlen_v(%str,%i)
#Create a label for the string
.data
__strlen_v_label: .asciiz %str
.text
#Get the length
strlen __strlen_v_label,%i
.end_macro
К сожалению, есть другая проблема. Во втором макросе строка значения хранится в .data
, который имеет только пробел 0x30000
слов (от адреса 0x10010000
до адреса 0x10040000
).
Было бы предпочтительно сохранить строку значения в куча вместо этого, так как в ней гораздо больше места и Я смогу более эффективно управлять памятью.
Сохраняет строку значения времени компиляции в куче возможно без с использованием .data
? Единственные примеры, которые я нашел, были для строк пользовательского ввода и строк, уже сохраненных в .data
, ни один из которых не относится к этой проблеме.