Jump to content

    
Sign in to follow this  
visht

IAR 4.10.1 переменные С в ASM

Recommended Posts

переменные объявлены в С модуле, в сегменте SADDR.

__saddr char var[5];

Хочу использовать их в ASM функции, чтобы не привязывать к конкретному адресу.

в документации написано 

EXTERN var

При попытке использовать эту переменную в ASM модуле получаю ошибку Undefined

пробовал IMPORT результат тот же.

Можно конечно не привязываться к массиву, а использовать SADDR как временный буфер, засунув нужное кол-во в стэк,

Но снова возникает вопрос в передаче начального адреса SADDR ... Указывать конкретные адреса не хочется ...

Подскажите как правильно это делать ?

 

Share this post


Link to post
Share on other sites
41 минуту назад, visht сказал:

 


EXTERN var

При попытке использовать эту переменную в ASM модуле получаю ошибку Undefined

Приведите полностью фрагмент исходника (и си-шного и асм). Точно си или си++?

И кто именно говорит мяу "Undefined"? Компоновщик или ассемблер? И какое ядро?

Share this post


Link to post
Share on other sites

Попробуйте _var. В каких-то версиях на каких-то платформах при экспорте в ассемблер добавлялся подчерк в начало имени. "Но это не точно".

Share this post


Link to post
Share on other sites

ядро Renesas RL78, но IAR вроде универсальный ... должен быть.

ошибка линкера

Error[Li005]: no definition for "buff" [referenced from C:\softs\rl78\Debug\Obj\test.o] 

была мысль что он не видит из за того что переменная не используется,

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

И даже так не работает. массив объявлен перед main, как глобальный.

__root __saddr unsigned char buff[5];

модуль Asm 

#include "ior5f1006c.h"
        NAME    test
        PUBLIC  _call
        EXTERN buff

        SECTION CODE:CODE
_call:
        push DE
        mov     A, #00
        mov1    CY, S:(buff+1).0
        mov1    A.4, CY
        pop  DE
        ret
END

 

21 minutes ago, Сергей Борщ said:

Попробуйте _var. В каких-то версиях на каких-то платформах при экспорте в ассемблер добавлялся подчерк в начало имени. "Но это не точно".

Сработало :)

Причем с вызовом функции ASM из C тоже понадобилось _ .. но там в сообщении по ошибке было ясно что он ищет _call и опыт использования DLL помог, причем если читать по документации, то ни о каком _ и речи нет ...

А вот с переменной не сообразил ... 

Спасибо.

 

 

И еще вопрос ко всем, но уже конкретно к привязке к ядру RL78.

Соглашение о вызовах, в документации описано что AX, HL, CS, ES регистровые пары можно портить, BC, DE перед использованием сохранять ... Но в RL78-S3 4 банка этих регистров, что с остальными то делать ..

Cудя по определению регионов *.icf он про них в курсе, но вот о том как он их использует я так и не нашел.

Может где то не там читал, и это описано в каком то другом документе ?

Share this post


Link to post
Share on other sites
1 час назад, visht сказал:

Но в RL78-S3 4 банка этих регистров, что с остальными то делать ..

Цитата

The compiler only supports switching register banks for interrupt functions, to avoid
having to save all registers. Any register banks that you have not used for bank
switching, you can use in your assembler source code.

это кусок из IAR C/C++ Development Guide

Можно только прагмой #pragma bank=bank_number указать какой банк использовать для обработчиков прерываний.

Share this post


Link to post
Share on other sites

понял. Спасибо.

IAR C/C++ Compiler User Guide - тут ничего про банки не сказано, хотя текст практически совпадает

IAR C/C++ Development Guide - а тут все то же, но с дополнениями...

Регистры лишними не бывают, теперь можно смело использовать.

 

 

Share this post


Link to post
Share on other sites
3 часа назад, visht сказал:

причем если читать по документации, то ни о каком _ и речи нет ...

Неправда. Я же не сам это выдумал, а когда-то прочитал в документации. Скачал документацию на ваш компилятор, IAR C/C++ development guide, раздел mixing C and Assembler:

Цитата

Note: To comply with the RL78 ABI, the compiler generates assembler labels for
symbol and function names by prefixing an underscore. You must remember to add this
extra underscore when you access C symbols from assembler. For example, main must
be written as _main.

 

Share this post


Link to post
Share on other sites

хм ... снова этот development guide

В IAR Assembler User Guide и IAR C/C++ Compiler User Guide этого нет ...

где то написали, а где то забыли.

Теперь буду знать кому доверять :)

А по ходу дела встретил вот такой веселый момент:

поскольку согласно development guide я получил право не сохранять DE

Scratch registers
Any function is permitted to destroy the contents of a scratch register. If a function needs
the register value after a call to another function, it must store it during the call, for
example on the stack.
The following registers are used as scratch registers:
 The registers  AX ,  HL ,  CS and  ES . In the V2 calling convention, the  BC and  DE
registers are also scratch registers.

я решил тут же им воспользоваться, и мой ASM код в отладчике превратился в DB8

по шагам ходит, работу выполняет, но отображается как набор констант.

Когда я решил вернуть обертку 

push DE
...

pop DE

Код в отладке снова стал мнемоникой.

Или это особенность работы, и тоже описано в документации ? :)

Share this post


Link to post
Share on other sites

Есть куча директив асма из серии Call frame information (CFI) которые сообщают отладчику информацию об устройстве стекового кадра чтобы он мог его правильно показывать.

Компилятор их сам в генерируемый код втыкает, а на асме надо руками добавлять.

Больше они ни для чего не нужны, потому не разбирался.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this