2016-09-25 3 views
0

У меня есть два вопроса:MIPS «ли» инструкция псевдо загружает адрес литерала

1)> Что происходит в инструкции псевда линейный 2.The «La» ссылается загрузить адрес, а не буквальный «3444 «Должна была быть ярлык. Как он может загрузить адрес литера.

2)> если вы замените строку 3 на« li $ a0 3444 », которая загружает 3444 в регистр # a0 вместо адреса. вывод все тот же. Что я хочу спросить, так это то, как syscall знает, что в # a0 является адресом переменной или самой переменной. Как могла бы подпрограмма для печати целого работала правильно, сохранялся ли аргумент в # a0 - адрес или целочисленное значение itse низкая частота

.text 

     li $v0 1 
>>2 la $a0 3444 # When i replace 3444 literal with the label 'anint' it makes sense and the output of course is the same 
     syscall 


.data 

anint: .word 3444 

Выход:

3444 

UPDATE # 2: Я could'nt разместить код в комментариях так ...

IF-ли (адрес загрузки) и литий (нагрузка немедленная) оба переводят на ту же инструкцию, то есть загружают литерал в # a0, а затем объясняют строку 3 из сегмента кода ниже.

 .text 


     li #v0 4 
>>3 la #a0 msg #This loads the address of the label 'msg in #a0' not the label itself  
     syscall 





     .data 

     msg: .asciiz "This is a long string that can't be saved in the register!" 
+0

Вы не должны пытаться публиковать код в комментариях в любом случае. Редактирование разъяснений в вашем ответе - правильная вещь. –

+0

Этикетки - это адреса. Они не «хранятся» в любом месте, они просто полезные способы писать адреса символически, а не с числовыми адресами. –

ответ

2

как мог SYSCALL знать, что в # а0 это адрес переменной или самого

переменной Это не делает. Системный вызов 1 в SPIM/MARS всегда печатает значение в $a0.

li $a0,3444 и la $a0,3444 переводятся в одно и то же (некоторые инструкции, которая загружает значение 3334 в регистр $a0, такие как ori $a0, $0, 3334).

+0

Пожалуйста, обратитесь к UPDATE по моему вопросу. Ваш ответ, похоже, противоречит тому, что я обновил. –

+0

Совсем нет. Метка _is_ адрес (ну, символическое имя для некоторого адреса). – Michael

+0

Конфликтная часть находится в строке 3 из сегмента кода обновления, где в соответствии с вашим заявлением «la # a0 msg» загружает значение в регистре # a0, что невозможно, поскольку строковое значение является таким ... большим. Вместо этого он загружает адрес строки в # a0. Ваш ответ кажется логичным для моего исходного вопроса, но в этом случае конфликтует –

Смежные вопросы