Я новичок в сборке (я использую Arduino Uno с сборкой AVR), и я не могу понять, как вернуть переменные более 1 байта из сборки функция. До сих пор мне нужно было только вернуть байты, и я просто изменил регистр r24 на mov
и ldi
на значение, которое я хотел вернуть. Когда я вызываю ret
, функция возвращает значение в регистре r24 в программу на C. Но как мне вернуть значения больше 8 байтов? В основном, как использовать память вместо регистров.Возвращение более 1 байт к функции в сборе
1
A
ответ
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
читать ABI. Или, если вы не используете какие-либо внешние функции, вы можете просто придумать свой собственный ABI и сделать все, что хотите, и вернуть все, что вам нравится. –
@ LưuVĩnhPhúc Спасибо за это. Я нашел здесь abi: https://gcc.gnu.org/wiki/avr-gcc Хотя мне все же хотелось бы знать, как использовать системную память для возврата данных вместо регистров, так как мне нужно будет вернуть массив. Я изменил свой вопрос, чтобы отразить это. – abeta201