将简单的MIPS32程序移植到MIPS64

问题描述 投票:0回答:2

将以下MIPS32汇编程序移植到64位等效程序时,我有些困难。

我面临的主要问题是以下几行:

bgtz $s2, loop ; Branch from "loop" on "$s2" greater than zero.

我不确定为什么这行会导致错误?该说明应在MIPS64中。

MIPS32

# Description of Program: Computes first 25 Fibonacci numbers and store in an array.

# Description of Register Usage:
#   $s0 = Memory address
#   $s1 = Array Size
#   $s2 = Counter
#   $s3 = F[n] initialized at 1
#   $s4 = F[n - 1]
#   $s5 = F[n - 2]

    .data   ## DECLARATIONS ##
size:   .word   25  # Size of the array or limit.
array:  .word   0 : 25  # Create an array of words to store the 1st 25 Fibonacci numbers.

    .text   ## CODE SECTION ##
main:       la $s1, size    # Load address of size variable.
    la      $s0, array      # Load address of the array.
    lw      $s1, 0($s1)     # Load size of the array.
    addi    $s2, $s1, -2    # [Counter = Array Size - 2] Counter for loop.
    li      $s3, 1          # 1 is the 2nd value of the Fibonacci Sequence.
    sw      $zero, 0($s0)   # F[0] = 0; Store 1st value. 
    sw      $s3, 4($s0)     # F[1] = 1; Store 2nd value.

loop:       lw  $s4, 0($s0) # Get F[0] from memory and assign it to F[n - 2].
    lw      $s5, 4($s0)     # Get F[1] from memory and assign it to F[n - 1].
    add     $s3, $s4, $s5   # F[n] = F[n - 1] + F[n - 2].
    sw      $s3, 8($s0)     # Store the new F[n] into memory at the next availible location.
    addi    $s0, $s0, 4     # Start memory address at the new F[n].
    addi    $s2, $s2, -1    # [Counter = Counter - 1] Counter is initialized at 23.
    bgtz    $s2, loop       # Loop until the counter finally reaches zero. 
exit:       li   $v0, 10    # System call for exit.
    syscall                 # Exit...

###################### MEMORY DUMP ########################
# 0x10010000  0x00000019 0x00000000 0x00000001 0x00000001 #
# 0x10010010  0x00000002 0x00000003 0x00000005 0x00000008 #
# 0x10010020  0x0000000d 0x00000015 0x00000022 0x00000037 #
# 0x10010030  0x00000059 0x00000090 0x000000e9 0x00000179 #
# 0x10010040  0x00000262 0x000003db 0x0000063d 0x00000a18 #
# 0x10010050  0x00001055 0x00001a6d 0x00002ac2 0x0000452f #
# 0x10010060  0x00006ff1 0x0000b520 0x00000000 0x00000000 #
# 0x10010070  0x00000000 0x00000000 0x00000000 0x00000000 #  
###########################################################

MIPS64

      .data ;; DECLARATIONS
size:  .word 25 ; Size of the array or limit.
array: .space 100 ; Create an array of words to store the 1st 25 Fibonacci numbers.

      .text ;; CODE SECTION
main: ori  $s1, $zero, size  ; Load address of size variable.
      ori  $s0, $zero, array ; Load address of the array.
      lw   $s1, 0($s1)       ; Load size of the array.
      addi $s2, $s1, -2      ; [Counter = Array Size - 2] Counter for loop.
      ori  $s3, $zero, 1     ; 1 is the 2nd value of the Fibonacci Sequence.
      sw   $zero, 0($s0)     ; F[0] = 0; Store 1st value. 
      sw   $s3, 4($s0)       ; F[1] = 1; Store 2nd value.

loop: lw   $s4, 0($s0)       ; Get F[0] from memory and assign it to F[n - 2].
      lw   $s5, 4($s0)       ; Get F[1] from memory and assign it to F[n - 1].
      add  $s3, $s4, $s5     ; F[n] = F[n - 1] + F[n - 2].
      sw   $s3, 8($s0)       ; Store the new F[n] into memory at the next available location.
      addi $s0, $s0, 4      ; Start memory address at the new F[n].
      addi $s2, $s2, -1     ; [Counter = Counter - 1] Counter is initialized at 23.
      bgtz $s2, loop        ; Loop until the counter finally reaches zero. 
exit: halt                  ; Exit...
assembly porting mips32 mips64 edumips64
2个回答
1
投票

在MIPS组件中,可能需要为BDS(分支延迟槽)及其后的BDS提供有效的说明。这些将是bgtz之后的2条指令。无论如何,无论是否执行分支,BDS都会执行。仅在不采用分支的情况下才执行分支后。

为了使程序有效,您需要在分支(BDS)及其之后提供正确的说明。

在上面的MIPS32清单中,具有立即加载的li $v0, 10作为BDS,并且具有syscall作为分支后。但是在MIPS64的情况下,您没有有效的BDS插槽指令和分支后指令。

在指令级进行详细的性能调整时,我们也在OCTEON(MIPS64)CPU上也看到这一点。

只需将其放在BDS的nop中],该汇编就可以了。


0
投票

在EduMIPS64中应该为bgez

© www.soinside.com 2019 - 2024. All rights reserved.