【问题标题】:BLT instruction unknown in MIPSMIPS 中未知的 BLT 指令
【发布时间】:2021-09-29 21:50:56
【问题描述】:

我在第 19 行收到一个错误,说 blt 未知错误。我真的不太了解 MIPS 处理器

.data
   A:      .word 4,8,12,16,20,24,28
   Message:   .ascii " The Sum is:"
.text
   li $t0,0                # load immediate value 0 to regiter $t0
   li $t1,7       # load immediate value 7 to regiter $t1
   li $t3,2       # load immediate value 2 to regiter $t3
   la $t2,A       # load address of array to regiter $t2
   li $s0,0       # load immediate value 0 to regiter $so to hold sum value
calSum:
   div $t5,$t0,$t3            # Divide $t0 with $t1 and store result in $t2
   mfhi $t4               # remainder to $t4
   bnez $t4,X2       # If remainder is not zero then jump to label X2
   lw $t6,0($t2)       # Store zeroth element of array register $t6
   add $s0,$s0,$t6       # Add this to sum in register $s0
X2:
   addi $t2,$t2,4       # If index is not divisible by 2 then point to next element
   addi $t0,$t0,1       # Increment index
   blt $t0,$t1,calSum   # Repeat from label calSum
   li  $v0, 4          # To print message use system call
   la  $a0, Message
   syscall
   move $a0,$s0           # print result stored in register $s0
   li $v0,1       # System call to print number in register $ao
   syscall
   li $v0, 10       # System call to exit to DOS
   syscall  

【问题讨论】:

  • 第 19 行是哪一行?
  • 什么工具链/汇编器?
  • 很抱歉我把编辑历史弄得一团糟。我正在编辑问题,其他人也在同一时间我们必须同时点击保存,因为我的编辑同时显示了我的更改和其他人的编辑(比如将 blt 更改为 ble,这没有意义因为它使问题无效)。所以我回滚了包含我们两个更改的编辑,但我之前从未使用过回滚,所以一开始我做错了,有点乱......
  • @JerryJeremiah:别担心,伙计,我想我们会挺过去的!

标签: assembly mips instructions


【解决方案1】:

MIPS 没有blt 指令。但是,许多 MIPS 汇编器支持该操作码,作为伪指令,实际上扩展为 MIPS 确实具有的几条指令。

支持伪指令的汇编程序通常可以选择关闭它们。该选项在您的环境中已关闭,或者它通常不支持伪指令,或者它不完全支持该伪指令。

blt 操作:

blt $a0, $t0, label

由汇编器实现如下:

slt $1, $a0, $t0      # set boolean temp $1 to $a0 < $t0
bne $1, $0, label     # branch on boolean temp is "true"

MIPS 也没有bge(对于&gt;=),但可以在条件为假的情况下进行分支:

slt $1, $a0, $t0      # same as before
beq $1, $0, label     # branch on boolean temp is "false"

MIPS 也没有ble(用于&lt;=),但可以通过

slt $1, $t0, $a0      # operands reversed, so we can use slt
beq $1, $0, label     # branch on boolean temp is "false"

请注意,为了支持许多此类伪指令的扩展,MIPS 环境保留了$1 — 又名$at,即“汇编器临时” — 因为需要一个临时存储字来互连两者(或更多)此类扩展中的说明。这种做法对汇编程序员来说浪费了宝贵的 CPU 寄存器(而编译器通常不使用伪指令,因此对它们来说不是问题)。尽管如此,更现代的 RISC V 已经选择避免为汇编程序保留一个临时寄存器以用于伪指令扩展,因此不提供任何需要额外临时寄存器的伪指令。

【讨论】:

  • 技术上的伪指令以及调用约定是工具作者的选择,因此哪些伪指令(如果有)和保留寄存器由工具链作者而不是 ISA 或处理器创建者确定。 isa 的创建者倾向于创建一个约定,但您当然不必遵循它……我们今天最熟悉的工具倾向于遵循这些约定,但是那里有一个分离,这不是必需的(无论如何都不能强制执行) )。
猜你喜欢
  • 2013-11-24
  • 2011-09-01
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
相关资源
最近更新 更多