|
Командная строка
Когда мы открываем какой-либо файл, связанный с определенным приложением, или открываем этот файл, по правой кнопке мыши показывая, при помощи какого приложения его открыть, или перетаскиваем значок файла на значок приложения - во всех этих случаях в некоем особом месте Windows, называемом командная строка, появляется некоторая запись. Смысл этой записи - сообщить запускаемому приложению, что пользователь уже выбрал файл для обработки. Приложение должно само проверить, нет ли у него задания, которое было сформировано одновременно с запуском, то есть приложение должно запросить у Windows командную строку.
Для получения командной строки предназначена API-функция
Windows GetCommandLine:
Программа, которая получает и выводит в консоль командную строку:
.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 ; завершает сегмент кода
Скомпилируйте программу. Посмотрите, какой будет командная строка при разных вариантах запуска: двойным щелчком мыши по значку программы; перетаскиванием на значок программы значка другого файла; перетаскиванием на значок программы группы значков.
Добавить комментарий Ассемблер MASM32
Простейшая программа на ассемблере (beeper)
|
© Max Petrov | При использовании материалов ссылка на sadda.ru обязательна |