Передо мной встала неожиданная задача, суть ее в следующем: есть код исполняющийся в BRM, работающий в 1м мегабайте ОЗУ, надо его перенести в 4й гигабайт ОЗУ. Вопрос возник с адресацией переменных. Код (Text): .data SomeVariable db 0feh .code proc Main cmp byte ptr SomeVariable, 7 .....;какой то код endp При дизассемблировании получается следующее 80 3E offset 07 cmp byte ptr ds:offset, 7. И смещение идет размером в слово, а мне надо адрес порядка 0feeb0000h. Соответственно вопрос стоит в том как сделать так что бы компилятор их сам расположил где надо, после кода. Например код занимает 200h байт с адреса 0ffff0000h, тогда данные должны лежать с адреса 0ffff0200h. Если что-то не понятно объяснил, спрашивайте уточню. Заранее спасибо.
drem1lin вопрос с 16 битами вместо 32 снимает унреал в комплекте с соответствующим префиксом размера адреса.
Похоже я здесь постил подобный вопрос http://www.wasm.ru/forum/viewtopic.php?id=38914. Только, что у тебя за компилятор? fasm или tasm. В tasm`е нужно весь 16-битный код в отдельном сегменте писать. Код (Text): CS16 segment para public 'code' use16 ;здесь 16-битный код CS16 ends Вся трудность только с дескрипторами. Для переноса кода нужно будет определить дескриптор кода, данных и стэка и все они должны быть 16-битными с правильно определёнными базами и лимитом.
ты не совсем меня понял, из-за специфики задачи я не могу использовать защищенный режим, так как это потребует слишком больших изменений в коде. мне надо в большом реальном режиме. просто сегмент .data должен лежать в 4 гиге, и команда иметь вид: mov eax, ds:offset32. а получается только mov eax, ds:offset16
я и так в нем, я могу к памяти выше мегабайта обратить сам, но мне надо расположить там данные и обращаться как я описал выше. просто метод mov eax, 0feff0000h mov eax, [eax] сложен и ведет к ошибкам, а также требует ручной работы с памятью
Сокращения лучше не используй. Компилеру нужно явно указывать где 16-бит, а где 32. Код (Text): .data SomeVariable db 0feh .code proc Main cmp byte ptr SomeVariable, 7 .....;какой то код endp Примерно так пробуй Код (Text): daka32 segment para public 'data' use32 SomeVariable db 0feh daka32 ends code16 segment para public 'code' use16 assume cs:code16 assume ds:daka32 proc Main cmp byte ptr SomeVariable, 7 .....;какой то код endp code16 ends