Как установить Tasm

Всё, что касается программирования на старых языках или для старых систем

Как установить Tasm

Сообщение rvg » 23 сен 2023, 20:47

Небольшая памятка для того кто хочет собирать программы самостоятельно.
Скачайте с главного сайта форума пакет программ. Разархивируйте на диск C.
Можно на любой, но не на "Рабочий Стол" и не в папку содержащую Кириллицу (Русский текст).
Скачивайте Tasm 5.
Скаченный - не распаковывая переименуйте в 1. Распакуйте. В полученой папке будет как в матрешке еще одна папка с именем TASM5P - переименуйте в Tasm и перенесите на диск C. Если у вас ОС выше Windows 98 нажмите клавишу WinKey (Это с флажком фирмы Microsoft) и не отпуская её клавишу Break.
Свойства Системы / Дополнительно / Нажать - Переменные среды
Вложения
WinKey_Br.jpg
WinKey_Br.jpg (46.81 Кб) Просмотров: 7940
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 464
Зарегистрирован: 18 июл 2023, 14:12

Re: Как установить Tasm

Сообщение longhorn_gnu » 23 сен 2023, 20:48

rvg писал(а):Скачайте с главного сайта форума пакет программ. Разархивируйте на диск C.

А какой именно пакет программ?
Software is like sex: it's better when it's free.
Изображение
Аватара пользователя
longhorn_gnu
Мастер Даунгрейда
 
Сообщения: 750
Зарегистрирован: 05 июн 2023, 08:32
Железо: Intel Core I5, встройка на 256 мб и 8 гб ОЗУ

Re: Как установить Tasm

Сообщение rvg » 23 сен 2023, 20:53

Создайте переменную Path и задайте значение для неё, это:
C:\Tasm\Bin;
Вложения
OS_Path.jpg
OS_Path.jpg (49.25 Кб) Просмотров: 7934
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 464
Зарегистрирован: 18 июл 2023, 14:12

Re: Как установить Tasm

Сообщение rvg » 23 сен 2023, 20:57

longhorn_gnu писал(а):А какой именно пакет программ?

Tasm (Turbo Assembler) версия 5 но т.к. знатоки сами знают, для
новичка рассказ. Во-вторых не нужно устанавливать - он уже распакован.
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 464
Зарегистрирован: 18 июл 2023, 14:12

Re: Как установить Tasm

Сообщение rvg » 23 сен 2023, 21:01

Если вы на Windows 9x то нужно отредактировать файл Autoexec.bat
 Развернуть: Пример Autoexec.bat
Код: Выделить всё
@Echo Off

Path=C:\BC5\Bin;C:\Bin;C:\Bin\Dos;C:\Tasm\Bin

@mode con codepage prepare=((866) C:\Windows\Command\Ega3.cpi)
@mode con codepage select=866
@keyb ru,,C:\Windows\Command\Keybrd3.sys

C:
Beep

Вообще-то у меня первая 98, второй Xp на одном компьютере.
А MSDos.sys отрегулирован не запускать Gui-оболочку, вручную ввожу win
 Развернуть: Фрагмент MSDos.sys
[Options]
BootGUI=0
Последний раз редактировалось rvg 23 сен 2023, 21:04, всего редактировалось 1 раз.
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 464
Зарегистрирован: 18 июл 2023, 14:12

Re: Как установить Tasm

Сообщение rvg » 23 сен 2023, 21:14

:(
Последний раз редактировалось rvg 30 сен 2023, 11:37, всего редактировалось 1 раз.
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 464
Зарегистрирован: 18 июл 2023, 14:12

Re: Как установить Tasm

Сообщение krotan » 25 сен 2023, 10:58

Инструкция на тему "как запускать TASM для DOS из-под Windows вместо DOS"...
krotan
Мастер Даунгрейда
 
Сообщения: 140
Зарегистрирован: 03 фев 2022, 20:16

Программа - Шаблон - Tasm32 (Ассемблер)

Сообщение rvg » 15 фев 2024, 17:42

Создание приложения "Win32" - для Tasm32 (ассемблер).
Подразумевается, точка входа WinMain.

Необходимые файлы для сборки программы:
App.asm - ассемблерный модуль программы.
Код: Выделить всё
%TITLE "App.asm"   ; Необязательная строка. Описывает назначение программы.

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

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

szAppName   db 'App', 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   ; Вызов стандартного окна сообщений.

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

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

App.def - файл необходим для импорта функций, а также для
работы с Turbo Debugger (TD32.exe). Если программу собрать
без def-файла и попробовать запустить отладчик - ничего не
произойдёт!
Deb.bat - файл сборки отладочной версии.
Desc_MakeFile.txt - некоторое описание файла "MakeFile".
(MakeFile не будет работать при наличии в нём кириллических символов т.е. русских букв, поэтому это относительное пояснение, в рабочем файле всё по-английски!)
Код: Выделить всё
# make -B   Вызывается (этот файл) при сборке приложения "App.exe"
# make -B -DDEBUG Вызов (этот файл) при сборке отладочной версии "App.exe"

# Создать проект "Win32". Точка входа функция WinMain ()
LINKOPT=/Tpe /aa /c

# Создание консольного проекта. Точка входа функция main ()
#LINKOPT=/Tpe /ap /c

# Имя приложения при выходе.
NAME   = App

MAIN   = App
DEF   = $(NAME).def

MOD01   = App

#--------------------------------------[ OBJ's - объектные модули.
OBJS   = $(MOD01).obj

# Опции транслятора (Tasm).
ASMOPT   = /kh100000 /ml /m2

# Опции (Tasm) и компилятора (Tlink) при отладочной и обычной версии.
!if $d(DEBUG)
TASMDEBUG=/zi
LINKDEBUG=/v
!else
TASMDEBUG=
LINKDEBUG=
!endif

# Расположение библиотечных функций.
!if $d(MAKEDIR)
IMPORT=$(MAKEDIR)\..\lib\import32
!else
IMPORT=import32
!endif

# Список зависимостей с информацией о сборке.
All = $(NAME).exe

$(NAME) : $(All)
   @echo.
   @echo.
   @echo.   ...[ MakeNode $(NAME).exe ]...
   @echo.
   @echo.

#--------------------------------------[ Порядок сборки.
$(NAME).exe : $(OBJS)
   Tlink32 $(LINKDEBUG) $(LINKOPT) @&&|
$(MAIN).obj
$(NAME).exe

$(IMPORT)
$(DEF)
|

#--------------------------------------[ ASM модули.
.asm.obj:
   Tasm32 $(ASMOPT) $(TASMDEBUG) $*

$(MOD01).obj   : $(MOD01).asm

M.bat - файл сборки программы.
MakeFile - файл для сборки программы с помощью "Make.exe".
ZMake.bat - файл сборки программы с помощью "Make.exe".
ZMaked.bat - файл сборки программы (отладочной версии)
с помощью "Make.exe".

Еще раз о том - как установить путь переменной окружения системы:
Изображение
Вложения
App.zip
(5.08 Кб) Скачиваний: 104
Последний раз редактировалось rvg 16 фев 2024, 07:30, всего редактировалось 4 раз(а).
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 464
Зарегистрирован: 18 июл 2023, 14:12

Winapp - Минимальное приложение для Windows

Сообщение rvg » 18 фев 2024, 10:50

Программировать на Ассемблере можно, но по времени дольше (из-за объёма вводимых строк). Я редко программирую так, но полезно знать - как это происходит. Программа представляет собой диалоговое окно с меню, двумя кнопками, выводом текста. Подлючен акселератор (клавиатуры) при нажатии комбинации клавиш: "Alt+/?" выводится информация в виде диалогового окна "О программе" (About). Программа контролирует размер своего окна (не даёт уменьшать).
 Развернуть: Winapp.asm
Код: Выделить всё
%TITLE "Winapp.asm -- Минимальное приложение для Windows." ; Необязательная строка. Описывает назначение программы.

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

include   "Win32.inc"   ; Содержит структуры, определение переменных.
include   "Winapp.ri"   ; Вставка идентификаторов ресурсов.
WINDOW_WIDTH   = 520   ; Ширина окна приложения.
WINDOW_HEIGHT   = 288   ; Высота окна.
MIN_WINDOW_WIDTH = WINDOW_WIDTH-10   ; Минимальная ширина окна.
MIN_WINDOW_HEIGHT = WINDOW_HEIGHT-10   ; Минимальная высота окна.

   DATASEG   ; Сегмент инициализированных переменных.

GWndname   db 'wnd_winapp', 0
GAppname   db 'Winapp', 0
GMenuAbout   db 'About...', 0
GButton      db 'button', 0
GStart      db 'Start', 0
GExit      db 'Exit', 0
GQuest       db 'Do you want to close the program?', 0
GStr      db 'You smell really bad. '
      db 'Shave, lose weight, and get a real job.',10,13
      db 'Ты очень плохо пахнешь. '
      db 'Побрейся, похудей и получи настоящую работу.', 0
GErr1       db 'Failed register class', 0
GErr2       db 'Failed create window', 0
GErr3      db 'Failed load accelerators', 0
GErr4      db 'Failed create button', 0

   UDATASEG ; Сегмент неинициализированных переменных.
GInstance      dd ?
g_hWnd      dd ?

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

include "IProc.inc"   ; Определение внешних функций
      ; импортируемых из Windows.

proc   mb
   ARG   Str:dword
   push   ICON_INFORMATION
   push   offset GAppname
   mov   eax, [Str]
   push   eax
   call   GetActiveWindow
   push   eax
   call   MessageBoxA
   ret
endp   mb

proc   warn
   ARG   Str:dword
   push   ICON_WARNING
   push   offset GAppname
   mov   eax, [Str]
   push   eax
   call   GetActiveWindow
   push   eax
   call   MessageBoxA
   ret
endp   warn

proc   DlgProc
   USES   edi, esi
   ARG   hWnd:dword, uMsg:dword, wParam:dword, lParam:dword
   mov   edi, [hWnd]
   mov   esi, [uMsg]
   cmp   esi, WM_INITDIALOG
   je   short @@WMINITDIALOG
   cmp   esi, WM_COMMAND
   je   short @@WMCOMMAND
   jmp   short @@RETURNFALSE

@@WMINITDIALOG:
   jmp   short @@RETURNTRUE
@@WMCOMMAND:
   mov   esi, [wParam]
   cmp   esi, IDOK
   je   short @@IDOK
   jmp   short @@RETURNFALSE
@@IDOK:
   push   0
   push   edi   ; hWnd
   call   EndDialog
   jmp   short @@RETURNTRUE
@@RETURNTRUE:
   mov   eax, TRUE
   jmp   short @@99
@@RETURNFALSE:
   mov   eax, FALSE
@@99:
   ret
endp   DlgProc

proc   OnCreate
   USES   ecx
   LOCAL   Menu:dword
   push   0
   mov   eax, [g_hWnd]
   push   eax
   call   GetSystemMenu
   mov   [Menu], eax
   cmp   [Menu], 0
   jz   short @@10
   push   offset GMenuAbout
   push   IDM_ABOUTBOX
   push   MF_BYPOSITION
   push   5   ; uPosition
   mov   ecx, [Menu]
   push   ecx
   call   ModifyMenuA
   push   0
   push   MF_SEPARATOR
   push   MF_BYPOSITION
   push   5   ; uPosition
   mov   edx, [Menu]
   push   edx
   call   InsertMenuA
   push   0
   push   MF_SEPARATOR
   push   MF_BYPOSITION
   push   7   ; uPosition
   mov   eax, [Menu]
   push   eax
   call   InsertMenuA
@@10:
   push   0
   mov   ecx, [GInstance]
   push   ecx
   push   IDM_START
   mov   edx, [g_hWnd]
   push   edx
   push   0   ; nHeight
   push   0   ; nWidth
   push   0   ; Y
   push   0   ; X
   push   WS_VISIBLE or WS_TABSTOP or WS_CHILD ; dwStyle
   push   offset GStart   ; "Start"
   push   offset GButton   ; "button"
   push   0      ; dwExStyle
   call   CreateWindowExA
   cmp   eax, 0
   jne   short @@20
   push   offset GErr4   ; "Could not create button"
   call   warn
   add   esp, 4
   or   eax, 0FFFFFFFFh
   jmp   short @@99
; ---------------------------------------------------------------------------
@@20:
   push   0
   mov   eax, [GInstance]
   push   eax
   push   IDM_EXIT
   mov   ecx, [g_hWnd]
   push   ecx
   push   0   ; nHeight
   push   0   ; nWidth
   push   0   ; Y
   push   0   ; X
   push   WS_VISIBLE or WS_TABSTOP or WS_CHILD ; dwStyle
   push   offset GExit   ; "Exit"
   push   offset GButton   ; "button"
   push   0      ; dwExStyle
   call   CreateWindowExA
   cmp   eax, 0
   jne   short @@DONE
   push   offset GErr4   ; "Could not create button"
   call   warn
   add   esp, 4
   or   eax, 0FFFFFFFFh
   jmp   short @@99
; ---------------------------------------------------------------------------
@@DONE:
   mov   eax, TRUE
@@99:
   ret
endp   OnCreate

proc   OnCommand
   ARG   hWnd:dword, wParam:dword
   LOCAL   nId:dword
   mov   eax, [wParam]
   and   eax, 0FFFFh
   mov   [nId], eax
   cmp   [nId], IDM_START
   jz   short @@IDM_START
   cmp   [nId], IDM_EXIT
   jz   short @@IDM_EXIT
   cmp   [nId], IDM_CLOSE
   jz   short @@IDM_CLOSE
   cmp   [nId], IDM_ABOUT
   jz   short @@IDM_ABOUT
   jmp   short @@99
; ---------------------------------------------------------------------------
@@IDM_START:
   push   offset GStr
   call   mb
   add   esp, 4
   jmp   short @@99
@@IDM_EXIT:
   push   0
   push   0
   push   WM_DESTROY
   jmp   short @@10
@@IDM_CLOSE:
   push   0
   push   0
   push   WM_CLOSE
@@10:
   mov   eax, [hWnd]
   push   eax
   call   SendMessageA
   jmp   short @@99
@@IDM_ABOUT:
   push   0
   push   offset DlgProc
   mov   eax, [hWnd]
   push   eax
   push   IDD_ABOUTBOX
   mov   eax, [GInstance]
   push   eax
   call   DialogBoxParamA
@@99:
   mov   eax, TRUE
   ret
endp   OnCommand

proc   OnSize
   USES   ecx
   ARG   hWnd:dword, nType:dword, nCx:dword, nCy:dword
   mov   eax, [hWnd]
   push   eax
   call   IsWindowVisible
   test   eax, eax
   jz   short @@99
   push   20Ch   ; uFlags
   push   1Ch   ; cy
   push   64h   ; cx
   push   0Ah   ; Y
   push   0Ah   ; X
   push   0
   push   IDM_START
   mov   ecx, [hWnd]
   push   ecx
   call   GetDlgItem
   push   eax   ; hWnd
   call   SetWindowPos
   push   20Ch   ; uFlags
   push   1Ch   ; cy
   push   64h   ; cx
   push   0Ah   ; Y
   mov   edx, [nCx]
   sub   edx, 6Eh
   push   edx   ; X
   push   0
   push   IDM_EXIT
   mov   eax, [hWnd]
   push   eax
   call   GetDlgItem
   push   eax   ; hWnd
   call   SetWindowPos
   push   TRUE   ; bErase
   push   0   ; lpRect
   mov   ecx, [hWnd]
   push   ecx
   call   InvalidateRect
@@99:
   ret
endp   OnSize

proc   WndProc
   USES   edx, edi, esi
   ARG   hWnd:dword, uMsg:dword,\
      wParam:dword, lParam:dword

   LOCAL   @@sys:dword, @@pDC:dword,\
      @@ps:PAINTSTRUCT, @@rect:RECT

   mov   edi, [hWnd]
   mov   esi, [uMsg]
   cmp   esi, WM_CREATE
   je   short @@WMCREATE
   cmp   esi, WM_SIZE
   je   short @@WMSIZE
   cmp   esi, WM_PAINT
   je   @@WMPAINT
   cmp   esi, WM_COMMAND   ; Command
   je   @@WMCOMMAND
   cmp   esi, WM_SYSCOMMAND   ; Sys command
   je   @@WM_SYSCOMMAND
   cmp   esi, WM_GETMINMAXINFO ; Disable size window
   je   @@WMGETMINMAXINFO
   cmp   esi, WM_CLOSE
   je   @@WMCLOSE
   cmp   esi, WM_DESTROY
   je   @@WMDESTROY
   jmp   @@DEFWINDOWPROC
@@WMCREATE:
   mov   edi, [hWnd]
   mov   [g_hWnd], edi
   call   OnCreate
   cmp   eax, TRUE
   je   @@RETURNZERO
   jmp   @@99
@@WMSIZE:
   mov   edx, [lParam]   ; nCy
   shr   edx, 10h
   and   edx, 0FFFFh
   and   edx, 0FFFFh
   push   edx
   mov   ecx, [lParam]   ; nCx
   and   ecx, 0FFFFh
   push   ecx
   mov   edx, [wParam]   ; nType
   push   edx
   mov   eax, [hWnd]
   push   eax      ; hWnd
   call   OnSize
   add   esp, 10h
   jmp   @@RETURNZERO
@@WMPAINT:
   lea   eax, [@@ps]
   push   eax
   push   edi      ; hWnd
   call   BeginPaint
   mov   [@@pDC], eax
   push   TRANSPARENT
   push   eax
   call   SetBkMode
   jmp   SKIP

   push   offset GStr   ; Length of string
   call   lstrlenA
   push   eax
   push   offset GStr   ; String
   push   50      ; y
   push   20      ; x
   push   [@@pDC]      ; the DC
   call   TextOutA
   jmp   short SKIP2
SKIP:
   push   DT_EXTERNALLEADING or DT_NOPREFIX or DT_WORDBREAK
   mov   [@@rect.left], 20      ; 10
   mov   [@@rect.top], 50      ; 10
   mov   [@@rect.right], 500      ; 600
   mov   [@@rect.bottom], 200   ; 100
   lea   eax, [@@rect]
   push   eax
   push   -1
   push   offset GStr   ; String
   push   [@@pDC]
   call   DrawTextA
SKIP2:
   lea   eax, [@@ps]
   push   eax
   push   edi      ; hWnd
   call   EndPaint
   jmp   @@RETURNZERO
@@WMCOMMAND:
   push   [lParam]
   push   [wParam]
   push   edi      ; hWnd
   call   OnCommand
   jmp   short @@RETURNZERO
@@WM_SYSCOMMAND:
   mov   dx, [word wParam]
   mov   [word ptr @@sys], dx
   mov   eax, [@@sys]
   and   eax, 0FFFFh
   cmp   eax, IDM_ABOUTBOX
   je   short @@IDM_ABOUTBOX
   jmp   @@DEFWINDOWPROC
@@IDM_ABOUTBOX:
   push   0
   push   IDM_ABOUT
   push   WM_COMMAND
   push   edi
   call   SendMessageA
   jmp   short @@99
@@WMGETMINMAXINFO:
   mov   eax, [lParam]
   mov   [(MINMAXINFO eax).mintrackposition_x], MIN_WINDOW_WIDTH
   mov   [(MINMAXINFO eax).mintrackposition_y], MIN_WINDOW_HEIGHT
   jmp   short @@RETURNZERO
@@WMCLOSE:
   push   MB_YESNO or MB_ICONQUESTION
   push   offset GAppname
   push   offset GQuest
   push   edi      ; hWnd
   call   MessageBoxA
   cmp   eax, IDYES
   jne   short @@RETURNZERO
   push   edi      ; hWnd
   call   DestroyWindow
   jmp   short @@RETURNZERO
@@WMDESTROY:
   push   0
   call   PostQuitMessage
   jmp   short @@RETURNZERO
@@DEFWINDOWPROC:
   push   [lParam]
   push   [wParam]
   push   esi      ; uMsg
   push   edi      ; hWnd
   call   DefWindowProcA
   jmp   short @@99
@@RETURNZERO:
   mov   eax, FALSE
@@99:
   ret
endp   WndProc

proc   RegisterWin
   LOCAL   @@wcex:WNDCLASSEXA
   mov   [@@wcex.cbSize], WNDCLASSEXA_LEN ; sizeof WNDCLASSEXA
   mov   [@@wcex.style], CS_HREDRAW or CS_VREDRAW
   mov   [@@wcex.lpfnWndProc], offset WndProc
   mov   [@@wcex.cbClsExtra], 0
   mov   [@@wcex.cbWndExtra], 0
   mov   eax, [GInstance]
   mov   [@@wcex.hInstance], eax
   push   IDR_MAINFRAME
   push   eax
   call   LoadIconA
   mov   [@@wcex.hIcon], eax
   push   IDI_ICON_SMALL
   mov   eax, [@@wcex.hInstance]
   push   eax
   call   LoadIconA
   mov   [@@wcex.hIconSm], eax
   push   IDC_ARROW
   push   0
   call   LoadCursorA
   mov   [@@wcex.hCursor], eax
   mov   [@@wcex.hbrBackground], COLOR_WINDOW
   mov   [@@wcex.lpszMenuName], IDR_MAINFRAME
   mov   [@@wcex.lpszClassName], offset GWndname
   lea   eax, [@@wcex]
   push   eax
   call   RegisterClassExA
   cmp   eax, 0
   je   ERROR_REGISTER
   ret
endp   RegisterWin

proc   AppInit
   USES   ecx, edx
   LOCAL   nWidth:dword, nHeight:dword, nX:dword, nY:dword
   call   RegisterWin
   push   0   ; Pointer to window-creation data
   push   [GInstance] ; Handle to application instance
   push   0   ; Handle to menu, or child-window identifier
   push   0   ; Handle to parent or owner window

   ; --- Set window position center ---
   mov   [nWidth], WINDOW_WIDTH
   mov   [nHeight], WINDOW_HEIGHT
   push   0
   call   GetSystemMetrics
   sub   eax, [nWidth]
   cdq
   sub   eax, edx
   sar   eax, 1
   mov   [nX], eax
   push   1
   call   GetSystemMetrics
   sub   eax, [nHeight]
   cdq
   sub   eax, edx
   sar   eax, 1
   mov   [nY], eax
   mov   ecx, [nHeight]
   push   ecx
   mov   edx, [nWidth]
   push   edx
   mov   eax, [nY]
   push   eax
   mov   ecx, [nX]
   push   ecx
   ;jmp   short @@10

   ; Set window position default
   ;push   0      ; Window height
   ;push   CW_USEDEFAULT   ; Window width
   ;push   0      ; Y vertical position of window
   ;push   CW_USEDEFAULT   ; X horizontal position of window
;@@10:
   ; --- Window style ---
   ;push   WS_SYSMENU or WS_CAPTION or WS_MINIMIZEBOX
   push   WS_OVERLAPPEDWINDOW

   push   offset GAppname   ; Pointer to registered window name
   push   offset GWndname   ; Pointer to registered class name

   ; --- Extended window style ---
   push   WS_EX_APPWINDOW   ; Normal window
   ;push   WS_EX_CLIENTEDGE   ; Edge

   call   CreateWindowExA
   cmp   eax, 0
   je   ERROR_CREATE
   mov   [g_hWnd], eax

   ; Show and update window.
   push   SW_SHOWNORMAL
   push   [g_hWnd]
   call   ShowWindow
   push   [g_hWnd]
   call   UpdateWindow
   ret
endp   AppInit

proc   AppRun
   USES   ecx, edx
   LOCAL   @@msg:MSGSTRUCT, Accel:dword
   ; Load accelerator
   push   IDR_MAINFRAME
   mov   eax, [GInstance]
   push   eax
   call   LoadAcceleratorsA
   cmp   eax, 0
   je   ERROR_ACCEL
   mov   [Accel], eax
@@10:
   push   0
   push   0
   push   0
   lea   eax, [@@msg]
   push   eax
   call   GetMessageA
   test   eax, eax
   jle   short @@99
   lea   ecx, [@@msg]
   push   ecx
   mov   edx, [Accel]
   push   edx
   mov   eax, [g_hWnd]
   push   eax
   call   TranslateAcceleratorA
   test   eax, eax
   jnz   short @@20
   lea   ecx, [@@msg]
   push   ecx
   mov   edx, [g_hWnd]
   push   edx
   call   IsDialogMessageA
   test   eax, eax
   jnz   short @@20
   lea   eax, [@@msg]
   push   eax
   call   TranslateMessage
   lea   ecx, [@@msg]
   push   ecx
   call   DispatchMessageA
@@20:
   jmp   short @@10
@@99:
   mov   eax, [@@msg.wParam]
   ret
endp   AppRun

proc   WinMain
   call   AppInit
   call   AppRun
   ret
endp   WinMain

Start:
   push   0
   call   GetModuleHandleA
   mov   [GInstance], eax
   push   0
   push   offset GWndname
   call   FindWindowA
   or   eax, eax
   jnz   short Exit
   call   WinMain
   jmp   short Exit

ERROR_REGISTER:
   push   offset GErr1
   call   warn
   add   esp, 4
   jmp   short Exit

ERROR_CREATE:
   push   offset GErr2
   call   warn
   add   esp, 4
   jmp   short Exit

ERROR_ACCEL:   
   push   offset GErr3
   call   warn
   add   esp, 4
Exit:
   push   0
   call   ExitProcess

   END   Start   ; Конец программы/точка входа
Вложения
Winapp.zip
(15.5 Кб) Скачиваний: 92
Winapp_prew.png
Winapp_prew.png (5.08 Кб) Просмотров: 4375
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 464
Зарегистрирован: 18 июл 2023, 14:12

Winapp - мультимодульность

Сообщение rvg » 19 фев 2024, 10:14

В этой версии Winapp, показывается как подключить несколько модулей, один из которых на языке высокого уровня (C++).
Си-модуль под названием "OnFileOpen.cpp". Как можно понять из названия открывает какой-то файл. Эта функция сработает, если в меню File, выбрать пункт "Open" или нажать клавушу "Alt+O".
 Развернуть: OnFileOpen.cpp
Код: Выделить всё
#include <windows.h>

extern "C" void warn(char*); /* Функция находится в ассемблерном модуле. */

extern "C" char* OnFileOpen(HWND hWnd)
{
   char svFilename[MAX_PATH];
   OPENFILENAME ofn;
   memset(&ofn,0,sizeof(OPENFILENAME));
   svFilename[0]=0;

   ofn.lStructSize=sizeof(OPENFILENAME);
   ofn.hwndOwner=hWnd;
   ofn.hInstance=GetModuleHandle(NULL);
   ofn.lpstrFile=svFilename;
   ofn.lpstrInitialDir="C:\\"; /* В этом месте откроется выбор файлов. */
   ofn.nMaxFile=MAX_PATH;
   ofn.lpstrFileTitle=NULL;
   ofn.nMaxFileTitle=0;
   ofn.lpstrTitle="Выберите какой-нибудь файл..."; /* Сообщение, что выбирать... */

   /* Шаблон. Все файлы.
   ofn.lpstrFilter="All Files (*.*)\0*.*\0";*/
   /* Шаблон: только текстовые файлы.
   ofn.lpstrFilter="TXT Files (*.txt)\0*.txt\0";*/
   /* Шаблон: текстовые и все другие файлы. */
   ofn.lpstrFilter="TXT Files [Текстовые файлы] (*.txt)\0*.txt\0All Files [Все файлы] (*.*)\0*.*\0";

   ofn.Flags=OFN_FILEMUSTEXIST |
   OFN_HIDEREADONLY | OFN_PATHMUSTEXIST;
   GetOpenFileName(&ofn);
   if(!svFilename[0])
      return NULL; /* Файл не выбран. */

   HANDLE hFile=CreateFile(svFilename,
   GENERIC_READ,
   FILE_SHARE_READ,
   NULL,
   OPEN_EXISTING,
   FILE_ATTRIBUTE_NORMAL,
   NULL);
   if(INVALID_HANDLE_VALUE==hFile) {
      warn("Экскюзьми: не смог открыть файл!");
      return NULL;
   }

   char* svBuff=(char*)GlobalAlloc(GMEM_FIXED,1024+1);
   if(!svBuff)   {
      warn("Вот те раз: нехватка памяти для чтения файла!");
      CloseHandle(hFile);
      return NULL;
   }
   svBuff[1024]=0;

   DWORD dwBytesRead;
   ReadFile(hFile,(LPVOID)svBuff,1024,&dwBytesRead,NULL);
   CloseHandle(hFile);
   if(!dwBytesRead) {
      svBuff[0]=0;
      warn("Досада: не смог прочитать файл!");
   }
   else
      svBuff[dwBytesRead]=0;

   return svBuff;
}

Отдельным модулем вынесена функция обработки команд программы, это ассемблерный модуль OnCommand.asm, что соответствует имени функции.
 Развернуть: OnCommand.asm
Код: Выделить всё
%TITLE "OnCommand.asm -- Модуль для Winapp.asm" ; Необязательная строка. Описывает назначение программы.

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

include   "Win32.inc"   ; Содержит структуры, определение переменных.
include   "Winapp.ri"   ; Вставка идентификаторов ресурсов.

   DATASEG   ; Сегмент инициализированных переменных.

include "IData.inc"   ; Определение глобальных переменных.

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

include "IProc.inc"   ; Определение внешних функций.
      ; И - импортируемых из Windows.

proc   OnCommand
   ARG   hWnd:dword, wParam:dword
   LOCAL   nId:dword
   mov   eax, [wParam]
   and   eax, 0FFFFh
   mov   [nId], eax
   cmp   [nId], IDM_FILEOPEN
   je   short @@IDM_FILEOPEN
   cmp   [nId], IDM_START
   je   short @@IDM_START
   cmp   [nId], IDM_EXIT
   je   short @@IDM_EXIT
   cmp   [nId], IDM_CLOSE
   je   short @@IDM_CLOSE
   cmp   [nId], IDM_ABOUT
   je   short @@IDM_ABOUT
   jmp   short @@99
; ---------------------------------------------------------------------------
@@IDM_FILEOPEN:
   mov   eax, [hWnd]
   push   eax
   call   _OnFileOpen
   add   esp, 4
   cmp   eax, 0
   je   short @@99
   push   eax
   push   offset GStr
   call   lstrcpyA
   push   TRUE   ; bErase
   push   0   ; lpRect
   mov   ecx, [hWnd]
   push   ecx
   call   InvalidateRect
   jmp   short @@99
@@IDM_START:
   push   offset GStr
   call   mb
   add   esp, 4
   jmp   short @@99
@@IDM_EXIT:
   push   0
   push   0
   push   WM_DESTROY
   jmp   short @@10
@@IDM_CLOSE:
   push   0
   push   0
   push   WM_CLOSE
@@10:
   mov   eax, [hWnd]
   push   eax
   call   SendMessageA
   jmp   short @@99
@@IDM_ABOUT:
   push   0
   push   offset DlgProc
   mov   eax, [hWnd]
   push   eax
   push   IDD_ABOUTBOX
   mov   eax, [GInstance]
   push   eax
   call   DialogBoxParamA
@@99:
   mov   eax, TRUE
   ret
endp   OnCommand

   END   ; Конец модуля.

Теперь вам известно, как можно сооружать многомодульные программы.
Вообще. Многомодульность - это удобно, не нужно крутить курсором, отвлекаясь. Всё перед глазами. Ну и конечно преимущество не только в этом.
Кто-то из вас - напишет большую программу, а они - большие, пишутся именно так.
Чтобы скомпановать с Cи-модулем, вам потребуется установить компилятор фирмы Borland.
Вложения
Winapp_Cpp.zip
(18.57 Кб) Скачиваний: 87
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 464
Зарегистрирован: 18 июл 2023, 14:12

Turbo Debugger - основы отладки

Сообщение rvg » 20 фев 2024, 20:22

Откройте с помощью Notepad "Deb.bat" и измените следующую строку:
cmd /c mode 80,25 &&TD32 Winapp
Это упростит работу с Turbo Debugger в Windows XP и выше (для Windows 9x - это не требуется).
Вложения
01_Dbg.PNG
01_Dbg.PNG (22.93 Кб) Просмотров: 4107
02_Dbg.PNG
02_Dbg.PNG (68.34 Кб) Просмотров: 4107
03_Dbg.PNG
03_Dbg.PNG (125.81 Кб) Просмотров: 4107
Последний раз редактировалось rvg 21 фев 2024, 07:04, всего редактировалось 2 раз(а).
Аватара пользователя
rvg
Мастер Даунгрейда
 
Сообщения: 464
Зарегистрирован: 18 июл 2023, 14:12


Вернуться в Программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1