Вопрос находится в контексте AVR GCC.
У меня есть файл .s с прототипом функции C следующим образом:
Mod_BigNum_by_u8: .global Mod_BigNum_by_u8
; c-prototype ==> uint8_t Mod_BigNum_by_u8(uint8_t * pBigNum, uint8_t ByteCount, uint8_t Divisor);
; Parameters
.set pBigNum, 24 ; (u16) pointer to the BigNum Dividend. Highbyte first
.set ByteCount, 22 ; (u8) number of bytes in the BigNum
.set Divisor, 20 ; (u8) Divisor
; Local Variables
.set BitCount, 23 ; (u8) Number of bits left in the current byte
.set CurrentByte, 21 ; (u8) Most recently used byte of BigNum
; Return value
.set Dividend, 24 ; (u16) result (we only need 8bits, but WinAVR requires 16)
...
Вышеупомянутая функция отлично работает в Atmel Studio (я думаю, нужно сказать «компиляция с помощью avr-gcc»).
GNU asm syntax
Syntax: .set symbol, expression
AVR asm
.SET label = expression
Это означает, что используется синтаксис GNU. Теперь я пытаюсь понять - что означают эти константы 24, 22, 20 с точки зрения прототипирования функций C? Комментарии предполагают, что я загружаю аргументы функции, но я не понимаю, как это происходит с .set и этими константами. Раньше я думал, что параметры передаются через стек и регистры.
Второй вопрос - я знаю, что AVR asm является производным от GNU, но могу ли я действительно смешивать синтаксис GNU asm с AVR asm, как указано выше?