Сборка: необходимость сохранения значений в стеке памяти в следующем коде и в целом - PullRequest
0 голосов
/ 06 января 2012

Буду рад вашей помощи по следующей проблеме.

Меня попросили реализовать функцию is_cube, которая получает n в качестве аргумента и проверяет, является ли он кубом, в сборке MIPS. Например, 8 (2 ^ 3) и 1000 (10 ^ 3) являются кубами.

Я написал следующий код:

# UNTITLED PROGRAM

.data   

str: .asciiz "Please enter your number >"
str1: .asciiz "The number is a cube"
str2: .asciiz "The number is not a cube"


.text

 main:  

   li $v0 4
   la $a0 str
   syscall

   li $v0 5
   syscall


   move $t0 , $v0
   li $t1, 0
   blt $t0, $zero, negative


  negative:
    sub $t5, $zero, 1
mul $t0, $t0, $t5



 is_cube: 

  addi $t1, $t1, 1
  sgt $t2, $t1, $t0
  bne $t2, $zero, There_is_not 
  mul $t3, $t1, $t1
  mul $t4 ,$t3, $t1
  beq $t4, $t0, There_is

  jal is_cube



 There_is:

   li $v0 4
   la $a0 str1
   syscall

   jal end

 There_is_not:

   li $v0 4
   la $a0 str2
   syscall

   jal end


 end: 

и это работает, без сохранения $s0 в стеке $sp и всего этого процесса. Мой вопрос: это нормально, не сохраняя? и если да, то когда мне его использовать?

Большое спасибо.

1 Ответ

1 голос
/ 10 января 2012

Вы не реализовали функцию.Вы реализовали цикл, который использует jal вместо обычной инструкции ветвления.Выполнение начинается в main, а затем падает от negative до цикла, начинающегося с is_cube, а затем, когда цикл заканчивается на There_is или There_is_not, вы используете jal end вместо другой инструкции перехода.

Этот код случается для работы на MIPS, потому что инструкция jal не переносит текущее значение программного счетчика в стек, в отличие от x86.

Еслиэто домашнее задание, прежде чем отправлять этот код, вам следует вернуться к заметкам о написании функций на ассемблере.

...