MIPS汇编指令数量

时间:2016-10-14 14:53:09

标签: assembly mips

.text  
.global main  
main:      
        addi    $v0, $zero,0  
        la  $t0, length  
        lw  $t1, 0($t0)  
        la  $t4, array  
        addi $t1, $t1, -1  
        sll $t1,$t1,2  

loop:   
        add $t3, $t4,$t1  
        lw  $t2,0($t3)  
        add $v0,$v0,$t2  
        addi $t1,$t1,-4  
test:   
        slti $t9,$t1,0  
        beq $t9,$zero,loop  
        nop   
        sw  $v0, 0($t0)  
.data  
length: .word 8  
array:  .word 9,8,7,6,5,4,3,2  

我必须告诉这段代码中有多少静态指令。我知道在数据之前有16条指令,我想知道.data之后写的指令是否也被认为是2条指令,总共18条指令。

1 个答案:

答案 0 :(得分:0)

YESNO。

指令“.data”本身并没有编译成任何与机器相关的东西,它只标记了另一个源代码段,它与一些工具链会导致在不同的链接阶段链接那部分编译源,可能会登陆到特定的可执行部分(由可执行文件的头部标记,取决于目标平台可执行文件格式)。

那些.word 9,8,7,6,5,4,3,2会编译为字大小的数值9,8,......

但是从CPU的角度来看,内存中的数字和指令一样好,所以你会尝试执行它,CPU会乐意跳上它,并执行这些数字作为指令(垃圾意味着,可能是崩溃的机器) 。 IIRC MIPS类似于risc,固定指令大小为单字,因此行.word 9,8,7,6,5,4,3,2包含8条指令。

但是你必须告诉我,执行了多少条指令。这确实取决于代码的执行流程。在你的情况下,代码看起来非常简单直接,直到最后,使用简单的循环(你应该多次计算指令,还是只计算一次,每个循环?)。

sw $v0, 0($t0)指令结束的地方。这是商店字吗?因此CPU将跟随下一条指令(内存中的下一个字值)。什么没有在源中定义,如果.data段从那里开始,那么单词8,9,8,...将作为指令执行(懒得拆解它,它会变成什么)

因此合理的人类可读来源有16条指令,我害怕在硬件上执行,因为代码看起来未完成。

并且......你在哪里计算16条指令?我只看到了14个?

可能更容易检查反汇编,因为迈克尔指出一些负载可能会组装成几个操作码,具体取决于直接值。