Я не знаю, как использовать стек в мипс (сборка) - PullRequest
0 голосов
/ 27 марта 2011

Я даю код, который имеет проблему, и использование стека может не работать ..

Может кто-нибудь сказать мне, как это исправить?

.data
.align 2
array:.space 100
.text
.globl main

main:
  li $t0,10


  addi $sp,$sp,-12     #stack
  sw $ra,0($sp)
  sw $s0,4($sp)
  sw $s1,8($sp)
  jal function
  addi $sp,$sp,12
  lw $ra,0($sp)    #hello stack
  lw $s0,4($sp)
  lw $s1,8($sp)
  li $v0,1
  add $a0,$t6,$0
  syscall
  li $v0,10
  syscall

function:
  move $s0,$a2
  move $s1,$a1     
   li $s0,10101    # s0,s1   dont change itsvalues NEVER 
   li $s1,20202
   li $t6,777
   move $v0,$t6
   jr $ra 

1 Ответ

1 голос
/ 27 марта 2011

Вы слышали о «слотах задержки» в процессорах MIPS? Следующая инструкция после любой команды «ветвления» помещается в «интервал задержки». Это означает, что эта инструкция будет выполнена в любом случае, даже если была выполнена ветвь. Итак, в следующем фрагменте кода:

  jal function
  addi $sp,$sp,12

вам нужно поместить nop инструкцию после jal, потому что addi выполняется сразу после вызова, но не после возврата из function. Он также находится в jr инструкции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...