MIPS (MARS Simulator) - Как хранить строковые литералы времени компиляции в куче - PullRequest
0 голосов
/ 03 февраля 2020

После изучения того, что .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, ни один из которых не относится к этой проблеме.

1 Ответ

0 голосов
/ 03 февраля 2020

Возможно ли сохранение строки значения времени компиляции в куче без использования .data?

Не совсем. По определению, куча концептуально пуста при запуске программы. И, также, по определению, строковые литералы являются константами, инициализированными в разделе данных. Вы можете выделить пространство кучи только во время выполнения, а не во время компиляции; Итак, во время выполнения вы можете выделить пространство кучи и переместить строки из литеральных данных в кучу ...


Однако, давайте заметим, что MARS и QtSPIM допускают аргумент для .data, который является местом, где разместить последующий контент. Например, мы можем сделать .data 0x10040000, что приведет к тому, что последующие строковые литералы будут размещены там, например. Однако это будет мешать нормальной работе кучи, так как ваш первый системный вызов sbrk по-прежнему будет возвращать 0x10040000, память, занятая строковыми литералами, размещенными там с использованием .data 0x10040000, так как системный вызов sbrk не знает о директиве.


Определение длины строки как функции вместо макроса, вероятно, будет больше, чем вы хотите в долгосрочной перспективе:

  • вы можете определить длину строки, локальную строку или строка, основанная на куче,
  • ваши соглашения о регистрах попадут в обычное соглашение о вызовах (не уверен, что даже есть соглашение о регистрах для макросов),
  • вы разделите проблемы строкового литерала объявление из операции длины строки.
...