我的家庭作业被归为8/10分,因为我非法"使用加载地址将目标寄存器设置为s寄存器内容。下面显示的是有问题的操作:
la $t1, ($t0)
$ t0持有一个十六进制字,我们将其转换为十进制,但这并不重要。当你输入la:
时,MARS(我们用于汇编语言类的MIPS模拟器)建议这样做" 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
答案 0 :(得分:4)
la
是伪指令。这种形式在你的汇编程序中可能并不违法,但它当然没有意义。 la
不访问内存,它只是加载第二个操作数的地址(通常必须是常量,gnu汇编程序在你的指令上扼杀Error:Expression too complex
)。如果允许,($t0)
的地址当然是$t0
,那么您所拥有的只是一个注册到注册的副本,您应该使用move
(这是另一个伪指令通常会转换为addu $dst, $src, $0
)。