Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2014, 14:16   #1
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 592
По умолчанию (5): i can not find "include windows.inc" - не компилируется кодоворот

Помогите пожалуста!

Код:
.386
     .model flat,stdcall
     option casemap:none
     ; Подключаем необходимые библиотеки и описания их структур и функций
     include windows.inc
     include user32.inc
     include kernel32.inc
     include gdi32.inc
     include comdlg32.inc
     includelib windows.inc
     includelib user32.lib
     includelib kernel32.lib
     includelib gdi32.lib
     includelib comdlg32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD; описываем прототип функции -для функции WinMain объявлюются 4 переменные размером двойное слово, которые использует функция
      ;далее при вызове этой функции в программе следуют 4 параметра   дескриптор текущего экземпляра окна  дескриптор предыдущего экземпляра окна  указатель на командную строку  показывает состояние окна 
; Макрос, заносящий значения компонент палитры в регистр EAX
RGB macro red,green,blue
         mov     eax,blue shl 16 + green shl 8 + red
endm
; Макрос для вставки текста
szText MACRO Name,Text:VARARG ;vararg. Это означает, что все, что указанно при вызове макроса в качестве параметров присваивается этому параметру как единая текстовая строка.
        .data
    Name     db Text,0  ;Директива NAME обеспечивает другой способ назначения имени модулю. Задает имя модуля объектного файла. В режиме MASM эта директива не действует, она работает только в режиме Ideal.
        .code
endm
.const
button1ID    equ 1
.data?
hwndbutton1  HWND ?
hInstance    HINSTANCE ?
CommandLine  LPSTR ?
.data
Textbutton1  db "Button1",0
;_______________
ClassName    db "MASM Builder",0
BtnClName    db "button",0
StatClName   db "static",0
EditClName   db "edit",0
LboxClName   db "listbox",0
CboxClName   db "combobox",0
ReditClName  db "richedit",0
RichEditLib  db "riched32.dll",0
Caption      db "Form",0
;_______________
.code
start:
         ; Получаем описатель нашего модуля
     invoke   GetModuleHandle,NULL  ;Если этот параметр - NULL, GetModuleHandle возвращает дескриптор файла, используемый, чтобы создать вызывающий процесс (.exe файл).
     mov      hInstance,eax
     ; Получаем адрес командной строки
     invoke   GetCommandLine
     ; Вызываем главную процедуру в стиле C++
     invoke   WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT; 4 параметр Определяет, как окно должно быть показано
     ; Завершаем процесс
     invoke   ExitProcess,eax
; Главная процедура в стиле C++
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD ;метка proc тип язык USES регистры ,ret ,метка endp
LOCAL   wc  :WNDCLASSEX ;директива LOCAL нужна дял объявления локальный переменных с процедурах. Локальные переменные содержатся в стеке и существуют только во время выполнения процедуры.
LOCAL   msg     :MSG
LOCAL   hwnd    :HWND
         ; Заполняем структуру WNDCLASSEX, хранящую информацию о создаваемом классе окон
     mov      wc.cbSize,SIZEOF WNDCLASSEX  ; размер структуры
     mov      wc.style,CS_HREDRAW or CS_VREDRAW  ; стиль окна
     mov      wc.lpfnWndProc,OFFSET WndProc  ; адрес процедуры обработки сообщений
     mov      wc.cbClsExtra,NULL  ; кол-во дополнительных байт за структурой класса (0)
     mov      wc.cbWndExtra,NULL  ; кол-во дополнительных байт за экземпляром окна (0)
     push     hInst
     pop      wc.hInstance  ; описатель экземпляра процесса с процедурой обработки сообщений

Последний раз редактировалось Dimka-novitsek; 23.06.2014 в 14:18.
Dimka-novitsek вне форума Ответить с цитированием
Старый 23.06.2014, 14:17   #2
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 592
По умолчанию

Код:
RGB      235,233,216  ; EAX = код серо-бежевого цвета
     invoke   CreateSolidBrush,eax  ; создаём кисть заполнения однородным цветом EAX
     mov      wc.hbrBackground,eax  ; кисть для заполнения фона (серо-
бежевым цветом)
     mov      wc.lpszClassName,OFFSET ClassName  ; имя класса
     invoke   LoadIcon,NULL,IDI_APPLICATION  ; загружаем стандартную иконку приложения
     mov      wc.hIcon,eax  ; большая иконка приложения
     mov      wc.hIconSm,eax  ; маленькая иконка приложения
     invoke   LoadCursor,NULL,IDC_ARROW  ; загружаем стандартный курсор
     mov      wc.hCursor,eax  ; курсор мыши в области окна
     mov      wc.lpszMenuName,NULL  ; имя или идентификатор меню (0)
     ; Регистрируем класс и создаём окно
     invoke   RegisterClassEx,addr wc
     invoke   CreateWindowEx,0,ADDR ClassName,ADDR Caption,WS_SYSMENU or WS_SIZEBOX,389,82,327,200,0,0,hInst,0
     ; Показываем окно
     mov      hwnd,eax
     INVOKE   ShowWindow,hwnd,SW_SHOWNORMAL
     INVOKE   UpdateWindow,hwnd
     ; Цикл обработки сообщений (стандартный)
     .WHILE TRUE
         INVOKE   GetMessage,ADDR msg,0,0,0  ; ожидаем и получаем сообщение
         .BREAK .IF (!eax)                   ; выходим из цикла, если получаем WM_QUIT (выход из приложения)
         INVOKE   TranslateMessage,ADDR msg  ; преобразуем символьные сообщения
         INVOKE   DispatchMessage,ADDR msg   ; обрабатываем сообщение
     .ENDW
     mov      eax,msg.wParam
     ret
WinMain endp
; Процедура обработки сообщений
WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
     .IF uMsg == WM_DESTROY  ; сообщение об уничтожении окна (передаётся во время закрытия окна)
         invoke   PostQuitMessage,NULL  ; отправляем в очередь сообщение WM_QUIT
     .ELSEIF uMsg == WM_CREATE  ; сообщение о создании окна (передаётся после создания окна)
             ; создаём кнопку с идентификатором = button1ID (кнопка - это тоже окно)
         invoke  CreateWindowEx,0,ADDR BtnClName,ADDR Textbutton1,WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,114,71,75,25,hWnd,button1ID,hInstance,0
 
         mov      hwndbutton1,eax  ; сохраняем описатель кнопки
     .ELSEIF uMsg == WM_COMMAND  ; сообщение о команде (например, нажатии на кнопку)
         mov     eax,wParam
         .IF lParam != 0  ; описатель контрола (равен нулю, если это НЕ контрол формы)
            .IF ax == button1ID  ; младшее слово wParam определяет идентификатор контрола
                 shr eax,16
                 .IF ax == BN_CLICKED  ; старшее слово wParam определяет код команды
                         ; Выводим на экран сообщение
                     invoke   MessageBox,hWnd,addr Textbutton1,NULL,MB_ICONINFORMATION
                 .ENDIF
             .ENDIF
         .ENDIF;
     .ELSE  ; другое сообщение
             ; Вызываем стандартный обработчик сообщения
         invoke   DefWindowProc,hWnd,uMsg,wParam,lParam
         ret
     .ENDIF
     xor     eax,eax  ; сообщение обработано
     ret
WndProc endp
end start                              ; Конец программы с указанием точки в

Последний раз редактировалось Dimka-novitsek; 23.06.2014 в 14:19.
Dimka-novitsek вне форума Ответить с цитированием
Старый 23.06.2014, 15:07   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
i can not find "include windows.inc"
Укажи ему там полный путь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.06.2014, 15:21   #4
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 592
По умолчанию

Спасибо! Попробую что-нибудь придпринять.. Варианты я вроде понял.

Ага! Теперь ругается так.. D:\MYPROG\Firstprogram\CreateWin.as m(5) : fatal error A1000: cannot open file : \masm32\include\ windows.inc

Подождите, я их папробую местами поменять!

Не помогает..

Так. Давайте мыслить логически. А я вчера скомпилировалкод, он скомпилился. Там тоже есть эта библиотека.


Код:
.386 
.model flat, stdcall 

option casemap:none

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\windows.inc


ExitProcess     PROTO      :DWORD 
.data 
MsgBoxCaption  db "Пример окна сообщения",0 
   MsgBoxText     db "Программировать на Ассемблере под Win32 очень просто!",0 
   
.const 
   NULL        equ  0 
   MB_OK    equ  0 
;псевдооператоры предназначены для присвоения некоторому выражению символического имени или идентификатора.

.code 
   Main: 
   INVOKE    MessageBoxA, NULL, ADDR MsgBoxText, ADDR MsgBoxCaption, MB_OK 

    INVOKE    ExitProcess, 0 
   end Main
11) : fatal error A1000: cannot open file : \masm32\include\ user32.inc- типерь так ругается.

Я закомментировал строку ;includelib \masm32\lib\ windows.inc

Строку ;includelib \masm32\lib\ user32.lib комментировал, раскомментировал- пофигу!!

У!!! ЁКЛМН!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


И вот тот код выше, компилится- вчера, позавчера и сегодня!!!!!! Может ли быть такое!!!!!

Последний раз редактировалось Stilet; 23.06.2014 в 17:49.
Dimka-novitsek вне форума Ответить с цитированием
Старый 23.06.2014, 17:35   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Код:
includelib \masm32\lib\windows.inc
Вас не смутило, что все остальные файлы имортируемые данной директивой имеют другое расширение?

Цитата:
И вот тот код выше, компилится- вчера, позавчера и сегодня!!!!!! Может ли быть такое!!!!!
А что в нем такого проблемного для компиляции?
p51x на форуме Ответить с цитированием
Старый 23.06.2014, 18:24   #6
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 592
По умолчанию

Спасибо! Там пробелы были лишние!

Очень хотелось бы продолжить розбирательство этого кода. Вопросов- просто масса, просто сплош.

1. GetModuleHandle. Функция возвращает дескриптор файла. Куда она его возвращает? Мне понятен ghbvthyj такой синтаксис как int Mifunk (A,B) {C=A+B; int C;} и потом Miperemen=Mifunk (10,20);
А как же мы тут не указываем?
Следует ли просто принимать что ВСЕГДА функция помещает свой результат в eax?

3. ; Получаем адрес командной строки
invoke GetCommandLine
Эта функция также помещает значение в в eax? ТАК А ПОЧЕМУ ЖЕ ТОГДА мы не помещаем его
в CommandLine, как это сделали в коде выше? Как же оно используется??

4. Что такое LPSTR ?

Последний раз редактировалось BDA; 22.09.2015 в 14:07.
Dimka-novitsek вне форума Ответить с цитированием
Старый 23.06.2014, 19:45   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
1. GetModuleHandle. Функция возвращает дескриптор файла. Куда она его возвращает? Мне понятен ghbvthyj такой синтаксис как int Mifunk (A,B) {C=A+B; int C;} и потом Miperemen=Mifunk (10,20);
А как же мы тут не указываем?
Следует ли просто принимать что ВСЕГДА функция помещает свой результат в eax?
http://ru.wikipedia.org/wiki/%D0%A1%...BE%D0%B2%D0%B5

Цитата:
Эта функция также помещает значение в в eax?
См. выше

Цитата:
ТАК А ПОЧЕМУ ЖЕ ТОГДА мы не помещаем его
в CommandLine, как это сделали в коде выше? Как же оно используется??
Это уже вопрос к вам как к программисту. Функция вас не обязывает, не хотите использовать - ну так не используйте.

Цитата:
4. Что такое LPSTR ?
http://msdn.microsoft.com/en-us/library/cc230353.aspx
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
p51x на форуме Ответить с цитированием
Старый 23.06.2014, 19:54   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
ТАК А ПОЧЕМУ ЖЕ ТОГДА мы не помещаем его
в CommandLine
Видимо проггер, писавший сей код просто забыл это сделать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.06.2014, 20:26   #9
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 592
По умолчанию

СПАСИБО!!!

5.
Код:
  RGB macro red,green,blue
         mov     eax,blue shl 16 + green shl 8 + red 
;сдвиг всех битов операнда влево на один разряд, при этом выдвигаемый слева бит 
;становится значением флага переноса cf;одновременно слева в операнд вдвигается 
;нулевой бит;указанные выше два действия повторяются количество раз, равное значению второго операнда. 
endm
На редкость непонятно, что же сдесь происходит!

Добавлено через 3 минуты
Совершается сдвиг shl над каждым из параметров? И они суммируюсся и кладутся в один регистр eax? В чем же тогда смысл??

Последний раз редактировалось BDA; 22.09.2015 в 14:08.
Dimka-novitsek вне форума Ответить с цитированием
Старый 23.06.2014, 22:20   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Dimka-novitsek Посмотреть сообщение
В чем же тогда смысл??
В читабельности кода.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обучающая программа ""Окна" в windows" не компилируется Dimka-novitsek Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 20.06.2014 14:42
HP Pavilion g6-2364sr: установить "Windows 7" вместо "Win8" malor Операционные системы общие вопросы 1 03.11.2013 23:20
Постоянно слетает галочка "автоматически" в "Параметры Excel", "Формулы", "Вычисления в книге" Alexsandrr Microsoft Office Excel 4 19.10.2013 14:22
Ошибка "Can't find project or library" cw_o Microsoft Office Word 2 21.05.2013 19:01
vector, find. "binary '==': no operator found which takes a left-hand operand of type ..." TwiX Общие вопросы C/C++ 7 30.08.2011 20:49