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:
szMsg db 'MESSAGE',0
virtual at data_start
vszMsg db 'MESSAGE',0
end virtual
data_end:
это както неуклюже получается, согласитесь?
может быть есть другие варианты? можно не только под FASM
жду советов...
Код:
org data_start
data_start:
szMsg db 'MESSAGE',0
data_start:
szMsg db 'MESSAGE',0
Код:
org data_start
data_start:
szMsg db 'MESSAGE',0
data_start:
szMsg db 'MESSAGE',0
ну а потом обратно, org 0? Ж)
а есть чтонить лаконичнее? типа virtual at, но чтоб реально данные в выход писала?
Собственно что мешает разнести код и данные по разным участкам?
С виртуалом, мне кажется, красиво это сделать не получится:
Код:
data_start:
szMessage db 'MESSAGE',0
virtual at data_start
pszMessage=szMessage-$
end virtual
szMessage db 'MESSAGE',0
virtual at data_start
pszMessage=szMessage-$
end virtual
Ну а дальше вместо szMessage юзать pszMessage.
codebase=???
org 0
... ;код
database=$+codebase
org 0
... ;данные
datasize=$
org database-codebase+datasize
... ;продолжение кода
codesize=$