Создание прототипов функций C и директива .set

Вопрос находится в контексте 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, как указано выше?


person Pablo    schedule 02.12.2012    source источник


Ответы (1)


AVR использует регистры для передачи первых нескольких аргументов. См. описание соглашения о вызовах здесь.

Регистры отображаются в памяти по нулевому адресу. Таким образом, числа, которые вы видите во вставленном коде, являются адресами, которые равны номерам регистров, и могут использоваться для ссылки на аргументы через отображение памяти.

person Jester    schedule 02.12.2012