2016-01-31 55 views
0

我正在为学校进行作业,部分作业正在通过各种MIPS指令进行排序,并确定它们是否对常量或变量起作用。我的问题与地址有关。我正在阅读我的教科书,我无法弄清楚地址是否被认为是常量或变量。我想说这是一个变数,但我不能确定。如果有人能够证明这对我很有帮助。MIPS地址解释

+0

这是一个相当普遍的问题,因为措辞。你有* constant *和* variable *的定义吗?这些将有助于指导我们一个有用的答案。在非哈佛架构中,所有的内存都是可写的,因此在某种意义上是“可变的”。但从程序的角度来看,有“程序部分”(psects)是只读的,其他的是可读/写的。 – wallyk

+0

因此,例如,确切的问题是关于指令“la”和问题状态“是否使用此指令加载常量或变量?”除此之外,我没有任何定义。 – Samuel

+0

另一个我感兴趣得到回答的问题是伪指令的格式类型是否来自伪指令“引擎盖下”的格式? – Samuel

回答

1

那么,给定上下文的用于在存储器中的指令通常的帧,一个通常认为指示自己是常量,尽管人们可以编写代码他们修改到其偶尔用于一些超优化目的的期望的效果—也用于病毒。不过,考虑到正常的情况下:

.data 
array1:  .space 12  # reserve 12 bytes for 3 integer array 

    .text 
__start: 
     la $t0, array1 # load array address 
     li $t1, 5   # $t1 = 5 ("load immediate") 
     sw $t1, ($t0)  # a[0] = 5 
     li $t1, 13  # $t1 = 13 
     addi $t0, t0, 4  # t0 = t0 + 4 
     sw $t1, ($t0)  # a[1] = 13 
     li $t1, -7  # $t1 = -7 
     sw $t1, 4($t0) # a[2] = -7 
     done 

因此,在该序列中,值5,图13,和-7是所述指令的一部分,并且通常被认为常数。另外,用于增加$ t0中地址指针的4也是一个常数。此外,一旦程序加载到内存中,array1的地址是恒定的,因为它不会改变。但是,在程序加载之前,其地址是而不是已知:加载程序分配了两个程序段(.data和.text)的地址分配。

+0

中清楚地给出了立即数。这非常有帮助。当我询问伪指令的格式类型时,我的意思是,像lw或sw这样的一些指令是I格式,而其他指令如add则是R格式。那么伪指令的格式是什么? – Samuel

+0

@Samuel:那么像'.text'或'.space'这样的伪指令? – wallyk

+0

下面是伪指令列表https://en.wikibooks.org/wiki/MIPS_Assembly/Pseudoinstructions – Samuel