Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

как решить одну интересную проблему

4.8K
17 июня 2006 года
NeTxXx
21 / / 29.12.2003
вобщем, вот код (fasm):
Код:
format binary
org 0
code_selector   =  8
stack_selector  = 16
data_selector   = 24
screen_selector = 32


start:

; ...... здесь создаем дескрипторы для сегмента данных и кода ....
; .. и загружаем GDT

; ... входим в pmode...

   jmp far code_selector:_pm ; дальним переходом загружаем селектор сегмнта кода в cs


_pm:
   mov ax,screen_selector
   mov es,ax ; в es - селектор сегмента видеопамяти

   mov ax,data_selector
   mov ds,ax

   ; далее печатаем сообщение
   ; здесть в ebx занесется знаение 0, т.к. szMsg находится в самом начале ds
   mov ebx,szMsg-data_start ; ds:ebx - указатель на строку
   mov edi,480 ; третья строчка
   call kputzs ; печатаем


; ...........


data_start:

szMsg db 'MESSAGE',0

data_end:

; ........



вот. проблема в том, чтобы не писать каждый раз szMsg-data_start, а чтобы ассемблер сам подставлял вместо метки szMsg адрес не относительно $$(нуля в данном случае), а относительно определенной метки (в данном случае data_start).
я пытался сделать это с помощью virtual at, но это не то, т.к. в virtual код не пишется в выходной файл

т.е. нужно дублировать код:
 
Код:
data_start:

szMsg db 'MESSAGE',0

virtual at data_start
vszMsg db 'MESSAGE',0
end virtual

data_end:



это както неуклюже получается, согласитесь?

может быть есть другие варианты? можно не только под FASM
жду советов...
1.8K
17 июня 2006 года
k3Eahn
365 / / 19.12.2005
А если так:
 
Код:
org data_start
data_start:
szMsg db 'MESSAGE',0
4.8K
17 июня 2006 года
NeTxXx
21 / / 29.12.2003
[QUOTE=k3Eahn]А если так:
 
Код:
org data_start
data_start:
szMsg db 'MESSAGE',0
[/QUOTE]
ну а потом обратно, org 0? Ж)
а есть чтонить лаконичнее? типа virtual at, но чтоб реально данные в выход писала?
1.8K
17 июня 2006 года
k3Eahn
365 / / 19.12.2005
Значит одна строчка - это уже не лаконично :D?
Собственно что мешает разнести код и данные по разным участкам?
С виртуалом, мне кажется, красиво это сделать не получится:
 
Код:
data_start:
szMessage db 'MESSAGE',0
virtual at data_start
pszMessage=szMessage-$
end virtual

Ну а дальше вместо szMessage юзать pszMessage.
349
17 июня 2006 года
Phantom-84
656 / / 27.10.2005
Если я правильно понял, то у тебя сегмент данных с нулевым внутрисегментным смещением может находиться посреди сегмента кода. Вообще это изврат, лучше сегмены размещать последовательно, начиная их с org 0 и высчитывая их базы для соответствующих дескрипторов. Еще лучше использовать FLAT-модель. Ну а для твоего варианта можно написать что-то вроде этого:

codebase=???
org 0
... ;код
database=$+codebase
org 0
... ;данные
datasize=$
org database-codebase+datasize
... ;продолжение кода
codesize=$
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог