Fasm. Часто Задаваемые Вопросы.
Переведено в меру познаний английского
с офф.сайта из раздела faq.
Здесь вы можете найти ответы на некоторые наиболее распространенные вопросы о Flat Assembler.
Почему я получаю ошибку "out of memory"(ошибка нехватки памяти),
хотя у меня более чем достаточно памяти в системе?
В многозадачных средах fasm позволяет избежать выделения всей возможной памяти,
и, следовательно, использование памяти
, по умолчанию ограничено некоторым меньшим количеством - в Linux
по умолчанию предел составляет 16 МБ, в Windows вся доступная
физическая память и половина свободного пространства подкачки.
Если вы хотите изменить этот предел, используйте
-m опцию в командной строке,и после нее число в килобайтах.
Есть ли в fasm директивы, подобные incbin в Nasm?
(в Nasm incbin дословно включает бинарный файл в выходной файл.
Это может быть полезно, например для включения картинок и музыки
непосредственно в исполняемый файл игрушки.
Однако, это рекомендуется делать только для небольших порций данных.
Эта псевдо-инструкция может быть вызвана тремя разными способами:
- incbin "file.dat" ; включение файла целиком
- incbin "file.dat",1024 ; пропуск первых 1024 байт
- incbin "file.dat",1024,512 ; пропуск первых 1024 и включение следующих 512 байт
)
Да, она называется "file",
и Вы можете использовать ее как любую другую директиву определения данных
(что означает, что она может стоять с меткой без двоеточия).
Она также позволяет указать смещение в файле и кол-во байт, которые необходимо включить.
Например file 'file.dat':12h,3 включит три байта из файла file.dat
начиная со смещения 12h .
Почему инструкция mov eax,'ABCD' собирается в mov eax,44434241h ?
Разве не должно быть в обратном порядке?
Хотя большинство ассемблеров иинтерпретируют такие значения в
порядке - первый символ - старший байт,
fasm делает наоборот, только потому что это удобнее в большинстве случаев.
Потому что в архитектуре х86
младший байт является первым байтом в памяти.
Зато чтобы проверить есть ли строка 'ABCD' по адресу
в ebx вам достаточно написать cmp dword [ebx],'ABCD'.
Я пытаюсь условно определить некоторую константу с помощью equ директивы
поместив её в блок if, но даже если условие
ложно, константа получает определение. Почему?
Это происходит потому, что все символьные константы и макроинструкции
(любой символ, определяемый с помощью директив equ, macro или struc ) обрабатываются
на стадии препроцессора, в то время как директивы if и repeat и остальные обрабатываются
на стадии
ассемблирования, когда уже все макроинструкции и символьные константы заменены значениями.
С другой стороны цифровые константы (которые определяются символом "=") являются как бы метками,
и обрабатываются на стадии ассемблирования, соответственно их вы можете определять условно.
В COFF и PE форматах я могу объявить секцию, содержащую инициализированные данные,
,с помощью флага data в разделе описания.
Как я могу объявить раздел содержащий неинициализированные данные?
Flat assembler объявляет раздел неинициализированных данных автоматически
если секция содержит только неинициализированные данные (это данные,
объявленные с директивами резервирования,
либо с ? вместо значения ).
Если вы создаете такую секцию, то не объявляйте ее ни секцией данных (data),
ни секцией кода (code),
и тогда секция автоматически будет объявлена как неинициализированные данные.
Почему я получаю ошибку "invalid use of symbol" (ошибка неправильного использования символов)
при сборке PE или объектного файла ?
Эта ошибка происходит,
когда значение некоторых перемещаемых меток используется в контексте,
в котором ассемблер
не может гарантировать,
что значение закодированное в инструкции
будет правильно после перемещения кода.
Если я ставлю директиву extrn в своем коде,
Flat Assembler ссылается на внешний файл, даже если в коде вызов не производился.
Как я могу избежать этого?
Вы можете переопределить extrn как макрос,
который будет ссылаться только тогда, когда 'символ' используется где-то, например:
macro extrn symbol
{
if used symbol
extrn symbol
end if
}
Вы можете также использовать глобальный макрос, который автоматически определяет, должен ли
'cимвол' быть объявлен как public или external и таким образом позволяет
использование общих заголовков для всех объектных файлов проекта.
Он выглядит следующим образом:
macro global [symbol]
{
local isextrn,isglobal
if defined symbol & ~ defined isextrn
public symbol
else if used symbol & defined isglobal
extrn symbol
isextrn = 1
end if
isglobal = 1
}
Могу ли я использовать скомпилированный файл ресурсов
вместо макроса создания раздела ресурсов когда создаю файл формата PE?
Да, Flat Assembler умеет это, начиная с версии 1.50 .
Вы можете создать раздел ресурсов из
файла ресурсов сделанного любым компилятором ресурсов или редактором,
и просто объявить об этом так:
section '.rsrc' data readable resource from 'my.res'
И больше в этой секции ничего не нужно.
В случае, если вы не хотите отдельный раздел ресурсов,
вы можете поместить ресурсы в любой другой раздел с помощью директивы data:
data resource from 'my.res'
end data
Всенепременно будет пополнятся данная страница... со временем...
С уважением Pauk_pv ©
|