Адрес загрузки и строки, Mars Mips

Я знаю, что это может быть глупый вопрос, но я просто хочу быть уверенным в этом. Могу ли я использовать функцию адреса загрузки (la), не имея .data в моей программе? Если нет, я могу попросить пользователя ввести строку в части .data, чтобы я мог использовать адрес загрузки для получения той строки, которую ввел пользователь?

Прямо сейчас я пытаюсь создать шифрование, например, пользователь вводит строку и вводит целое число. Это целое число будет складывать каждый символ в строке с тем целым числом, которое они ввели. Если я не могу выполнить какой-либо из этих вариантов, может ли кто-нибудь указать мне правильное направление, как это сделать.

Спасибо, что нашли время, чтобы прочитать это.


person Rubert    schedule 24.09.2015    source источник
comment
Почему бы просто не попробовать и не посмотреть, работает ли?   -  person Michael    schedule 24.09.2015
comment
Потому что на компьютере, который я использовал в то время, не было Mars Mips.   -  person Rubert    schedule 24.09.2015
comment
Также не помешало бы понять, что происходит, когда я выполняю эти действия. Я мог бы сам проверить программу, но, возможно, неправильно представляю, что происходит. Я просто хочу убедиться, что мои наблюдения не ошибочны.   -  person Rubert    schedule 24.09.2015


Ответы (1)


Сначала немного терминологии: la - это не функция, это инструкция. На самом деле это псевдо-инструкция, что означает, что она фактически не существует в наборе инструкций MIPS, и ассемблер переведет ее за вас в одну или несколько инструкций MIPS.

Итак, la на самом деле не имеет ничего общего с разделом .data. Его цель - просто загрузить адрес некоторого символа в регистр. Так что это совершенно законно:

.text
main:
la $t0,main  # load the address of main into $t0

Однако, если вы собираетесь писать по адресу, который вы получили с помощью la, вы обычно хотите, чтобы этот адрес находился где-нибудь в доступном для записи разделе вашей программы, например, .data или .bss.

должен ли пользователь ввести строку в части .data, чтобы я мог использовать адрес загрузки для извлечения этой строки, введенной пользователем?

Вам нужно только перезагрузить адрес, если регистр, содержащий его, будет перезаписан. Если вы прочитаете документацию по системным вызовам MARS, вы увидите, что он говорит:

Системный вызов не влияет на содержимое регистров MIPS, за исключением регистров результатов, как указано в таблице ниже.

А системный вызов read_string не дал результата, так что это нормально:

.data
foo: .space 32
.text
main:
la $a0,foo
li $a1,32
li $v0,8
syscall    # read_string
# $a0 still contains the address of foo here
li $v0,4
syscall    # print_string
person Michael    schedule 24.09.2015
comment
Большое спасибо за разъяснение! - person Rubert; 24.09.2015