Как запустить программу на ассемблере в командной строке

Наконец-то добрался до полезной практической задачи по корректному разбору параметров командной строки. На языках высокого уровня это делается чуть ли не одной командой, а на Ассемблере как обычно приходится все делать самостоятельно. Решение получилось универсальным, подходит как для консольных, так и для GUI-приложений. Для использования функции ParseCmdLine в сегменте данных надо предварительно определить следующую структуру:

Code (Assembler) : Убрать нумерациюВыделить код

  1. ; Структура для командной строки
  2. struct CMDLINE
  3. nCount dd ? ; Количество аргументов
  4. lpArgs dd ? ; Указатель на массив адресов строк
  5. lpArgStr dd ? ; Указатель на массив строк
  6. ends

Формат структуры: nCount — количество параметров командной строки, в случае успешного вызова функции это значение обязательно будет ненулевым, так как самый первый параметр — полный путь запуска программы, а остальные аргументы из хвоста командной строки будут расположены, начиная со второго элемента массива. lpArgStr — указатель на массив параметров командной строки. Все строки в этот массив записываются последовательно одна за другой в формате ASCIIZ, если строки были не в кавычках, то с начала и конца строки удаляются избыточные пробелы и символы табуляции. lpArgs — указатель на массив адресов разобранных параметров командной строки. Какого-то отдельного признака окончания массива не предусмотрено, количество элементов берется из значения nCount.

Удобная разработка и отладка программ на Turbo Assembler в Windows 10 без консоли

Сама функция разбора командной строки у меня получилась такая. Для работы используется память из кучи (Heap), оригинальная командная строка в памяти не модифицируется.

Code (Assembler) : Убрать нумерациюВыделить код

Юникодная версия этой функции. Ее тоже можно использовать, но ниже по тексту есть более правильный вариант решения задачи:

Code (Assembler) : Убрать нумерациюВыделить код

Параметры вызова функции: CmdStr — указатель на структуру CMDLINE, dQuotFlag — флаг, определяющий будут ли сохранены обрамляющие кавычки в массиве аргументов командной строки, значение флага: TRUE — сохранять кавычки, FALSE — убирать. После вызова функции получаем заполненную структуру CMDLINE. Пример использования:

Читайте также:
Какие программы установить на Андроид приставку для телевизора

Code (Assembler) : Убрать нумерациюВыделить код

  1. section ‘.data’ datareadablewriteable
  2. . . .
  3. struct CMDLINE
  4. nCount dd ? ; Количество аргументов
  5. lpArgs dd ? ; Указатель на массив адресов строк
  6. lpArgStr dd ? ; Указатель на массив строк
  7. ends
  8. myarg CMDLINE ; Это наша командная строка
  9. . . .
  10. section ‘.code’ codereadableexecutable
  11. . . .
  12. stdcall ParseCmdLine , myarg , FALSE
  13. ; Если не заданы параметры в командной строке, то вывести
  14. ; информацию о ключах программы
  15. cmp [ myarg . nCount ] , 2
  16. jb show_usage
  17. . . .

Для разбора командной строки в юникодных приложениях лучше использовать связку функций GetCommandLineW для получения этой строки и CommandLineToArgvW для ее преобразования в массив аргументов. Код получается очень простой и элегантный. Никаких дополнительных структур тут не требуется. Единственный недостаток в том, что нельзя получить список аргументов в обрамлении кавычек, но это требуется крайне редко, практически никогда.

Как вывести строку на экран в Ассемблере

Code (Assembler) : Убрать нумерациюВыделить код

В приложении примеры программ с исходными текстами, которые обрабатывают параметры командной строки. Функция ParseCmdLine вызывается дважды с разными флагами обработки кавычек, чтобы вы могли увидеть разницу. Для удобства в архиве есть пакетные файлы для запуска примеров сразу с несколькими параметрами командной строки.

Пример программы с исходным текстом (FASM)

Источник: www.manhunter.ru

Справочник по командной строке ассемблера ARM

Ассемблеры Microsoft ARM, armasm и armasm64, поддерживают несколько параметров командной строки. По умолчанию armasm собирает язык ассемблера ARMv7 Thumb в реализацию Microsoft common Object File Format (COFF). Ассемблер armasm64 создает код объекта COFF для целевых объектов ARM64 и ARM64EC. Компоновщик может связывать объекты кода COFF, созданные как ассемблером ARM, так и компилятором C/C++. Он может связываться с библиотеками объектов, созданными библиотекой.

Синтаксис

armasm [параметры] object_file source_file
armasm [параметры] source_file

armasm64 [параметры] object_file source_file
armasm64 [параметры] source_file

Параметры

options
Сочетание нулевых или нескольких из следующих параметров:

  • -16
    Доступно только в armasm. Сборка источника в виде 16-разрядных инструкций Thumb. Этот параметр выбирается по умолчанию.
  • -32
    Доступно только в armasm. Сборка источника в виде 32-разрядных инструкций ARM.
  • -coff_thumb2_only
    Доступно только в armasm. Разрешить только код Thumb-2.
  • -errorReport:Параметр
    Этот параметр использовать не рекомендуется. В Windows Vista и более поздних версиях отчеты об ошибках управляются параметрами отчеты об ошибках Windows (WER).
  • -errorsимя_файла
    -eимя_файла
    Перенаправление сообщений об ошибках и предупреждений в имя файла. По умолчанию эти сообщения отправляются в stdout .
  • -funcOverride:function_name
    Доступно только в armasm64. Выпустить функцию, переопределяющую поддержку function_name.
  • -g
    Создайте отладочную информацию.
  • -gh:SHA1
    Используйте криптографический хэш-алгоритм SHA-1 для создания контрольной суммы каждого исходного файла в отладочной информации. Переопределяет -gh:SHA256 .
  • -gh:SHA256
    Используйте алгоритм шифрования SHA-256 для создания контрольной суммы каждого исходного файла в отладочной информации. Этот параметр включен по умолчанию в Visual Studio 2022 версии 17.0 и более поздних.
  • -guard:ehcont [ — ]
    Создайте отсортированный список относительных виртуальных адресов (RVA) всех допустимых целевых объектов продолжения обработки исключений для двоичного файла. Он используется во время выполнения для NtContinue проверки указателя инструкций и SetThreadContext . По умолчанию параметр отключен и -guard:ehcont должен быть явно включен. Чтобы явно отключить этот параметр, используйте . -guard:ehcont- Этот параметр доступен в Visual Studio 2019 версии 16.7 и более поздних. Эта функция поддерживается для 64-разрядных процессов в 64-разрядной ОС.
  • -help
    -h
    Выведите сообщение справки командной строки.
  • -idir[ ;dir]
    Добавьте один или несколько указанных каталогов в путь поиска include. Разделяйте каталоги с помощью точки с запятой ( ; ).
  • -ignorewarning_number
    Отключите указанный номер предупреждения. Возможные значения см. в разделе Диагностические сообщения ассемблера ARM.
  • -listlist_file
    Создайте подробный список созданного языка ассемблера для list_file. Параметр list_file является необязательным. Если он опущен, ассемблер добавляет .lst к базовому имени source_file , чтобы создать файл листинга.
  • -machineМашина
    Укажите тип компьютера, который нужно задать в заголовке PE. В armasm возможные значения для компьютера :
  • ARM — задает для типа компьютера значение IMAGE_FILE_MACHINE_ARMNT . Этот параметр выбирается по умолчанию.
  • THUMB — задает для типа компьютера значение IMAGE_FILE_MACHINE_THUMB .
Читайте также:
Как осуществляется совместный доступ к зашифрованным файлам при использовании программы myoldsafe

В armasm64 возможны следующие значения:

  • ARM64 — задает для типа компьютера значение IMAGE_FILE_MACHINE_ARM64 . Этот параметр выбирается по умолчанию.
  • ARM64EC — задает тип компьютера . IMAGE_FILE_MACHINE_ARM64EC

source_file
Имя исходного файла.

object_file
Последний элемент командной строки может указать имя объекта (выходного) файла. Если он не указан, а параметр не -o указан, ассемблер добавляет .obj к базовому имени source_file для создания объектного файла.

Комментарии

В следующем примере показано, как использовать armasm в типичном сценарии. Сначала используйте armasm для создания исходного файла языка ассемблера (ASM) в объектный файл (OBJ). Затем используйте компилятор C командной строки CL, чтобы скомпилировать исходный файл (.c), а также укажите параметр компоновщика для связывания файла объекта ARM.

armasm -o myasmcode.obj myasmcode.asm cl myccode.c /link myasmcode.obj

Источник: learn.microsoft.com

Ассемблер. Доступ к параметрам командной строки. Статья 1

Все ссылки на статьи и ролики моего канала Old Programmer : Программирование. Тематическое оглавление моего Zen-канала (Old Programmer) . А вот это ссылки на все мои статьи так или иначе связанные с языком ассемблера.

Сегодня рассмотрим не большую но важную задачу на языке Ассемблер: получение параметров командной строки. Параметры командной строки часто используются в качестве входного интерфейса программ. Как и ранее мы программируем в Linux.

Получение на ассемблере параметров командной строки. Трансляция gcc

В p4000.s представлен не сложный алгоритм вывода всех параметров командной строки программы. Доступ к параметрам командной строки осуществляется через регистр rsi — при запуске программы именно он будет указывать на массив указателей на строки, которые и являются нужными нам параметрами.

Напоминаем, что первым всегда идет путь к запускаемой программе, а потом уже сами параметры, если они есть. Последний элемент в массиве равен нулю. Этим мы и воспользовались в нашем алгоритме. Можно, впрочем воспользоваться и регистром rdi (точнее edi ), где хранится количество параметров в командной строке.

Читайте также:
Как закачать программы в ipad 1

Трансляция программы осуществляется следующими командами.

as —64 p4010.s -o p4010.o
gcc -no-pie p4010.o -o p4010

Обращаю внимание на следующий важный момент. При вызове библиотечной функции puts значение регистров может меняться, поэтому мы сохраняем, а потом восстанавливаем регистр rsi .

Есть еще одна оговорка. Исполняемый модуль формируется с помощью транслятора gcc, следовательно, вставляется дополнительная функция предварительной обработки. Соответственно функция main получает параметры подготовленные этой функцией. Вот как быть, если мы пишем программу на чистом ассемблере, без участия компилятора C, я напишу в одном из следующих уроков .

Подписываемся на мой канал о программировании и программистах Old Programmer .

Источник: dzen.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru