2014-11-06 6 views
0

У меня было задание домашней работы обратно в 8/10 баллов, потому что я «незаконно» использовал адрес загрузки, чтобы установить регистр назначения в содержимое регистра s. Ниже показана операция в вопросе:Почему запрещается использовать «la» с регистровым косвенным операндом в MIPS?

la $t1, ($t0) 

$ t0 держал шестнадцатеричное слово, которое мы должны были преобразовать в десятичную, но это не важно. MARS (имитатор MIPS мы используем для класса ассемблера) предполагает, что это, когда вы набираете LA:

"л $ ​​t1, ($ t2) Load Address: Set $ ​​t1 к содержанию $ t2"

Она просто что он сказал всему классу (кто все сделал то же самое), что он был незаконным, а затем я показал ей, как MARS предложила эту инструкцию. Программа работает нормально и включена здесь:

Итак, мой длинный вопрос: это действительно незаконно, или она просто не знает, о чем она говорит?

# Project/Class Description: 
# Formats an IP address from a value in memory 
# using shifts and AND operations. 
# 
.data 
inHex: .asciiz "IP Address in Hex: " 
header: .asciiz "\nFormatted IP Address: " 

IPinHex: .word 0x58dc45c3 
dot: .asciiz "." 

.text globl 

main: 
li $v0, 4  # print hex header 
la $a0, inHex 
syscall 

la $t0, IPinHex 
li $v0, 34  # print hex number 
lw $a0, ($t0) 
syscall 

li $v0, 4  # print int header 
la $a0, header 
syscall 

la $t0, IPinHex  
lw $t0, ($t0) # IP address in hex 

li $t5, 0xff000000 # AND value 
li $t6, 24  # shiftAmt 
li $t7, 3  # loop count 

loop:    
addi $t7, $t7, -1 # count-- 
la $t1, ($t0) 
and $t1, $t1, $t5 # isolate chunk of hex number 
srlv $t1, $t1, $t6 # shift down to the right 

li $v0, 1  # print int 
la $a0, ($t1) 
syscall 

li $v0, 4  # print a "." 
la $a0, dot 
syscall 

srl $t5, $t5, 8 # shift AND value for next iteration 
addi $t6, $t6, -8 # shiftAmt-= 8 

bnez $t7, loop # while (loop!=0) 


la $t1, ($t0) # print last int 
and $t1, $t1, $t5 # isolate chunk of hex number 

li $v0, 1  # print int 
la $a0, ($t1) 
syscall   

exit:    # exit() 
li $v0, 10  
syscall 

ответ

3

la является псевдоинструкцией. Эта форма не может быть незаконной в вашем ассемблере, но это, безусловно, бессмысленно. la не получает доступ к памяти, он просто загружает адрес второго операнда (который обычно должен быть константой, ассемблер gnu зажимает вашу инструкцию, говоря Error:Expression too complex). Если это разрешено, адрес ($t0), конечно, $t0, так что у вас есть только копия для регистрации, для которой вы должны использовать move (что является еще одной псевдоинструкцией, которая обычно переводится на addu $dst, $src, $0).

+0

Хм, интересно, почему МАРС даже позволил мне это сделать. Спасибо за очень тщательный ответ, я понял это сейчас! – nethageraba