логотип нашего сайта о программировании для начинающих

Программирование на ассемблере для начинающих. Ассемблер gas под linux, fasm под windows, tasm под dos, и многое другое.


Сайт для программистов, начинающих кодеров, и людей, желающих заняться программированием.




Меню невыпадающее
Программистам : Другое :

Fasm - flat assembler -FAQ.

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 ©
Здесь со времнем появятся ссылки дружественных и понравившихся сайтов

Информер ТИЦ


Сайт создан Pauk_pv // Pauk@paukpv.pp.ru


При использовании информации с сайта обязательна ссылка на сайт
Pauk_pv ©