Передача параметров функции из Cи в ASM процедуру. Есть такая процедура написанная на ASM и вызываемая из CИ,void write_page (unsigned int adr , unsigned char function );
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено JTAG 29 августа 2003 г. 12:50
В ответ на: Передача параметров функции из Cи в ASM процедуру. Есть такая процедура написанная на ASM и вызываемая из CИ,void write_page (unsigned int adr , unsigned char function ); отправлено JTAG 29 августа 2003 г. 12:49

Есть такая процедура написанная на ASM и вызываемая из CИ
void write_page (unsigned int adr , unsigned char function );

write_page(addr,5); // Так выглядит вызов процедуры из Cи

write_page:
RCALL WAIT_SPMEN ;Wait for SPMEN flag cleared
MOV R31,R17 ;R31<-R17 ПЕРВЫЙ ПАРАМЕТР старший байт
MOV R30,R16 ;R30<-R16, ПЕРВЫЙ ПАРАМЕТР младший байт
;move adress to z pointer (R31=ZH R30=ZL)
OUT SPMCR, R20 ; SPMCR<-R20 ВТОРОЙ ПАРАМЕТР !!!!!!!
SPM ; (Z)<-R1:R0 Store program memory
RET
Из Си программы в ASM передается два параметра unsigned int adr, и unsigned char function
В IAR Reference Gude сказано параметры функции передаются через регистры для первого параметра регистры R16,R17,R18,R19 (если параметр имеет тип чар , то через регистр R16, если int регистры R16,R17, если long int R16,R17,R18,R19).
Для второго параметра соответственно используются регистры R20,R21,R22,R23 ,поскольку второй параметр у меня имеет тип char , то у меня используется регистр R20.
Теперь я смотрю на ASM листинг скомпилиированной программы на Си и вижу что значение 5 тип char у меня записывается в регистр R18 , а должен в R20!!! (вторая строчка)
write_page(addr,5);
\ 000000A0 E025 LDI R18,5 //!!!!!!!!!!!!!!!!!!!!
\ 000000A2 .... LDI R30,LOW(addr)
\ 000000A4 .... LDI R31,(addr) >> 8
\ 000000A6 8100 LD R16,Z
\ 000000A8 8111 LDD R17,Z+1
\ 000000AA .... RCALL write_page

Как это понимать? В доке неправильно написано?


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru