

         Программирование на низком уровне 

 Чтобы начать программировать ,нужно сделать следующее 
 В папки "DISTRIB_ISPOL_PROG" находятся дистрибутивы программ 
 - траслятор  "masm32"  (m32v10r);
 - программа "FAR163~1.EXE";
 - программа отладчик "OLLYDBG";

Нужно поставить на компьюттер "masm32" , "FAR163~1.EXE" .
Программа "OLLYDBG" установки не требует. Папку  нужно скопировть 
туда ,где будут стоять папки программ  "masm32" и "FAR163" 
    Запускающий файл программы "OLLYDBG" OLLYDBG.EXE

В  папке "DOC_O_ASMBLERE" 
собрана информация как программировать на низком уровне.
 
    Я рекомендую начать учится программировать прочитав 
"Assembler&Win32. Курс молодого бойца. Введение.doc"

     При программировании на низком уровне в распоряжение программиста 
имеется  виртуальная память размером 2ГБ. 
   Пользовательские регистры:

восемь 32-битных регистров, 
которые могут использоваться программистами 
для хранения данных и адресов 
(их еще называют регистрами общего назначения (РОН)):
eax/ax/ah/al;
ebx/bx/bh/bl;
edx/dx/dh/dl;
ecx/cx/ch/cl;
ebp/bp;
esi/si;
edi/di;
esp/sp.

шесть регистров сегментов: cs, ds, ss, es, fs, gs;


регистр флагов eflags/flags;
регистр указателя команды eip/ip.

   Система команд микропроцессоров Intel.

   Система программного интерфейса ( WIN API)

    Для написания программы я использую текстовыей редактор "qeditor.exe".
Он находится в папке "masm32".
    Шаблон для написания программы выглядит следующим образом:
----------------------------------------------------------
;    Шаблон для написания программы 
.386
.model flat,stdcall
option casemap:none
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
include X:\masm32\INCLUDE\windows.inc
include X:\masm32\INCLUDE\user32.inc
include X:\masm32\INCLUDE\kernel32.inc
include X:\masm32\INCLUDE\comdlg32.inc
include X:\masm32\INCLUDE\comdlg32.inc

includelib X:\masm32\LIB\comdlg32.lib
includelib X:\masm32\LIB\user32.lib
includelib X:\masm32\LIB\kernel32.lib
includelib X:\masm32\LIB\comdlg32.lib
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

.const
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 ;Ваши константы  >

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

.DATA
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

   ;Ваши инициализированные данные>
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@




;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.DATA?
  ;Ваши неинициализированные данные>

;###############################################

.CODE
start:
 ;Ваш код программы >
;++++++++++++++++++++++++++++++++++++++++++++
;++++++++++++++++++++++++++++++++++++++++++++
;++++++++++++++++++++++++++++++++++++++++++++
      invoke ExitProcess, 0 
end start
----------------------------------------------------------
В шаблоне использую WIN API ExitProcess
Функция ExitProcess заканчивает работу процесса и всех его потоков.
(http://vsokovikov.narod.ru/New_MSDN_API/Process_thread/fn_exitprocess.htm)

Как произвести трасляцию программы собрано в папке "OSVAENIE_TRANSLJZII"

----------------------------------------------------------


   Описание процесса трансляции.

1. Скопируй содержимое папки "OSVAENIE_TRANSLJZII" в 
   папку "RAB_ASM_1"

2. Программой "FAR163" открой папку "RAB_ASM_1"

3. На клавиатуре клавишами "Вверх" или " Вниз"
   выдели файл "VOVA_12.BAT" 

4. Клавишами "Ctrl" а затем "Enter" перепиши файл "OVA_12.BAT"
   в командную строку. 
   
5. Клавишами    "Вверх" или " Вниз" выдели файл "BOLVAN_1.asm"

6.  Клавишами "Ctrl" а затем "Enter" допиши файл "BOLVAN_1.asm"
   в командную строку. 

7.  Клавишой "Backspace" убери расширение .asm

8. Нажми "Enter"

Произойдёт трансляция программы . В папке "RAB_ASM_1"
появится файлы "BOLVAN_1.exe" и "BOLVAN_1.obj".

Если этого не произойдёт в программе "FAR163" нажми клавишу "Esc"
и в её окне увидиш ход трасляции и ошибки трансляции.

----------------------------------------------------------
Добавим в шаблон программы функцию "MessageBox"

Функция MessageBox создает, показывает на экране и 
использует окно сообщения. Окно сообщения содержит определяемое
 программой сообщение и заголовок, плюс любая комбинация
  предопределенных значков и командных кнопок.
  (http://vsokovikov.narod.ru/New_MSDN_API/Dlg_box/fn_messagebox.htm)

В окне сообщения я помещю свои контакные даные .
MOJ_F_I_O   db 0dh,0ah
db  " Автор программы Гайда Владимир Григорьевич.       ",0dh,0ah
 db "                                                   ",0dh,0ah
 db "   Для  сотрудничества :                           ",0dh,0ah
 db "          Мобильный телефон         +77773679400      ",0dh,0ah
 db "          Домашний  телефон          +77272993291      ",0dh,0ah
 db "   Электронный адрес:                gaida@bk.ru       ",0
OSTANOV_1   db " Останов первый   ",0 ;

Внизу привожу текст программы "BOLVAN_3.asm"
----------------------------------------------------------
.386
.model flat,stdcall
option casemap:none
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
include X:\masm32\INCLUDE\windows.inc
include X:\masm32\INCLUDE\user32.inc
include X:\masm32\INCLUDE\kernel32.inc
include X:\masm32\INCLUDE\comdlg32.inc
include X:\masm32\INCLUDE\comdlg32.inc

includelib X:\masm32\LIB\comdlg32.lib
includelib X:\masm32\LIB\user32.lib
includelib X:\masm32\LIB\kernel32.lib
includelib X:\masm32\LIB\comdlg32.lib
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

.const
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 ;Ваши константы  >

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

.DATA
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
MOJ_F_I_O   db 0dh,0ah
db  " Автор программы Гайда Владимир Григорьевич.       ",0dh,0ah
 db "                                                   ",0dh,0ah
 db "   Для  сотрудничества :                           ",0dh,0ah
 db "          Мобильный телефон         +77773679400      ",0dh,0ah
 db "          Домашний  телефон          +77272993291      ",0dh,0ah
 db "   Электронный адрес:                gaida@bk.ru       ",0
OSTANOV_1   db " Останов первый   ",0 ;


   ;Ваши инициализированные данные>
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@




;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.DATA?
  ;Ваши неинициализированные данные>

;###############################################

.CODE
start:
 ;Ваш код программы >
;++++++++++++++++++++++++++++++++++++++++++++
;++++++++++++++++++++++++++++++++++++++++++++
;++++++++++++++++++++++++++++++++++++++++++++
invoke MessageBox,
0,
ADDR MOJ_F_I_O,
ADDR OSTANOV_1,
MB_OK
      invoke ExitProcess, 0 
end start
;++++++++++++++++++++++++++++++++++++++++++++

Транслируем программу . Получаем исполняемый файл "BOLVAN_3.exe"
 

----------------------------------------------------------
В папке "RAB_ASM_3"  показываю исходный код программы "SER_N_XARD_1.asm"
и исполняемый файл "SER_N_XARD_1.exe"
 Программа считывает серийный номер жёсткого диска ,выводит его 
 в сообщении "Cерийный номер жёсткого диска С, Номер программы " 
и записывает его в файл "SERIAL_C" в папку "RAB_ASM_3"

Исходный текст программы


.386
.model flat,stdcall
option casemap:none
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

include X:\masm32\INCLUDE\windows.inc
include X:\masm32\INCLUDE\user32.inc
include X:\masm32\INCLUDE\kernel32.inc
include X:\masm32\INCLUDE\comdlg32.inc
include X:\masm32\INCLUDE\comdlg32.inc

includelib X:\masm32\LIB\comdlg32.lib
includelib X:\masm32\LIB\user32.lib
includelib X:\masm32\LIB\kernel32.lib
includelib X:\masm32\LIB\comdlg32.lib
.const
.DATA
   ;Ваши инициализированные данные>
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NAZVANIE_RAB_EAX   db "Cерийный номер жёсткого диска С, Номер программы  ",0
PROBEL         db  20H
TECST_COD_16H  db  20H,20H,20H,20H,20H,20H,20H,20H,20H,20H,20H,20H ,0
SDVIGI    DB 28
COL_POVTORENIJ WORD 0
PEREVOD_16_VID  DWORD 77777777H
;-----------------------------------------------;
;                 00,01,02,03,04,05,06,07,08,09 ;
TABL_CODIR_16H DB 48,49,50,51,52,53,54,55,56,57 ;
;                  0  1  2  3  4  5  6  7  8  9 ;
;-----------------------------------------------;
;                 10,11,12,13,14,15             ;
               DB 65,66,67,68,69,70             ;
;                  A  B C  D  E  F              ;
;-----------------------------------------------;

RAB_EAX  DWORD 77777777H



;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IMJ_FAJLA_ZAPISI   db "C:SERIAL_C",0 
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
TEXT_KLUHA db "2"
db 0
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

MAG_DISK db "C:\",0 

AAAA  DWORD    0
BBBB  DWORD    0
Buffer DWORD 8 dup(0)
SerialNum   DWORD 8 dup(0)

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
OSTANOV1 db "Останов первый ",0 ;  
OSTANOVA1   db " Останов первый  ",0 ;

OSTANOV2 db "Останов ВТОРОЙ  ",0 ;  
OSTANOVA2   db " Останов ВТОРОЙ  ",0 ;


;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.DATA?
  ;Ваши неинициализированные данные>
hFile HANDLE ?      ;  Файловая ручка
hMemory HANDLE ?    ;  прооперируйте размещенный блок памяти
pMemory DWORD ?     ; указатель на размещенный блок памяти
lpRSName dd ?      ; Ячейка имени Файла
ccHandle HANDLE ?  ; 
hwndEdit HWND ?
SizeReadWrite DWORD ?

;###############################################

.CODE
;++++++++++++++++++++++++++++++++++++++++++++
;++++++++++++++++++++++++++++++++++++++++++++
JMP  start
;++++++++++++++++++++++++++++++++++++++++++++
ZIFRY_16_NYE   PROC     ; Получаем шестнатиричные цифры для вывода
;-----------------------;
  PUSHAD                ; Сохранения всех регистров
;-----------------------;
MOV  ECX,8              ; Очистка памяти для шестнатиричнх цифр
LEA  ESI,PROBEL         ;
LEA  EDI,TECST_COD_16H  ;
;-----------------------;
PV_4:                   ;
;-----------------------;
  MOV   EBX,[ESI]       ;
  MOV   [EDI],EBX       ;
  INC   ESI             ;
;  INC   EDI             ;
;-----------------------;
;-----------------------;
  LOOP  PV_4            ;
;-----------------------;
;-----------------------;
 MOV  SDVIGI,28         ;
 MOV  COL_POVTORENIJ,0  ;
;-----------------------;
;---------------------------------------------------------------------
LEA  ESI,TECST_COD_16H  ; Для формирования строки в клиенской части окна
                        ;
POVTOR_PREOBRAZOV:      ;
;-----------------------;
  MOV  EAX,PEREVOD_16_VID      ; Востанавливаем регистр EAX
;-----------------------;
;-----------------------;
;-----------------------; 123456FH
MOV  CL,SDVIGI          ; 000000
  SHR  EAX,CL           ;
  AND  EAX,000000FH     ;
    SUB  SDVIGI,4       ;
;---------------------------------------------------------------------
;-----------------------;
LEA  EBX,TABL_CODIR_16H ;
   XLAT                 ; Преобразование в выводимый символ
   MOV   [ESI],AL       ; Формирование выодимой строчки
   INC   ESI            ; Наращивание выводимой строчки
;-----------------------;
  INC COL_POVTORENIJ    ;
  CMP COL_POVTORENIJ,8  ;
  JZ  ZACON_PREOB       ;
  JMP POVTOR_PREOBRAZOV ;
ZACON_PREOB:            ;
;-----------------------;
;--------------------;
  POPAD              ; Востанавление всех регистров
  RET                ;
;--------------------;
ZIFRY_16_NYE      ENDP
;---------------------------------------------------------------------

;++++++++++++++++++++++++++++++++++++++++++++
VID_16_RAB_EAX   PROC ; 
;-----------------------;
  PUSHAD                ; Сохранения всех регистров
;-----------------------;
MOV EAX,RAB_EAX
MOV PEREVOD_16_VID,EAX ;

   CALL  ZIFRY_16_NYE   ;
invoke MessageBox,
 NULL, 
 addr TECST_COD_16H,
 addr NAZVANIE_RAB_EAX, 
  MB_OK
  POPAD              ; Востанавление всех регистров
  RET                ;
;--------------------;
VID_16_RAB_EAX    ENDP
;++++++++++++++++++++++++++++++++++++++++++++


;-----------------------;
OTKR_ZAPIS_FAJLA   PROC     ; Приём информации в СОМ порт
;-----------------------;
  PUSHAD                ; Сохранения всех регистров
invoke CreateFile,ADDR IMJ_FAJLA_ZAPISI,\
GENERIC_READ or GENERIC_WRITE ,\
FILE_SHARE_READ or FILE_SHARE_WRITE,\
NULL,CREATE_NEW,FILE_ATTRIBUTE_ARCHIVE,\
NULL
mov hFile,eax

invoke WriteFile,
hFile,
ADDR SerialNum,
0000000FH,
ADDR SizeReadWrite,
NULL

invoke CloseHandle,hFile

  POPAD              ; Востанавление всех регистров
  RET                ;
;--------------------;
OTKR_ZAPIS_FAJLA      ENDP
;++++++++++++++++++++++++++++++++++++++++++++
start:

invoke GetVolumeInformation,
addr MAG_DISK,\
0,\
0,
addr SerialNum,\;  00403028              AC A9 AB B4      ¬©«ґ
0,\
0,\
0,\
0
;--------------------;

CALL OTKR_ZAPIS_FAJLA

MOV EBX,SerialNum
MOV RAB_EAX,EBX
;--------------------;
CALL VID_16_RAB_EAX
;--------------------;
      invoke ExitProcess, 0
end start
------------------------------------------------------------

Используемые WIN API функции.

Функция GetVolumeInformation возвращает информации о файловой системе 
и объеме, чей корневой директорий определен.
(http://win-api.narod.ru/a2400.htm)

Функция CreateFile создает или открывает каталог, физический диск,
 том, буфер консоли (CONIN$ или CONOUT$), устройство на магнитной ленте, 
 коммуникационный ресурс, почтовый слот или именованный канал.
  Функция возвращает дескриптор, который может быть
   использован для доступа к объекту.
(http://vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_createfile.htm)

Функция WriteFile пишет данные в файл с места, обозначенного указателем
 позиции в файле. Эта функция предназначена и для синхронной, и для асинхронной операции. 
(http://vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_writefile.htm)


Функция CloseHandle закрывает дескриптор открытого объекта.
(http://vsokovikov.narod.ru/New_MSDN_API/Handles_objects/fn_closehandle.htm)

------------------------------------------------------------
Уроки Исцилиона.
уроки находятся в папке "DOC_O_ASMBLERE"
Открой папку "DOC_O_ASMBLERE" в ней папку "wasm-offline-06_03_2006"
Запусти файл "wasm-offline-06_03_2006.chm" и ты увидишь 
Архив статей WASM.RU на 18.01.2004 в в нём  Уроки Iczelion'а

Примеры к урокам находятся в папке "ISXOD_COD_UROCOV"

В папке "IZUHENIJ_ICZELIONA" находятся папки изучения уроков.

------------------------------------------------------------
Что не понятно , спрашивайт ,пишите
 Мобильный телефон:          +77773679400      
 Домашний  телефон:          +77272993291      
 Электронный адрес:          gaida@bk.ru 
 ICQ:                        470530516    

Гайда Владимир Григорьевич.  
 









 
