visht 0 27 ноября, 2019 Опубликовано 27 ноября, 2019 · Жалоба переменные объявлены в С модуле, в сегменте SADDR. __saddr char var[5]; Хочу использовать их в ASM функции, чтобы не привязывать к конкретному адресу. в документации написано EXTERN var При попытке использовать эту переменную в ASM модуле получаю ошибку Undefined пробовал IMPORT результат тот же. Можно конечно не привязываться к массиву, а использовать SADDR как временный буфер, засунув нужное кол-во в стэк, Но снова возникает вопрос в передаче начального адреса SADDR ... Указывать конкретные адреса не хочется ... Подскажите как правильно это делать ? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 27 ноября, 2019 Опубликовано 27 ноября, 2019 · Жалоба 41 минуту назад, visht сказал: EXTERN var При попытке использовать эту переменную в ASM модуле получаю ошибку Undefined Приведите полностью фрагмент исходника (и си-шного и асм). Точно си или си++? И кто именно говорит мяу "Undefined"? Компоновщик или ассемблер? И какое ядро? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 27 ноября, 2019 Опубликовано 27 ноября, 2019 · Жалоба Попробуйте _var. В каких-то версиях на каких-то платформах при экспорте в ассемблер добавлялся подчерк в начало имени. "Но это не точно". Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
visht 0 27 ноября, 2019 Опубликовано 27 ноября, 2019 · Жалоба ядро 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 он про них в курсе, но вот о том как он их использует я так и не нашел. Может где то не там читал, и это описано в каком то другом документе ? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 27 ноября, 2019 Опубликовано 27 ноября, 2019 · Жалоба 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 указать какой банк использовать для обработчиков прерываний. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
visht 0 27 ноября, 2019 Опубликовано 27 ноября, 2019 · Жалоба понял. Спасибо. IAR C/C++ Compiler User Guide - тут ничего про банки не сказано, хотя текст практически совпадает IAR C/C++ Development Guide - а тут все то же, но с дополнениями... Регистры лишними не бывают, теперь можно смело использовать. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 27 ноября, 2019 Опубликовано 27 ноября, 2019 · Жалоба 3 часа назад, visht сказал: причем если читать по документации, то ни о каком _ и речи нет ... Неправда. Я же не сам это выдумал, а когда-то прочитал в документации. Скачал документацию на ваш компилятор, IAR C/C++ development guide, раздел mixing C and Assembler: Цитата Note: To comply with the RL78 ABI, the compiler generates assembler labels forsymbol 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. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
visht 0 27 ноября, 2019 Опубликовано 27 ноября, 2019 · Жалоба хм ... снова этот 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 Код в отладке снова стал мнемоникой. Или это особенность работы, и тоже описано в документации ? :) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 28 ноября, 2019 Опубликовано 28 ноября, 2019 · Жалоба Есть куча директив асма из серии Call frame information (CFI) которые сообщают отладчику информацию об устройстве стекового кадра чтобы он мог его правильно показывать. Компилятор их сам в генерируемый код втыкает, а на асме надо руками добавлять. Больше они ни для чего не нужны, потому не разбирался. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться