0

因为我“非法”使用加载地址将目标寄存器设置为 s 寄存器内容,所以我的家庭作业得分被退回到 8/10 分。下面显示的是有问题的操作:

la  $t1, ($t0)  

$t0 持有一个十六进制单词,我们将其转换为十进制,但这并不重要。MARS(我们用于汇编语言类的 MIPS 模拟器)在您键入 la 时会建议:

"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
4

1 回答 1

4

la是伪指令。这种形式在你的汇编器中可能不是非法的,但它肯定是没有意义的。 la不访问内存,它只是加载第二个操作数的地址。

gnu 汇编器 ( gas) 在您的指令中说Error:Expression too complex.

如果($t0)允许(例如在 MARS 和 clang 的内置汇编程序中),($t0)那么$t0您所拥有的只是一个寄存器到寄存器的副本,您应该使用move它(这是另一个通常得到的伪指令)翻译成addu $dst, $src, $0)。

move $dst, $src伪指令适用于所有 MIPS 汇编程序,并且对人类读者具有正确的语义含义。

la用于将符号地址放入寄存器的预期目的,
la $t0, my_static_data.

于 2014-11-06T00:48:56.257 回答