2016-11-27 5 views
1

Я новичок в сборке (я использую Arduino Uno с сборкой AVR), и я не могу понять, как вернуть переменные более 1 байта из сборки функция. До сих пор мне нужно было только вернуть байты, и я просто изменил регистр r24 на mov и ldi на значение, которое я хотел вернуть. Когда я вызываю ret, функция возвращает значение в регистре r24 в программу на C. Но как мне вернуть значения больше 8 байтов? В основном, как использовать память вместо регистров.Возвращение более 1 байт к функции в сборе

+1

читать ABI. Или, если вы не используете какие-либо внешние функции, вы можете просто придумать свой собственный ABI и сделать все, что хотите, и вернуть все, что вам нравится. –

+0

@ LưuVĩnhPhúc Спасибо за это. Я нашел здесь abi: https://gcc.gnu.org/wiki/avr-gcc Хотя мне все же хотелось бы знать, как использовать системную память для возврата данных вместо регистров, так как мне нужно будет вернуть массив. Я изменил свой вопрос, чтобы отразить это. – abeta201

ответ

1

На странице, указанной в вашем комментарии (gcc.gnu.org/wiki/avr-gcc), читайте главу «Вызов Конвенции». К сожалению, это немного сложнее, чем для других процессоров.

Если возвращаемое значение равно длиной более 8 байтов, то компилятор C выделит память и передаст адрес памяти в регистры R25: R24.

Все аргументы сдвигаются «вниз» на два регистра. Пример:

byte someFunction1(byte a, byte b); 

a -> R24 
b -> R22 
return -> R24 

struct largeStructure someFunction2(byte a, byte b); 

a -> R22 (instead of R24) 
b -> R20 (instead of R22) 
address of tmp_mem -> R25:R24 
return -> in memory tmp_mem 

Если возвращенное значение до 8 байт длиной значения возвращаются в следующих регистрах:

1 byte: R24 
2 bytes: R24...R25 
3 bytes: R22...R24 
4 bytes: R22...R25 
5 bytes: R20...R24 
6 bytes: R20...R25 
7 bytes: R18...R24 
8 bytes: R18...R25