【问题标题】:MIPS Assembly Number of InstructionsMIPS 汇编指令数
【发布时间】:2016-10-14 14:53:08
【问题描述】:
.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  

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

【问题讨论】:

  • 不,指令不是指令。
  • 但是您可能需要知道数据段的基地址才能知道指令计数,因为这决定了la 将转换成多少指令。
  • 这就是为什么我想知道长度是否以某种方式加载到内存中,以及它是否算作一条指令。那么,看看这段代码,你可以确认是用 16 条静态指令编写的吗?
  • 不,因为我需要知道数据段在内存中的位置。如果例如数据段从 0x10000000 开始,您可以将 la $t0,length 转换为一条指令 (lui $t0,0x1000),但如果它从例如开始0x10001000 同样的 la 需要两条指令。

标签: assembly mips


【解决方案1】:

是的,没有。

指令“.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 个?


可能会更容易检查反汇编,正如 Michael 指出的那样,一些负载可能会组装成几个操作码,具体取决于立即值。

【讨论】:

  • “我只看到 14 个” la 是一个伪指令,不一定会转化为一个实际指令。
  • la 被翻译成 lui 和 ori
  • 真正的问题显示在原帖中,这段代码16或18中有多少条静态指令?因为我不知道 lenght : .word 8 和 array: .word 9,x1,x2...xn 是否算作指令。
  • @SebastianC 不,您的问题已“执行”。而且代码不是有效的AFAIK,所以不清楚执行将在哪里终止,以及您应该在哪里停止计数。如果代码正确退出,.data 部分将被故意禁止,并且不可数。同样,当 .data 部分在这种情况下执行时(因为代码中的错误没有退出给调用者),它会添加不是两个,而是 9 个可能的指令(其中有多少会真正执行取决于它们的反汇编)。 ...但通常您不执行数据,因此通常数据被视为二进制数据,而不是指令。
  • 我的回答是,CPU 不在乎......无论它在 $pc 上遇到什么“单词”(内存中的值),它都会执行它。该指令模式引导/循环/分支的位置取决于程序员。如果您意外执行数据,CPU 会愉快地将它们作为指令操作码执行,无论后果如何。内存中的指令和数据之间没有区别,您无法将它们区分开来(尽管一些有根据的猜测通常是成功的,因为数据很少形成任何有意义的指令)。 @SebastianC​​pan>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多