Как создать функцию в сборке? - PullRequest
0 голосов
/ 26 мая 2020

Мне нужно создать простую функцию, которая вычисляет поверхность прямоугольника (простая программа a * b). Однако значение регистров (включая R0 и R1) должно оставаться неизменным после вызова функции. Мой вопрос в том, что мне нужно использовать команды POP и PU SH?

start:
.include "m8def.inc"
.DEF var1= R16
.DEF var2= R17
.DEF surface= R18
.DEF temp= R19
rjmp main

surfacerectangle:
pop R20
pop R21
pop temp
add surface, var1
mul surface, var2
push temp
push R21
push R20
ret

main:

ldi temp, low(RAMEND) 
out SPL, temp
ldi temp, high(RAMEND)
out SPH, temp
ldi var1, 3
ldi var2, 4
ldi surface, 0
push temp

rcall surfacerectangle
pop temp

end3:
 nop

Вот мой код, который я сделал, но он, похоже, не работает. Кто-нибудь видит проблему в моем коде? Это было написано в Atmel Studio 7.0 для микроконтроллера ATmega8.

1 Ответ

0 голосов
/ 27 мая 2020
start:
.DEF var1= R16
.DEF var2= R17
.DEF temp= R18
rjmp main

surfacerectangle:
mul var1, var2
ret

main:
ldi temp, low(RAMEND) 
out SPL, temp
ldi temp, high(RAMEND)
out SPH, temp
ldi var1, 3
ldi var2, 4

rcall surfacerectangle
end3:
 nop

Обнаружил проблему, выяснилось, что причиной проблемы было неправильное использование POP и PU SH (проблема заключалась в бесконечном цикле).

...