Адресация переменных.

Тема в разделе "WASM.ASSEMBLER", создана пользователем drem1lin, 6 дек 2010.

  1. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Передо мной встала неожиданная задача, суть ее в следующем: есть код исполняющийся в BRM, работающий в 1м мегабайте ОЗУ, надо его перенести в 4й гигабайт ОЗУ. Вопрос возник с адресацией переменных.
    Код (Text):
    1. .data
    2. SomeVariable db 0feh
    3. .code
    4. proc Main
    5. cmp byte ptr SomeVariable, 7
    6. .....;какой то код
    7. endp
    При дизассемблировании получается следующее 80 3E offset 07 cmp byte ptr ds:offset, 7. И смещение идет размером в слово, а мне надо адрес порядка 0feeb0000h. Соответственно вопрос стоит в том как сделать так что бы компилятор их сам расположил где надо, после кода. Например код занимает 200h байт с адреса 0ffff0000h, тогда данные должны лежать с адреса 0ffff0200h.
    Если что-то не понятно объяснил, спрашивайте уточню.
    Заранее спасибо.
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Я не уверен, что понял точно, но, по-моему, нужна директива 'org 0ffff0000h' :).
     
  3. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Я подумал об этом, но пока проверить не успел) да и вопроса с 16 битами вместо 32 она не снимает
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    drem1lin
    вопрос с 16 битами вместо 32 снимает унреал в комплекте с соответствующим префиксом размера адреса.
     
  5. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Похоже я здесь постил подобный вопрос http://www.wasm.ru/forum/viewtopic.php?id=38914. Только, что у тебя за компилятор? fasm или tasm.

    В tasm`е нужно весь 16-битный код в отдельном сегменте писать.
    Код (Text):
    1. CS16 segment para public 'code' use16
    2. ;здесь 16-битный код
    3. CS16 ends
    Вся трудность только с дескрипторами. Для переноса кода нужно будет определить дескриптор кода, данных и стэка и все они должны быть 16-битными с правильно определёнными базами и лимитом.
     
  6. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    ты не совсем меня понял, из-за специфики задачи я не могу использовать защищенный режим, так как это потребует слишком больших изменений в коде. мне надо в большом реальном режиме. просто сегмент .data должен лежать в 4 гиге, и команда иметь вид: mov eax, ds:offset32. а получается только mov eax, ds:offset16
     
  7. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    я и так в нем, я могу к памяти выше мегабайта обратить сам, но мне надо расположить там данные и обращаться как я описал выше. просто метод
    mov eax, 0feff0000h
    mov eax, [eax]
    сложен и ведет к ошибкам, а также требует ручной работы с памятью
     
  8. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Сокращения лучше не используй. Компилеру нужно явно указывать где 16-бит, а где 32.
    Код (Text):
    1. .data
    2. SomeVariable db 0feh
    3. .code
    4. proc Main
    5. cmp byte ptr SomeVariable, 7
    6. .....;какой то код
    7. endp
    Примерно так пробуй

    Код (Text):
    1. daka32 segment para public 'data' use32
    2.     SomeVariable db 0feh
    3. daka32 ends
    4. code16 segment para public 'code' use16
    5. assume cs:code16
    6. assume ds:daka32
    7. proc Main
    8.     cmp byte ptr SomeVariable, 7
    9.      .....;какой то код
    10. endp
    11. code16 ends