(M68k) Почему моя ценность не передается в D0? - PullRequest
0 голосов
/ 12 декабря 2018

Итак, я пишу программу и подпрограмму, где это, в основном, псевдокод.

int findmin(int* vals, int count){
    if(count == 1){
         return vals[0];
          }else{
          int minrest = findmin(vals+1,count-1);
              if (minrest < vals[0]){
              return minrest
              }else{
               return vals[0]
                   }
             }
        }

В основном я должен поместить это в код сборки m68k.На фотографиях это то, что у меня есть до сих пор.Я думаю, что моя логика верна, но по какой-то причине все, что это делает, это распечатывает мой заголовок и ничего больше, я чувствую, что по какой-то причине я не храню свой результат в D0, где он должен быть.Есть ли какой-то шаг, который я пропускаю, или что-то, от чего я полностью отказался?Мой prog4.s - это мой main, который вызывает подпрограмму

Мой prog4.s - это мой main, который вызывает подпрограмму рекурсивная функция подпрограммы

1 Ответ

0 голосов
/ 16 декабря 2018

Код main вызывает подпрограмму следующим образом:

    pea     vals
    move.w  D1, -(SP)
    jsr     findmin
    adda.l  #6, SP

Подпрограмма findmin делает следующий рекурсивный вызов:

    move.l  A0, -(SP)
    move.w  D1, -(SP)
    jsr     findmin
    adda.l  #6, SP

Подпрограмма findmin извлекает свои параметры, такие как:

findmin:
    link    A6, #0
    ...
    move.w  8(A6), D1
    move.l  12(A6), A0      <<< Here is the error!

Но подождите ,из-за того, как вы поместили вещи в стек, вот как складывается этот стек:

          A6  RTS  D1  A0
lower    ==== ==== == ====    higher
         ^
         SP == A6

Выше показано, что слово D1 находится в 8 (A6) и что длинное слово A0 на 10 (A6). Это 10 вместо 12.

...