Цитата(dimka76 @ Jun 5 2008, 15:58)

Кстати, если писать такие фукции на Си( __ramfunc) -> зашиваю контроллер -> работает (дергает ножкой) -> выключаю питание -> включаю питание -> опять работает -> значит образ функции исполняемой из ОЗУ изначально хранится во FLASH и копируется в ОЗУ при вкл. питания.
Да. Но это копирование происходит не "само" каким-то магическим образом, а это делает процедура cstartup. Вы можете убедиться в этом, пройдя программу в симуляторе по шагам от вектора сброса до main().
Цитата(dimka76 @ Jun 5 2008, 15:58)

Вот я хочу получить такую же функцию на ассемблере, используя IAR.
Как отдельную законченную программу или как одну из функций С-программы? Если последнее, то напишите в начале вашей функции
Код
RSEG CODE_I : CODE
Если как отдельную программу - то вам придется делать копирование самостоятельно.Сложного там ничего нет, обычный цикл, для получения адресов используйте операторы SFB, SFE, в линкерном скрипте - опцию -Q (посмотрите пример в папках компилятора).
Цитата(dimka76 @ Jun 5 2008, 15:58)

По поводу директивы .ORG - она задает абсолютный адрес, проверено на практике. И директивы ассемблера, как правило, одинаковы для всех ассемблеров и контроллеров/процессоров. Вот.
Вот? Во-первых,
"отучаемся говорить за всех...".
Во-вторых, в какой адрес, по-вашему, попадут эти переменные:
Код
NAME PWM_Data
RSEG PWM_DATA : DATA(0)
ORG 0
FREQ_0 DS 1
FREQ_1 DS 1
Bitrate DS 1
/* FFSK */
SinStep DS 1
Quadrant DS 1
BitPhase DS 2
ORG SinStep
/* GFSK,GMSK */
Curve DS 1
Shifter DS 1
ENDMOD
Я утверждаю, что в начало сегмента PWM_DATA. А абсолютный адрес присвоит линкер в процессе размещения секции (проверено на практике

).
В-третьих: По умолчанию ассемблерный файл ассемблируется в абсолютную секцию (см. директиву ASEG). Поэтому если вы не использовали директив переключения секций (RSEG, ASEG, COMMON, STACK), то ваш код попадал в абсолютную секцию, которая начинается с адреса 0 и поэтому результат вашей ORG совпадал с абсолютным адресом.