Как сделать подпрограмму, которая добавляет 2 числа? - PullRequest
1 голос
/ 23 октября 2019

Я хочу создать подпрограмму, которая добавляет 2 числа и помещает ответ обратно в стек. Я использую симулятор ZEP2.

Пока это мой код. Я искал в Google некоторую полезную информацию.

 ##  

stack equ  0x0010

begin  

load sp, stack

          push 5

          push 3

          jsr sadd

          halt 

 sadd     pop R1

          pop R2

          add R1, R2

          push R1 

          ret             

 ##

Я ожидаю вывода 8 в стеке, добавив 5 и 3.

Ответы [ 2 ]

0 голосов
/ 23 октября 2019
pop R1
pop R2
add R1, R2
push R1 
ret    

Ваша подпрограмма забывает, что инструкция JSR поместила адрес возврата в стек! Инструкция POP R1 не возвращает полезный операнд. Вместо этого он возвращает адрес возврата.
Более того, инструкция RET больше не будет возвращаться ниже инструкции JSR.

Следующий код извлечет правильные значения из стека:

load R2, SP
inc  R2
load R1, (R2)   ; This is the 3 in your example
inc  R2
add  R1, (R2)   ; This adds the 5 in your example
ret

и помещает ответ обратно в стек.

Это означает замену 2 значений выше отправленного адреса возврата значением 1 ,Далее один из способов сделать это:

store R1, (R2)  ; Replace input value 5 by the sum 8
pop   R1        ; Pop the return address
pop   R2        ; Remove the input value 3
push  R1        ; Put the return address back
ret             ; ... so RET can use it correctly
0 голосов
/ 23 октября 2019
##
stack   equ 0x20    

begin   load sp, stack

    PUSH 5

    PUSH 3

    JSR smul

    PUSH 4

    PUSH 2

    JSR sdiv

    JSR sadd

    PUSH 1

    JSR ssub

    halt

 sadd   pop R1  

    pop R2  

    add R1, R2   

    push R1 

    ret  

ssub    pop R1

    pop R2

    sub R1, R2

    push R1 

    ret 

smul    pop R1  

    pop R2  

    mul R1, R2

    push R1 

    ret     

sdiv    pop R1  

    pop R2  

    div R1, R2  

    push R1 

    ret     

end 
##
...