Assembly MIPS加载单词和地址说明
我是汇编新手,正在处理有关在MIPS中加载单词和地址的作业。赋值是将两个单词加载到地址中,然后在另一个地址将两个单词减法生成第三个单词 在我学习了以前的编程类和编程语言之后,我喜欢尝试描绘幕后发生的事情,以便更好地理解调用的原因以及过程是如何执行的。我希望这是有道理的,但当我能概念化这个话题时,我似乎总是能更好地理解这些概念。但在加载单词和地址时,我仍然会遇到一个问题:为什么要使用Assembly MIPS加载单词和地址说明,assembly,mips,memory-address,cpu-registers,Assembly,Mips,Memory Address,Cpu Registers,我是汇编新手,正在处理有关在MIPS中加载单词和地址的作业。赋值是将两个单词加载到地址中,然后在另一个地址将两个单词减法生成第三个单词 在我学习了以前的编程类和编程语言之后,我喜欢尝试描绘幕后发生的事情,以便更好地理解调用的原因以及过程是如何执行的。我希望这是有道理的,但当我能概念化这个话题时,我似乎总是能更好地理解这些概念。但在加载单词和地址时,我仍然会遇到一个问题:为什么要使用$lw reg,int(reg)(其中int是正的还是负的)来指定单词的放置位置?我知道负数在你指定的地址之前,正数
$lw reg,int(reg)
(其中int
是正的还是负的)来指定单词的放置位置?我知道负数在你指定的地址之前,正数在后面。但由于某种原因,我不能完全理解这个话题。我在这里回顾了其他帖子,如:和。这在某种程度上对我来说是有意义的,但我仍然不完全理解何时使用它以及为什么使用它。为什么当我加载一个字、字节、半个字等时,我需要指定与特定寄存器相关的位置,为什么这很重要?(我知道这让我很无知,但我只是在学习,所以请容忍我)
下面是我收到的任务代码。现在这是可行的,但我认为我没有有效或正确地使用la
和lw
。所以对于我的第一个问题(实际上更多的是一个帮助),如果有人能批评我的简短程序并向我解释我应该如何正确使用这些指令,我将不胜感激
#Load address 'first' as a word containing decimal
#Load address 'second' as a word containing decimal
#subtract address second from address first and place it
#into address containing word 'result'
.data
first: .word 27
second: .word 8
result: .word 0
.text
#load address 'first' word
la $t0, first
lw $t1, 0($t0) #'0' here is probably wrong I'm guessing
#load address 'second' word
la $t2, second
lw $t3, 0($t2) #'0' here is probably wrong I'm guessing as well
#load address 'result' word
la $t4, result
#subtract contents of 'second' from 'first'
sub $t4, $t1, $t3
#move contents of 'result' and print
move $a0, $t4
li $v0, 1
syscall
#terminate program
li $v0, 10
syscall
现在由于某种原因,我可以理解何时需要打印地址的内容,使用la
加载我指定的地址的打印内容。我明白了。我想说,到目前为止,我已经用了98%的时间:la$a0,xxx
。这我理解。但是当结合使用lw
时,我需要在基于寄存器的项目放置位置指定一个整数,我会完全丢失
我的第二个问题与本作业的第二部分有关。现在,虽然我不是在问确切的答案,但我在寻找这部分含义的一些清晰或示例
我需要“存储结果后,用结果值覆盖第一个和第二个。在存储函数中使用常量偏移量来完成此操作。”现在我知道常量偏移量指的是(+/-)4的某个因子(如果我错了,请纠正我)。但我甚至不知道这意味着什么,我希望这是我没有完全理解
lw
和la
相关性的直接结果。在int(寄存器)
中的int
只是寄存器中添加的偏移量。在您的示例中,您可以执行la$t0,second
,然后执行0($t0)
来访问second
,或者您可以使用您知道它直接位于first
之后的事实,这样您就可以执行la$t0,首先执行然后执行4($t0)
来访问它。它对于处理数组或结构之类的东西更有用,因为它们的每个元素都没有标签。@Jester,对不起,我还是有点困惑。让我们先声明一下我做了la$t0
。如果我想给那个特定的地址分配一个单词$t0
,该如何设置<代码>lw$t0,0($t0)
?然后我可以简单地做la$t1,第二个lw$t1,4($t0)
?不完全确定您要声明的内容。lw
正在加载,而不是存储,您希望sw
这样做。您不需要la$t1,second
,关键是您可以寻址second
,知道它是first+4
。int(寄存器)
中的int
只是添加到寄存器中的偏移量。在您的示例中,您可以执行la$t0,second
,然后执行0($t0)
来访问second
,或者您可以使用您知道它直接位于first
之后的事实,这样您就可以执行la$t0,首先执行然后执行4($t0)
来访问它。它对于处理数组或结构之类的东西更有用,因为它们的每个元素都没有标签。@Jester,对不起,我还是有点困惑。让我们先声明一下我做了la$t0
。如果我想给那个特定的地址分配一个单词$t0
,该如何设置<代码>lw$t0,0($t0)
?然后我可以简单地做la$t1,第二个lw$t1,4($t0)
?不完全确定您要声明的内容。lw
正在加载,而不是存储,您希望sw
这样做。您不需要la$t1,second
,关键是您可以解决second
,知道它是first+4
。