На Ассемблере, писать программы сложно, но не из-за сложности как таковой.
Просто, неудобно работать с отладчиком, а он для Tasm, один - Turbo Debugger.
В любом случае, здесь будет несколько программ, может и больше...
Чтобы программа делала, что-то полезное, напишем утилиту Получение IP-адреса.
Прежде всего, нужно оборудовать среду разработки.
Внести путь компилятора в список переменных ОС.
В современных ОС, сейчас уже нет файла Autoexec.bat, в нём располагался
список.
Как же быть? Можно в корне диска ОС, создать в Блокноте (Notepad)
вызвав нажатием Win+R, напечатать Notepad %SystemDrive%\Autoexec.bat
Если файла нет, система спросит: - Cоздать файл с именем Autoexec?
Нужно заключить имя файла в кавычки, добавив расширение BAT и сохранить.
Добавим путь Tasm в переменную Path:
Path=C:\Tasm\Bin
Если переменная Path уже есть? Тогда добавить новое значение через точку с запятой.
Развернуть: Пример моего Autoexec.bat@Echo Off
Path=C:\BC5\Bin;C:\Bin;C:\Bin\Dos;C:\Tasm\Bin
@C:\Bin\Dos\mode con codepage prepare=((866) C:\Bin\Dos\Ega3.cpi)
@C:\Bin\Dos\mode con codepage select=866
@C:\Bin\Dos\keyb ru,,C:\Bin\Dos\Keybrd3.sys
IF "%config%"=="IDLE" goto SKIP
call Empty
:SKIP
Чтобы изменения вступили в силу, нужно перезагрузить компьютер.
Такой способ применяется для компьютеров работающих под ДОС.
В Windows настройка списка переменных делается так:
нажать сочетание клавиш Win+R и ввести команду: SYSDM.cpl
Этим вызывается Свойства системы, сродни нажатию правой клавишей мыши по-значку Мой Компьютер.
Нужно открыть вкладку Дополнительно и перейти на Переменные среды.
В Переменных среды, нужно, если нет переменной Path (в самом верху),
создать и добавить значение, а если есть, добавить через точку с запятой.
Развернуть: Переменные средыПосле всех изменений, для проверки, открыть консоль Win+R, команда:
cmd /k
аргумент k добавлен для того, чтобы консоль не закрылась, так было раньше
в версиях Windows XP до сервис пак 3 (SP3). Нажимаешь или вводишь cmd
и всё, закрылось...
В открывшейся консоли, ввести команду: Tasm
Должен быть результат вывода подсказки о работе Tasm или, в случае неверных натроек, сообщение о том, что не найдена команда.
Развернуть: Результат команды TasmВаша задача, настроить переменные среды!
Я постарался описать некоторые детали т.е. читайте комментарий в коде программы. Также. Большую помощь оказывает Гугл, если задать вопрос
вида Tasm CreateFileA() пример - получите информацию!
Развернуть: GetIP.asm- Код: Выделить всё
%TITLE "GetIP.asm"
;-------------------------------------------------------
; Программа подключается к сайту checkip.dyndns.org
; по-протоколу HTTP. Скачивает страницу "Current IP Check.htm".
; Сохраняет скаченное во-временной директории ОС Windows,
; с именем ip.txt. Копирует адрес в Буфер Обмена
; выводит информацию и завершается.
; Программа работает в ОС Windows.
;-------------------------------------------------------
IDEAL ; Переводит Turbo Assembler в режим Ideal.
P386 ; Разрешение всех инструкций процессора 80386.
MODEL flat, STDCALL ; Модель памяти.
DATASEG ; Сегмент данных.
;-------------------------------------------------------
szAppname db 'GetIP', 0 ; Имя (заголовок) программы
; urlmon.dll модуль библиотеки ОС
szLibFileName db 'urlmon',0
; Имя функции
szProcName db 'URLDownloadToFileA',0
; Страница, которую программа, попробует загрузить.
szUrl db 'http://checkip.dyndns.org/Current IP Check.htm',0
; Имя файла в котором будет сохранена страница.
szName db 'ip.txt',0
; Информационные сообщения.
szFormat db 'IP-адрес компьютера: %s', 0
szFormat2 db 'IP-адрес компьютера: %s', 13, 10, 13, 10
db 'Адрес скопирован в Буфер Обмена', 13, 10
db 'для вставки в документ нажмите клавишу "Ctrl+V".',0
; Сообщения о неудачах.
szErr1 db 'Не удалось загрузить функцию URLDownloadToFile',0
szErr2 db 'Нет связи.',0
szErr3 db 'Не удалось создать временный файл для записи.',0
szError db 'Нет ', 0
szFailed db 'Не удалось', 0
; Другие переменные.
szSkobka db '<',0
szTempFileName db 104h dup(0) ; MAX_PATH = 260
szBuff db 400h dup(0) ; 1024
szResult db 400h dup(0) ; 1024
pURLDownloadToFile dd 0
hModule dd 0
hFile dd 0 ; Дескриптор файла
szToken dd 0
dwBytesRead dd 0
nLen dd 0
CODESEG ; Тело программы (сегмент кода).
;-------------------------------------------------------
; Список процедур экспортируемых из ОС.
include "AProc.inc" ; Отдельный файл, для удобства.
;-------------------------------------------------------
Start:
; Загрузка функции URLDownloadToFile
; из библиотечного модуля urlmon.dll
push offset szProcName
push offset szLibFileName
call LoadLibraryA
; Получить адрес функции
push eax ; hModule
call GetProcAddress
; Сохранить адрес функции в переменной
mov [pURLDownloadToFile], eax
; Адрес функции получен, если регистр EAX не нуль
; продолжить программу или сообщить о ошибке и выйти из программы.
cmp eax, 0
jne short @@10
push offset szErr1 ; Отправить сообщение о ошибке и
call mb ; выйти из программы.
@@10:
; Сооружение имени файла в который будет записан
; ответ удаленного сервера.
; Сначала узнать, где расположен временный каталог системы.
push offset szTempFileName
push 104h
call GetTempPathA
; Конкатенации (объединение) двух строк.
; имя временного каталога ОС (у меня C:\Temp) с именем файла
; C:\Temp и Ip.txt
push offset szName
push offset szTempFileName
call lstrcatA
; Вызов функции ОС URLDownloadToFile
; скачивает файл из интернета (URL) и сохраняет
; его на локальный диск. В нашем случае во временный
; каталог ОС с именем Ip.txt (у меня C:\Temp\Ip.txt).
push 0
push 0
push offset szTempFileName
push offset szUrl
push 0
call [pURLDownloadToFile]
cmp eax, 0
je short @@20
push offset szErr2 ; Отправить сообщение о ошибке и
call mb ; выйти из программы.
@@20:
; Открыть записанный файл из временного каталога
;
push 0 ; hTemplateFile Дескриптор файла шаблона
push 0 ; dwFlagsAndAttributes Атрибуты файла
push 3 ; dwCreationDisposition Действие (создать/открыть)
push 0 ; lpSecurityAttributes Атрибуты безопасности
push 0 ; dwShareMode Режим совместного доступа
push 80000000h ; dwDesiredAccess Режим доступа (чтение/запись)
push offset szTempFileName ; Имя файла/устройства
call CreateFileA
mov [hFile], eax ; Дескриптор файла
cmp eax, 0FFFFFFFFh ; -1
jne short @@30
push offset szErr3 ; Отправить сообщение о ошибке и
call mb ; выйти из программы.
@@30:
; Получить данные из файла в буфер.
;
push 0 ; lpOverlapped Для асинхронного чтения
push offset dwBytesRead ; lpNumberOfBytesRead Указатель на переменную с числом считанных байт
push 80h ; nNumberOfBytesToRead Сколько байт прочитать
push offset szResult ; Буфер для данных
push [hFile] ; Дескриптор файла
call ReadFile
push [hFile]
call CloseHandle
; Разбор данных.
push 3Ah ; Отсечь строку по двоеточие :
push offset szResult
call strrchr
add esp, 8
mov [szToken], eax
push offset szSkobka
push [szToken]
call strtok
add esp, 8
mov [szToken], eax
push 400h
mov eax, [szToken]
add eax, 2
push eax ; String
push offset szResult
call lstrcpynA
push offset szResult
call lstrlenA
mov [nLen], eax
cmp [nLen], 0
jz short @@40
; Скопировать IP-адрес в Буфер Обмена.
push offset szResult
call CopyToClipboard
mov [nLen], eax
@@40:
cmp [nLen], 0
jnz short @@50
push offset szResult
push offset szFormat
push offset szBuff
call _wsprintfA
add esp, 0Ch
jmp short @@99
@@50:
push offset szResult
push offset szFormat2
push offset szBuff
call _wsprintfA
add esp, 0Ch
@@99:
push offset szBuff
call mb
;Exit:
push 0
call ExitProcess ; Завершение программы.
;-------------------------------------------------------
; Подпрограммы помощники
;-------------------------------------------------------
proc CopyToClipboard
ARG Str:dword
USES ebx, edi, esi
call CloseClipboard
call GetActiveWindow
push eax
call OpenClipboard
test eax, eax
jz short @@99
call EmptyClipboard
mov ebx, [Str]
push ebx
call lstrlenA
inc eax
push eax ; Bytes
push 2002h ; Flags
call GlobalAlloc
mov esi, eax
test esi, esi
jz short @@10
push esi ; Mem
call GlobalLock
mov ebx, [Str]
push ebx
push eax ; String
call lstrcpyA
push esi ; Mem
call GlobalUnlock
push esi ; Mem
push 1 ; uFormat
call SetClipboardData
test eax, eax
jz short @@10
mov ebx, 1
@@10:
call CloseClipboard
@@99:
mov eax, ebx
ret
endp CopyToClipboard
proc mb
ARG svStr:dword
USES ebx, edi, esi
mov esi, 11040h ; uType
xor ebx, ebx
push offset szFailed ; В строке есть слово "Failed"?
mov edi, [svStr]
push edi
call strstr
add esp, 8
cmp eax, 0
jne short @@10
push offset szError ; В строке есть слово "Error"?
push edi
call strstr
add esp, 8
cmp eax, 0
je short @@20
@@10:
inc ebx
@@20:
cmp ebx, 0
je short @@30
and esi, 0FFFFFFBFh
or esi, 30h
@@30:
push esi ; uType
push offset szAppname ; lpCaption
push edi ; lpText
call GetActiveWindow
push eax ; hWnd
call MessageBoxA
cmp ebx, 0
je short @@99
push ebx ; uExitCode
call ExitProcess
@@99:
ret
endp mb
END Start ; Конец программы/точка входа.
Развернуть: Результат