2016-04-18 1 views
1

Мне удалось создать отдельные сегменты стека, данных и кода в TASM с помощью директивы SEGMENT, но меня все еще беспокоит. Когда следующий код собран с Turbo Assembler 2.0, TLINK создает двоичный файл, размер которого находится в окрестности 90 КБ.Распределение стека и данных в реальном режиме MZ .exe в Turbo Assembler 2.0

.286 

myStack segment para stack 'stack' 
db 0FFFFh dup (?) 
ends myStack 

myData segment para 'data' 
msg db 'Memes!$' 
db 7FFFh dup (?) 
ends myData 

myCode segment para 'code' 
assume cs:myCode 
assume ss:myStack 

start: 
mov ax,myData 
mov ds,ax 

push offset msg 
call write 
add sp,2 

mov ah,4ch 
int 21h 

write: 
push bp 
mov bp,sp 
mov dx,[bp+4] 
mov ah,9h 
int 21h 
pop bp 
ret 

ends myCode 
end start 

Теперь мне кажется, что формат файла М.З. должна позволить .exe, чтобы указать, что он требует выделения памяти сверх того, что на самом деле содержится в бинарном изображении (через мин/макс параграфов памяти, выделенных в дополнение к размеру ввода кода, который я предполагаю).

Так что мой вопрос: как укорачивать сборщик/компоновщик в генерации .exe с соответствующим заголовком для выделения памяти без непосредственного включения значений заполнитель в двоичное изображение?

ответ

3

Прошло некоторое время, но я думаю, вы можете достичь того, что вы пытаетесь сделать, поставив сначала сегмент кода. Затем поместите все инициализированные данные в начале сегмента data, за которым следуют все неинициализированные данные в сегменте data, за которым следует сегмент стека, который все неинициализирован. Поскольку все неинициализированные данные были доведены до конца, нет необходимости выделять какое-либо пространство в файле.

Ваш код, вероятно, даст вам результаты, которые вы хотите, если это выглядело как:

.286 

myCode segment para 'code' 
assume cs:myCode 
assume ss:myStack 

start: 
mov ax,myData 
mov ds,ax 

push offset msg 
call write 
add sp,2 

mov ah,4ch 
int 21h 

write: 
push bp 
mov bp,sp 
mov dx,[bp+4] 
mov ah,9h 
int 21h 
pop bp 
ret 

ends myCode 

myData segment para 'data' 
msg db 'Memes!$'    ; Initialized data first 
db 7FFFh dup (?)    ; Uninitialized data after all initialized data 
ends myData 

myStack segment para stack 'stack' 
          ; Leave blank, this will allow the stack to 
          ; to use the full 64k segment 
ends myStack 

end start 
+0

Это работал. Забавно, я попробовал это сам всего пару часов назад, и ассемблер продолжал жаловаться на неизвестные символы для названий сегментов! Клянусь, это было то же самое, что и у вас, но даже с мультимассовым переключателем/m2 он не собирался. Странный. – chili

+1

@chili Возможно, вы переместили сегменты ** после ** 'end start', а не раньше? –

+1

Я думаю, что ты можешь быть прав; – chili

Смежные вопросы