.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条指令。
答案 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个?
可能更容易检查反汇编,因为迈克尔指出一些负载可能会组装成几个操作码,具体取决于直接值。