因爲我「非法」使用加載地址來將目標寄存器設置爲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
嗯,我想知道爲什麼MARS甚至會允許我這麼做。非常詳盡的答案,我現在明白了! – nethageraba 2014-11-07 06:37:00