2014-11-06 142 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

相关问题