Экспорт массива байтов в сборке x86

В настоящее время я работаю над сборочным проектом (MASM в сочетании с Dosbox), который в основном воссоздает pong для образовательных целей. Я написал функцию для отрисовки спрайтов (массивов байтов) в видеопамять (режим 13h), но эти спрайты начинают загромождать верхнюю половину файла (потому что они могут быть довольно большими, и я предпочитаю художественную ценность этих больших массивы байтов по сравнению с рисованием из растровых изображений)

Я действительно не знаю, как включает работу (что является своего рода проблемой), но я нашел файл, который показывает мне общий синтаксис. Например, у меня может быть "DERP.INC" в сочетании с файлом "DERP.ASM". Этот файл ASM будет определять переменную (значение db) «лошадь», которую я мог бы экспортировать в файл INC, выполнив:

externdef horse:BYTE

и помещая это в файл ASM:

PUBLIC horse

В файле INC мы четко указываем, что размер лошади равен одному байту. Теперь спрайты определены следующим образом:

sprite db 1, 0, 0
       db 0, 1, 0
       db 0, 0, 1 

Как я могу экспортировать весь массив байтов?


person Sam    schedule 08.12.2012    source источник


Ответы (1)


Не нужно. sprite — это просто имя, которое будет отображаться на какой-то адрес. Вам решать, сколько байтов, начинающихся с этого адреса, могут составлять части одного и того же фрагмента данных. Один из распространенных методов выглядит примерно так:

sprite db 1, 0, 0
       db 0, 1, 0
       db 0, 0, 1 

sprite_len = $ - sprite

Сделать имя общедоступным, чтобы оно было доступно из какого-то другого файла, на самом деле не меняет ситуацию. Вы все еще только делаете имя публичным. Если вы хотите отслеживать длину, вы также можете сделать общедоступным имя, которое вы дали длине. Однако на самом деле это не экспортирует больше или меньше данных — если получатель уже знает, что спрайт всегда будет иметь длину 9 байт, он может работать со злом, основываясь только на его начальном адресе, точно так же, как код в том же коде. файл бы. Тот факт, что вы ничего не определили для определения длины спрайта, как правило, указывает на то, что ваш код зависит от его фиксированной длины - если это так, просто экспорт sprite будет работать нормально.

Итог: public и externdef в основном создают впечатление, что код и объявление данных находятся в одном файле. «Экспорт» символа автоматически не дает принимающему коду больше или меньше информации об этом символе, чем если бы он был в том же файле, чтобы объявление данных было непосредственно видно.

person Jerry Coffin    schedule 08.12.2012
comment
Конечно, это всего лишь места памяти! Как глупо с моей стороны забыть об этом. Спасибо большое :) - person Sam; 09.12.2012