MIPS汇编中的.word指令

时间:2010-03-04 03:47:33

标签: assembly trace mips tracing

       .data
VALS:  .half 0xbead, 0xface
RES:   .space 4
    .text
    la     $t0,VALS
    lh    $t1,($t0)
    lhu    $t2,2($t0)
    sll    $t2,$t2,16
    or    $t2,$t1,$t2
    jal    AVG
    .word  -2
    .word  -6
    la    $t4,RES
       sw  $v0,($t4)
       li     $v0,10
    syscall
AVG:   lw  $v0,($ra)
    lw    $t3,4($ra)
    add    $v0,$v0,$t3
    sra    $v0,$v0,1
    addi   $ra,$ra,8
    jr     $ra

在这个MIPS代码中,.word部分有什么作用?我的模拟器无法处理文本部分中的数据指令。这些指令有什么作用?做什么是.word -2和.word -6,而不是.word -8?

1 个答案:

答案 0 :(得分:4)

该指令将值-2和-6放在代码流中。如果你看看这个块的实际二进制表示,你会在指令编码的中间找到一些FFFFFFFEFFFFFFFA或FEFFFFFFFFFFFFFF,这取决于字节顺序。

汇编程序将分别发出2个字的值-2和-6的数据,没有像-8的单个单词。

如果您查看AVG:标签上的内容,您会注意到它使用

lw $v0, ($ra)
lw $t3, 4($ra)

在寄存器v0和t3中从返回地址加载2个字(即从跳转的位置,即从嵌入在代码段中的数据)。所以... v0得到-2,t3得-6。另请注意,在返回之前,代码段如何在$ ra中添加8,以跳过嵌入数据。

简而言之,它是一种编码常量值的方法,作为代码流的一部分加载到寄存器中。

现在,代码所做的是在返回之前将2加在一起,右移,(我假设实现平均值)。当你在编译时直接计算平均值时(或者如果你直接在脑中编写asm),在这个特定情况下完成那么多工作没有多大意义。我假设AVG应该从很多地方调用,但即使这样,因为它期望它来自代码段(通常是只读)的值,我没有看到在常量值上计算数学的要点。