Страница 1 из 1

Привет - Моя первая программа

СообщениеДобавлено: 06 май 2026, 13:47
luzga
Руководство для начинающего программиста или интересующегося.
Загрузив прикрепленный ниже архив с исходным кодом программ на языке программирования (низкого уровня) Ассемблер, вы сможете одним запуском командного файла собрать приложение.
Ничего не нужно устанавливать и настраивать, всё в одной папке.
Просто распакуйте в любом месте. В ОС современного типа, соберётся одна программа (третья) под именем PrivWin32.

Первая программа COM.
 Развернуть: PrivCom . ASM - программа COM, DOS
Код: Выделить всё
%TITLE "PrivCom.asm"

; Сборка программы:
; tasm PrivCom
; tlink /k PrivCom
; В результате получится COM-программа.

.MODEL TINY
.DATA
msg db 'JPuBET!', 13, 10, 36
.CODE
org 100h
Start:
mov   ax, @data
mov   ds, ax
mov   ah, 9
mov   dx, offset msg
int   21h
mov   ah, 0
int   16h
mov   ax, 4C00h
int   21h
END   Start

Вторая прогамма EXE
 Развернуть: PrivExe . ASM - программа EXE, DOS
Код: Выделить всё
%TITLE "PrivExe.asm"

; Сборка программы:
; tasm PrivExe
; tlink PrivExe
; В результате получится EXE-программа.

.MODEL SMALL
.STACK 256
.DATA
msg db 'JPuBET!', 13, 10, 36
.CODE
Start:
mov   ax, @data
mov   ds, ax
mov   ah, 9
mov   dx, offset msg
int   21h
mov   ah, 0
int   16h
mov   ax, 4C00h
int   21h
END   Start

Третья программа EXE - Windows
 Развернуть: PrivWin32 . ASM - программа EXE, Windows
Код: Выделить всё
%TITLE "PrivWin32.asm"

   IDEAL   ; Переводит Turbo Assembler в режим Ideal.
   P386   ; Разрешение всех инструкций процессора 80386.
   MODEL   flat, STDCALL ; Модель памяти.

   DATASEG ; Сегмент данных.

szAppname   db 'PrivWin32', 0 ; Имя прикладной программы или заголовок
szMessage   db 'Привет - Моя первая программа.', 0 ; Cтрока сообщения.

   CODESEG ; Тело программы (сегмент кода).

global GetModuleHandleA:near ; Импортируемые функции из Windows
global MessageBoxA:near   ; API
global ExitProcess:near   ; (Application Program[ming] Interface).

Start:
   push   0      ; Стандартная процедура
   call   GetModuleHandleA   ; начала приложения.

   push   40h      ; Стиль окна сообщ. "ICON_INFORMATION"
   push   offset szAppname   ; Заголовок окна.
   push   offset szMessage   ; Строка сообщения.
   push   0      ; Идентификатор родительского окна.
   call   MessageBoxA   ; Вызов стандартного окна сообщений.

Exit:
   push   0      ; Код выхода и
   call   ExitProcess   ; завершение программы.

   END   Start   ; Конец программы/точка входа.

В пакете, находятся файлы сборки и компилятор Tasm. Хотя Tasm, вы можете скачать и с главного сайта форума.
Я добавил Tasm для удобства начинающего. Всё готово, стоит лишь запустить BAT-файл...

Образец BAT-сборки под Windows:
 Развернуть: Make_PrivWin32 . BAT - собирает программу EXE 32-битную
Код: Выделить всё
@Echo off

set APPNAME=PrivWin32

set TASM=%~dp0TASM\Bin
set PATH=%TASM%;
set INC=%~dp0TASM\Include
set LIBS=%~dp0TASM\Lib

if not exist %TASM% goto ERROR

Tasm32 /ml /m2 %APPNAME%
if errorlevel 1 goto DOEXIT

Brc32 -r -I%INC% -fo%APPNAME% %APPNAME%.rc
if errorlevel 1 goto DOEXIT

Tlink32 /Tpe /aa /c %APPNAME%.obj, %APPNAME%,, %LIBS%\import32, %APPNAME%.def, %APPNAME%.res
if errorlevel 1 goto DOEXIT
pause
del *.map
del *.obj
del *.res
del *.tr2
del *.td2
goto EXIT

:ERROR
@echo.
@echo.
@echo.   --- ERROR ---
@echo.   Missing %TASM%
@echo.
@echo.   Ћ˜€ЃЉЂ! ЋвбгвбвўгҐв Ї ЇЄ  %TASM%
@echo.

:DOEXIT
pause

:EXIT


Вложения:
Privet.zip
(1.94 Мб) Скачиваний: 46

Re: Привет - Моя первая программа

СообщениеДобавлено: 06 май 2026, 14:52
inc1001
luzga, это же был шуточный привет в качестве первого сообщения :).
Мне больше нравится MASM, сейчас использую версию 6.14.8444.
Что касается текстового стиля (на мой взгляд), табуляция внутри инструкций и капслок замедляет чтение и анализ кода.
В windows программе вызывается GetModuleHandleA, но дескриптор нигде не используется. Зачем?

Re: Привет - Моя первая программа

СообщениеДобавлено: 06 май 2026, 15:30
luzga
inc1001 писал(а):это же был шуточный привет в качестве первого сообщения

Вы хотели показать, что знаете, что-то?
Таким /, вся сеть наполнена. Сорри, но по-другому не скажешь. Толк из вашего кода, ведь так?
inc1001 писал(а):Что касается текстового стиля (на мой взгляд), табуляция внутри инструкций и капслок замедляет чтение и анализ кода.

Это ни на что не влияет, кроме удобства и понятливости!
inc1001 писал(а):В windows программе вызывается GetModuleHandleA, но дескриптор нигде не используется. Зачем?

Это приём. Хакерский.

Re: Привет - Моя первая программа

СообщениеДобавлено: 07 май 2026, 12:51
StoYazykov
luzga, а что за хакерский приём с GetModuleHandleA?

Re: Привет - Моя первая программа

СообщениеДобавлено: 07 май 2026, 13:50
luzga
StoYazykov писал(а):что за хакерский приём с GetModuleHandleA?

Смайли ставить обизательно ? :) Юмор, юмор. (ну-и ошибку спец.допустил);

Re: Привет - Моя первая программа

СообщениеДобавлено: 07 май 2026, 21:56
StoYazykov
Так что же за приём такой?
P. S. Я (полностью) перешёл на Линух, так что под Винду писать буду меньше.
P. P. S. Появился сайт для исходников программ: http://unixstoyazykov.hostingem.ru/

Получение IP-адреса.

СообщениеДобавлено: 08 май 2026, 07:46
luzga
На Ассемблере, писать программы сложно, но не из-за сложности как таковой.
Просто, неудобно работать с отладчиком, а он для 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   ; Конец программы/точка входа.

 Развернуть: Результат
Изображение


Вложения:
GetIP.zip
(51.47 Кб) Скачиваний: 40

Netmon

СообщениеДобавлено: 12 май 2026, 19:51
luzga
Программа отображает информацию о сетевом трафике.
Эта программа с просторов интернет. Мне с трудом удалось найти её!
Будет полезна обладателям Windows, начиная с 7 и выше. Думаю, будет работать. Ведь в современных ОС, нет никакой индикации, а это, будет помигивать.
 Развернуть: Так выглядит
Изображение

 Развернуть: Netmon.asm
смотрите в пакете


Вложения:
Netmon.zip
(59.37 Кб) Скачиваний: 27