Sadda.ru Ironetcart Андроид Ассемблер MASM32 Linux Все статьи Table of Contents


 

Командная строка

  Макс Петров май 2013

      Когда мы открываем какой-либо файл, связанный с определенным приложением, или открываем этот файл, по правой кнопке мыши показывая, при помощи какого приложения его открыть, или перетаскиваем значок файла на значок приложения - во всех этих случаях в некоем особом месте Windows, называемом командная строка, появляется некоторая запись. Смысл этой записи - сообщить запускаемому приложению, что пользователь уже выбрал файл для обработки.

      Приложение должно само проверить, нет ли у него задания, которое было сформировано одновременно с запуском, то есть приложение должно запросить у Windows командную строку.

      Для получения командной строки предназначена API-функция Windows GetCommandLine:
      Function GetCommandLine Lib "kernel32" Alias lpszSrc "GetCommandLineA" ().
Функция записывает (возвращает) в регистр EAX адрес или дальний указатель (long pointer) на оканчивающуюся нулем строку-источник (string zero Source) нужной нам информации. Если вызов функции неудачен, в регистр EAX будет записан ноль.

      Программа, которая получает и выводит в консоль командную строку:

.386 ; 32-битный режим .model flat, stdcall ; компиляция в exe-файл с возможностью вызова API option casemap :none ; неразличение прописных и строчных символов ; содержит значения констант include C:\masm32\include\windows.inc ; STD_INPUT_HANDLE, ; STD_OUTPUT_HANDLE include <\masm32\include\kernel32.inc> includelib <\masm32\lib\kernel32.lib> .data ; сегмент данных hConsoleInput DWORD ? ; переменные для записи хэндлов ввода и вывода hConsoleOutput DWORD ? Buffer byte 1 dup (0) ; буфер 1 байт для ввода с клавиатуры 1 символа NumberOfCharsRead DWORD ? ; переменные для записи числа фактически NumberOfCharsWritten DWORD ? ; введенных и выведенных символов msgExit byte " Press Enter to exit..." ; строковая переменная msg1310 byte 13, 10 ; перевод строки lpCommLine DWORD ? ; указатель на командную строку LenCommLine DWORD ? ; переменная для запоминания ; длины командной строки .code ; сегмент кода start: invoke GetCommandLine ; по выполнении функции получим в регистре ; EAX адрес (указатель) командной строки mov lpCommLine, eax ; записываем указатель в переменную mov ebx, 0 ; посылаем ноль в регистр EBX, этот регистр ; будем использовать как счетчик символов .while 1 ; начало цикла push [eax] ; копируем в стек то, что содержится ; в памяти по адресу, записанному в EAX pop edx ; извлекаем это из стека в регистр EDX ; условный оператор: .if dl == 0 ; проверяем младший байт регистра EDX jmp end_while ; на равенство нулю .endif ; (ноль означает конец командной строки) ; если ноль, то переходим на метку end_while: inc ebx ; увеличиваем EBX на единицу inc eax ; увеличиваем EAX на единицу .endw ; конец цикла end_while: ; метка для выхода из цикла MOV LenCommLine, ebx ; записываем в переменную число ; символов в командной строке invoke AllocConsole ; запрашиваем у Windows консоль invoke GetStdHandle, STD_INPUT_HANDLE ; получаем хэндл консоли для ввода mov hConsoleInput, eax ; записываем хэндл в переменную invoke GetStdHandle, STD_OUTPUT_HANDLE ; получаем хэндл консоли для вывода mov hConsoleOutput, eax ; записываем хэндл в переменную invoke WriteConsoleA, ; переводим строку в консоли hConsoleOutput, ; хэндл вывода ADDR msg1310, ; адрес строки msg1310 SIZEOF msg1310, ; размер строки msg1310 ADDR NumberOfCharsWritten, ; сюда функция запишет число символов 0 ; lpReserved передаем, как ноль invoke WriteConsoleA, ; выводим командную строку hConsoleOutput, lpCommLine, LenCommLine, ADDR NumberOfCharsWritten, 0 invoke WriteConsoleA, ; переводим строку hConsoleOutput, ADDR msg1310, SIZEOF msg1310, ADDR NumberOfCharsWritten, 0 invoke WriteConsoleA, ; пишем " Press Enter to exit..." hConsoleOutput, ADDR msgExit, SIZEOF msgExit, ADDR NumberOfCharsWritten, 0 invoke ReadConsoleA, ; ожидаем ввода hConsoleInput, ADDR Buffer, 1, ADDR NumberOfCharsRead, 0 invoke ExitProcess, 0 ; сообщаем системе, что программа окончена end start ; завершает сегмент кода

      Скомпилируйте программу. Посмотрите, какой будет командная строка при разных вариантах запуска: двойным щелчком мыши по значку программы; перетаскиванием на значок программы значка другого файла; перетаскиванием на значок программы группы значков.

     


Добавить комментарий

E-mail:
*


Контрольные цифры:



Ассемблер MASM32

      Простейшая программа на ассемблере (beeper)
      Переменные и типы данных ассемблера
      Регистры процессора IA32
      Консоль ввода-вывода
      API-функция CharToOem и строки ассемблера
      API-функция ReadConsoleInput
      API-функция PeekConsoleInput
      События консоли (таблица)
      Системы счисления, тэги ассемблера, перевод чисел
      Отрицательные числа
      Инкремент и декремент
      Деление (DIV, IDIV)
      VKDEBUG
      Макросы ассемблера
      Воспоминание об Альгамбре на системном динамике
      Командная строка
      Пузырьковая сортировка. Эстафета шариков
      Сортировка расческой
      Быстрая сортировка

     


© Max Petrov При использовании материалов ссылка на sadda.ru обязательна