.text
main: la $a0, A #loads address of A into $a0
li $t0, 1 #loads 1 into $t0
sw $t0, ($a0) #stores word from $a0 into $t0
li $t0, 2 #loads 2 into $t0
sw $t0, 4($a0)
li $t0, 3
sw $t0, 8($a0)
li $t0, 4
sw $t0, 12($a0)
la $a1, A
li $v0, 1
lw $a0, ($a1)
syscall
lw $a0, 4($a1)
syscall
lw $a0, 8($a1)
syscall
lw $a0, 12($a1)
syscall
la $a0, tab
li $v0, 4
syscall
li $v0, 10
syscall
.data
A: .space 16 #array size 16
tab: .asciiz "\t" #makes line indentation
#stores 1 - 4 into $t0在我看来,它将A的地址加载到a0中,然后将'1‘加载到$t0中,然后通过将数组存储到其中来重写?!?$t0。然后将2加载到$t0中,然后我不确定4应该做什么(就我所见,不做任何事情,然后将$t0加载到3中,然后与'4’相同。不知道8做了什么,然后将4加载到$t0中,然后对12执行某些操作,然后将A的地址加载到$a1中,并打印出来?!?我对这个程序的其余部分完全迷失了。程序是正确的(加载"1234"),但我应该通过理解每个课程讲师给出的程序来学习MIPS。这不是家庭作业,只是学习MIPS程序是如何工作的。
发布于 2012-04-20 00:50:28
程序首先存储从A地址开始的常量1,2,3,4,然后它只打印这四个字的内容。
指令sw reg1, offset(reg2)将寄存器reg1的内容存储到reg2指向的地址加上指定的可选偏移量。
因此,在您的第一个示例中,sw $t0, ($a0)将把$t0的内容存储在$a0所指向的地址中,在您的示例中,该地址是标签A的地址。
然后它使用4的倍数作为偏移量,因为您存储的是字,而每个字恰好占用4个字节,因此要存储连续字的数字1、2、3、4,必须将4加到每个先前的地址。
发布于 2012-04-20 00:01:13
它看起来像是一个展开的循环。第一个循环设置数组的内容,第二个循环打印出数组的内容,后跟一个制表符。下面是我假设的伪代码:
function main()
{
i = 1
while( i <= 4 )
{
A[i-1] = i
i = i + 1
}
i = 1
while( i <= 4 )
{
printToConsole( A[i-1] )
i = i + 1
}
printToConsole( tab )
}当代码被汇编时,汇编程序可能会展开循环以提高性能。
https://stackoverflow.com/questions/10225455
复制相似问题