1.При создании программы на ассемблере возможно указать ситуацию, когда после загрузки программы данные находятся по старшим адресам.
dec byte ptr [ebp+K32_Limit]
WeGotK32:
xchg eax,esi
ret
K32_Limit dw limit
Естественно, секция открыта для чтения/записи. Никаких особых уловок не применяются.
В с++ такая ситуация не проходит.
Код, обращающийся к переменной, объявленной ниже себя, выдает ошибку.
2. При просмотре в отладчике памяти, выделенной для программы, у ассемлерной данные находятся ниже кода (простите за простоту). У сишной — в начале.
Возможно есть директивы прагмы для компилятора VC 6 ???
Здравствуйте, Larsito, Вы писали:
L>1.При создании программы на ассемблере возможно указать ситуацию, когда после загрузки программы данные находятся по старшим адресам. L> dec byte ptr [ebp+K32_Limit] L>WeGotK32: L> xchg eax,esi L> ret
L> K32_Limit dw limit L>Естественно, секция открыта для чтения/записи. Никаких особых уловок не применяются.
L>В с++ такая ситуация не проходит. L>Код, обращающийся к переменной, объявленной ниже себя, выдает ошибку. L>2. При просмотре в отладчике памяти, выделенной для программы, у ассемлерной данные находятся ниже кода (простите за простоту). У сишной — в начале.
L>Возможно есть директивы прагмы для компилятора VC 6 ???
Взаимное расположение имен в исходном коде не имеет никакого значения. Компилятор не присваивает окончательных адресов. Размещение секций -- дело линкера. Не знаю, как это сделать в VC; для gcc (точнее, ld), нужно передать линкеру опции -Ttext text_address -Tdata data_address и т.д.
Здравствуйте, Larsito, Вы писали:
L>1.При создании программы на ассемблере возможно указать ситуацию, когда после загрузки программы данные находятся по старшим адресам.
L>
L> dec byte ptr [ebp+K32_Limit]
L>WeGotK32:
L> xchg eax,esi
L> ret
L> K32_Limit dw limit
L>Естественно, секция открыта для чтения/записи. Никаких особых уловок не применяются.
Если речь идёт о masm, то только если это явно указать линекру.
L>В с++ такая ситуация не проходит. L>Код, обращающийся к переменной, объявленной ниже себя, выдает ошибку. L>2. При просмотре в отладчике памяти, выделенной для программы, у ассемлерной данные находятся ниже кода (простите за простоту). У сишной — в начале.
Не имеет значение положение, главное — атрибуты секций.
L>Возможно есть директивы прагмы для компилятора VC 6 ???
#pragma comment(linker, "/section:.text,RWE")
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, gear nuke, Вы писали:
GN>Здравствуйте, Larsito, Вы писали:
L>>1.При создании программы на ассемблере возможно указать ситуацию, когда после загрузки программы данные находятся по старшим адресам.
L>>
L>> dec byte ptr [ebp+K32_Limit]
L>>WeGotK32:
L>> xchg eax,esi
L>> ret
L>> K32_Limit dw limit
L>>Естественно, секция открыта для чтения/записи. Никаких особых уловок не применяются.
GN>Если речь идёт о masm, то только если это явно указать линекру.
L>>В с++ такая ситуация не проходит. L>>Код, обращающийся к переменной, объявленной ниже себя, выдает ошибку. L>>2. При просмотре в отладчике памяти, выделенной для программы, у ассемлерной данные находятся ниже кода (простите за простоту). У сишной — в начале.
GN>Не имеет значение положение, главное — атрибуты секций.
L>>Возможно есть директивы прагмы для компилятора VC 6 ???
GN>
Здравствуйте, Larsito, Вы писали:
L>>>1.При создании программы на ассемблере возможно указать ситуацию, когда после загрузки программы данные находятся по старшим адресам. L>>>
L>>> dec byte ptr [ebp+K32_Limit]
L>>>WeGotK32:
L>>> xchg eax,esi
L>>> ret
L>>> K32_Limit dw limit
L>>>Естественно, секция открыта для чтения/записи. Никаких особых уловок не применяются.
L>>>2. При просмотре в отладчике памяти, выделенной для программы, у ассемлерной данные находятся ниже кода (простите за простоту). У сишной — в начале.
L>Программа на асме стандартная, секция данных пустая с объявлением лишь одного байта (db ?). Все остальные данные в кодовой секции
Прошу прощения, совершенно не понял первоначальный вопрос , думал нужно изменять данные в секции кода .
L>>>В с++ такая ситуация не проходит. L>>>Код, обращающийся к переменной, объявленной ниже себя, выдает ошибку.
Если имеется ввиду такое:
foo--;
short K32_Limit;
то ничего поделать нельзя, нужно объявлять перменные до использования. При компиляции секция данных будет всё равно после секции кода располагаться, т.е. при загрузке exe адреса у данных будут больше, чем у кода.
Вообще, сущаствующие компиляторы С не очень подходят для написания кода активно использующего delta-смещения .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth