2012-12-02 2 views
0

질문은 AVR GCC 컨텍스트에 있습니다. 기능 이상C 함수 프로토 타이핑 및 .set 지시문

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) 
... 

(나는 "AVR-GCC로 컴파일"말을 생각) Atmel의 스튜디오에서 잘 작동 다음과 같이

나는 C 함수 프로토 타입 .S 파일이 있습니다.

GNU asm syntax 
Syntax: .set symbol, expression 

AVR asm 
.SET label = expression 

이는 GNU 구문이 사용됨을 의미합니다. 이제 내가 이해하려고하는 것은 - 그 상수 24, 22, 20은 C 함수 프로토 타이핑의 관점에서 무엇을 의미합니까? 주석은 함수 인자를 적재하고 있음을 암시합니다. 그러나 .set과 그 상수가 어떻게 발생하는지 이해하지 못합니다. 저는 params가 스택과 레지스터를 통과한다고 생각했습니다.

2 차 질문 - AVR은 GNU에서 파생 된 것이지만 실제로는 위와 같이 AVR asm과 GNU asm 구문을 혼용 할 수 있습니까?

답변

0

AVR은 처음 몇 개의 인수를 전달하기 위해 레지스터를 사용합니다. description of the calling convention here을 참조하십시오.

레지스터는 주소 0에서 메모리 맵핑됩니다. 따라서 붙여 넣은 코드에서 볼 수있는 숫자는 레지스터 번호가 같은 주소이며 메모리 매핑을 통해 인수를 참조하는 데 사용할 수 있습니다.

관련 문제