Можно ли объявлять данные в сегменте кода?

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
Blind Guardian
Сообщения: 5
Зарегистрирован: 16 фев 2008, 17:51

Здравствуйте. Я программирую на ассемблере. Вопрос: можно ли в сегменте кода выделять память для данных? Примерно так:

jmp $+4
byte1 db 0
byte2 db 0

я ассемблирую с помощью TASM. Знак доллара означает текущий адрес. Jmp $+4 перепрыгивает саму инструкцию jmp (два байта), плюс два байта объявленных далее. То есть идея такова: в сегменте кода я выделяю кусок, который, если всё правильно сделать, никогда не будет исполняться, а пользоваться я им буду для хранения некоторых данных.
Программа с такими конструкциями нормально компилируется, линкуется.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Можно. Является основной стратегией самомодифицирующегося кода.
It's a long way to the top if you wanna rock'n'roll
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

somewhere писал(а):Можно. Является основной стратегией самомодифицирующегося кода.
(Эх... термины бы вспомнить...) Если для защищенной модели, то, насколько я представляю, не прокатит. Там защита на уровне операционки на чтение/запись из сегмента кода.

Помню, в библиотеке Turbo Professional (для Паскаля) было немало ассемблерных модулей, в которых присутствовали данные в сегменте кода. Для реальной модели памяти все это превосходно работало. Народ как-то попробовал скомпилить библиотеку (благо, исходники были доступны) для защищенной. Скомпилиться скомпилировалоь, но при работе грохалось.
Ответить