Прикреплённый файл «Sort.asm»

Загрузка

   1 .data
   2 .eqv    SZ 20
   3 Arr:    .space  SZ
   4 EndArr: .align  2
   5 .text
   6 
   7 main:   la      $t1 Arr
   8         la      $t2 EndArr
   9 input:  li      $v0 5
  10         syscall
  11         sw      $v0 ($t1)
  12         addiu   $t1 $t1 4
  13         bne     $t2 $t1 input
  14         
  15         li      $a0 SZ
  16         la      $a1 Arr
  17         jal     function
  18         
  19         la      $t1 Arr
  20         la      $t2 EndArr
  21 output: li      $v0 1
  22         lw      $a0 ($t1)
  23         syscall
  24         li	$a0 '\n'
  25         li	$v0 11
  26         syscall
  27         sw      $v0 ($t1)
  28         addiu   $t1 $t1 4
  29         bne     $t2 $t1 output
  30         
  31         li      $v0 10
  32         syscall
  33 
  34 function:
  35         # общая подпрограмма
  36         # a0 — размер массива
  37         # a1 — начало массива
  38         # v0 — размер выходного массива (того же самого :)
  39         # v1 — начало выходного массива
  40 .eqv    FP      -4              # Смещения в кадре
  41 .eqv    .RA     -8($fp)         #   для сохраняемых регистров
  42 .eqv    .S0     -12($fp)
  43 .eqv    .S1     -16($fp)
  44 .eqv    .ARR    -20($fp)        # Смещения в кадре
  45 .eqv    .SIZE   -24($fp)        #   для локальных переменных
  46 .eqv    FSIZE   -24             # Размер кадра
  47         sw      $fp FP($sp)     # Сохраняем кадр
  48         move    $fp $sp         # Переставляем кадр
  49         addiu   $sp $sp FSIZE   # Переставляем стек
  50         sw      $ra .RA         # Сохраняем регистры
  51         sw      $s0 .S0     
  52         sw      $s1 .S1     
  53 
  54         sw      $a0 .SIZE       # Размер массива
  55         sw      $a1 .ARR        # Адрес массива
  56 
  57         move    $s0 $a0         # Регистры типа $s* не меняются
  58         move    $s1 $a1         # при вызовах функций
  59 fnext:  move    $a0 $s0
  60         move    $a1 $s1
  61         jal     getmin
  62         lw      $t0 ($v0)
  63         lw      $t1 ($s1)
  64         sw      $t0 ($s1)
  65         sw      $t1 ($v0)
  66         addiu   $s1 $s1 4
  67         addiu   $s0 $s0 -4
  68         bleu    $a0 4 fnext ### TODO ??? A0 или s0?
  69 
  70         lw      $v0 .SIZE       # Обращаемся к локальным переменным
  71         lw      $v1 .ARR
  72 
  73         lw      $ra .RA         # Восстанавливаем регистры
  74         lw      $s0 .S0     
  75         lw      $s1 .S1     
  76         move    $sp $fp         # Восстанавливаем стек
  77         lw      $fp FP($sp)     # Восстанавливаем предыдущий кадр
  78         jr      $ra
  79         
  80 getmin: # концевая подпрограмма
  81         # a0 — размер массива
  82         # a1 — начало массива
  83         # v0 — адрес минимального элемента
  84         lw      $t0 ($a1)
  85         move    $v0 $a1
  86 gmnext: addiu   $a0 $a0 -4
  87         addiu   $a1 $a1 4
  88         blez    $a0 gmfin
  89         lw      $t1 ($a1)
  90         bge     $t1 $t0 gmnext
  91         move    $t0 $t1
  92         move    $v0 $a1
  93         j       gmnext
  94 gmfin:  jr      $ra

Прикреплённые файлы

Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.

Вам нельзя прикреплять файлы к этой странице.