2014-11-06 69 views
0

因爲我「非法」使用加載地址來將目標寄存器設置爲s寄存器內容,所以我得到了一份分級爲8/10分的作業分配。下面顯示的是操作問題:爲什麼在MIPS中使用帶有寄存器間接操作數的「la」是非法的?

la $t1, ($t0) 

$ T0拿着它我們轉換成十進制十六進制字,但是這並不重要。 MARS(我們使用匯編語言類MIPS模擬器)表明,這時候你Ia型:

「LA $ T1,($ T2)加載地址:設置$ 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

嗯,我想知道爲什麼MARS甚至會允許我這麼做。非常詳盡的答案,我現在明白了! – nethageraba 2014-11-07 06:37:00

相關問題