[an error occurred while processing this directive] [an error occurred while processing this directive]
Лучше тренируй мозги в другом наравлении - как писать правильные и эффективные программы , обходясь без извратов, но если эти фокусы интересуют "в академическом смысле", то все можно сделать и на Си (и RETI выполнить и не-локальный GOTO), читай внутри...
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Abc123 08 апреля 2002 г. 10:08
В ответ на: Ну, goto тут уже активно обсуждался. В данном случае я могу пойти даже на такое. А вот первое препятствие... Тут нужно подумать. отправлено Игорь А. 07 апреля 2002 г. 20:23

Любителям извращений - способ "написания ассемблерных вставок на C без ассемблерных вставок" (извиняюсь за каламбур).
Ограничение - выполнение "ассемблерной вставки" производится
"как вызов подпрограммы", т.е. формируется CALL.


Следи за руками:
1) Вычисляешь бинарное содержимое "ассемблерной вставки" любым доступным способом (по справочнику или отдельно оттранслировав),
можешь даже дать символические наименования командам, например:

#define RETI_OP_CODE 0x32 // 0x32 - код инструкции RETI


2) Объявляешь массив байтов для хранения команд "ассемблерной вставки"
(обязательно в кодовой памяти для процессоров с раздельным адресным пространством ), например, для x51 (Keil C51):

unsigned char code reti_instruction[] = {
RETI_OP_CODE
// последовательность команд может быть произвольной длины
};


3) Обманываешь компилятор "вызывая массив как функцию":

typedef void ( *PTR_TO_FUNC )( void );
// Simulate call to RETI
#define _RETI_() ( ( PTR_TO_FUNC )(&reti_instruction) )()

void main(void)
{
_RETI_();
}


Нелокальный GOTO делается аналогичным извратом
(правда, придется стек подпортить ... ).


P.S.
В реальных программах применять все это НЕ РЕКОМЕНДУЕТСЯ :)
Если вернуться к твоей задаче "по-существу",
то все делается просто и красиво,
послушай совета Михаила Евстафьева.
Все опытные люди делают именно так.

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

Ответы



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

E-mail: info@telesys.ru