С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
Dimka-novitsek
14 / 14 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
1

(5): i can not find "include windows.inc" - не компилируется кодоворот

23.06.2014, 14:09. Просмотров 1044. Ответов 6
Метки нет (Все метки)

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
.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  ; описатель экземпляра процесса с процедурой обработки сообщений
     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                              ; Конец программы с указанием точки в
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2014, 14:09
Ответы с готовыми решениями:

Обучающая программа "Окна" в windows не компилируется
Assembling: D:\MYPROG\Firstprogram\window.asm...

Не компилируется проект: "Fatal error A1000 cannot open file c:\1.asm"
Здраствуйте, работаю на MASM 32 работаю на виртуальной машине, при компиляции...

Книга Крупника "Самоучитель ассемблера": Ни один код не компилируется хатчевским пакетом Masm32
Кто-нибудь читал или учился по книге Крупника *Самоучитель ассемблера* ? Я...

Не компилируется "Hello, World" (*.сом)
CSEG segment org 100h Begin: mov ah,9 mov dx,offset Message int 21h...

Не компилируется "Hello, World" (MASM 10)
.386 .MODEL flat, stdcall .DATA m db 'hello word$' stk segment...

6
Mikl___
Автор FAQ
12001 / 6265 / 599
Регистрация: 11.11.2010
Сообщений: 11,339
23.06.2014, 14:29 2
Dimka-novitsek,
варианты:
  1. в асм-файле должен быть указан полный путь к inc- и lib- файлам, то есть вместо
    Assembler
    1
    
    include windows.inc
    должно быть
    Assembler
    1
    
    include c:\masm32\include\windows.inc
  2. путь к inc- и lib-файлам должен быть описан в бат-файле, подробности смотри в "приключениях Dimka-novitsek в стране obj-файлов"
  3. помести необходимые inc- и lib-файлы в ту же папку где находится asm-файл
1
Dimka-novitsek
14 / 14 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
23.06.2014, 16:17  [ТС] 3
Ага! Теперь ругается так.. D:\MYPROG\Firstprogram\CreateWin.asm(5) : fatal error A1000: cannot open file : \masm32\include\ windows.inc

Добавлено через 5 минут
Подождите, я их папробую местами поменять!

Добавлено через 3 минуты
Не помогает..

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

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.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
Добавлено через 21 минуту
11) : fatal error A1000: cannot open file : \masm32\include\ user32.inc- типерь так ругается.

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

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

Добавлено через 2 минуты
У!!! ЁКЛМН!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


И вот тот код выше, компилится- вчера, позавчера и сегодня!!!!!! Может ли быть такое!!!!!
0
Charles Kludge
Клюг
7645 / 3160 / 382
Регистрация: 03.05.2011
Сообщений: 8,382
23.06.2014, 16:34 4
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Так. Давайте мыслить логически.
Угу. Мой комп->ПКМ->Свойства->Дополнительно->Переменные окружения->в переменных для текущего юзверя заводишь пеpeменную MASM и задаешь ей значение c:\masm32 (или где он у тебя лежит), в переменную PATH добавляешь в хвост ;%MASM%\bin , в переменные INCLUDE и LIB добавляешь(если их нет - создаёшь) значения ;%MASM%\include и ;%MASM%\lib соответственно. прогу, в которой открыт исходник, надо перезапустить.
1
Mikl___
Автор FAQ
12001 / 6265 / 599
Регистрация: 11.11.2010
Сообщений: 11,339
23.06.2014, 17:21 5
Лучший ответ Сообщение было отмечено Dimka-novitsek как решение

Решение

Dimka-novitsek,
я один вижу пробел между \masm32\include\ и user32.inc ?
Assembler
1
\masm32\include\ user32.inc
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
И вот тот код выше, компилится- вчера, позавчера и сегодня!!!!!! Может ли быть такое!!!!!
У "программистов-коекакеров" именно так и бывает, там где обычный программист пишет без ошибок, программисты, которые пишут по принципу "и так сойдет" делают по 5 ошибок в одной строке
1
Dimka-novitsek
14 / 14 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
23.06.2014, 21:57  [ТС] 6
Очень хотелось бы продолжить розбирательство этого кода. Вопросов- просто масса, просто сплош.

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

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

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

Добавлено через 2 часа 45 минут
5.
Assembler
1
2
3
4
; Макрос, заносящий значения компонент палитры в регистр EAX
RGB macro red,green,blue
         mov     eax,blue shl 16 + green shl 8 + red
endm
На редкость непонятно, что же сдесь происходит!

Добавлено через 3 минуты
Совершается сдвиг shl над каждым из параметров? И они суммируюсся и кладутся в один регистр eax? В чем же тогда смысл??
0
Dimka-novitsek
14 / 14 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
25.06.2014, 18:15  [ТС] 7
Нет не понимаю! Функция принимает три параметра. Они хитрым образом, со сдвигом- помещаются в один регистр?? Мы все смешали в кучу- кони, люди- и типерь это одно число? А в чем же смысл? Или как оно работает?

Добавлено через 3 минуты
Вот к стати. Помогите исправить и обьясните!

(20) : error A2039: line too long
(76) : error A2044: invalid character in file
(77) : error A2044: invalid character in file
(78) : error A2044: invalid character in file
(79) : error A2044: invalid character in file
(80) : error A2044: invalid character in file
(81) : error A2044: invalid character in file
(82) : error A2044: invalid character in file
(83) : error A2044: invalid character in file

Добавлено через 1 час 11 минут
Дак как же. вот скажем использование макроса.

RGB 235,233,216 ; EAX = код серо-бежевого цвета

если даже цифры последовательно попробовать впихнуть в EAXони как я понимаю не влезут, т.к. EAX 8 знаков, а в числах 9 знаков. Или числа десятеричные?

Наверное все же так. Завтра попробую в Ольке посмотреть что ли.
АА, он же не компилится.. Ладно я пока спать.

Добавлено через 11 часов 23 минуты
Я понял!! Все понял!! Это три цвета, мы их смешиваем в численной пропорции и получаем тот цвет, которым закрасим то что закрасим.

8 шестнадцатеричных знака, а каждая компонента цвета - 2 шестнадцатеричных знака. А "235,233,216" - десятичные.

цвета хранятся от 0-255 на каждый разряд цвета, итого получаем три байта и один не нужный.

Все ясно!!

Добавлено через 7 часов 11 минут
CreateWin.asm(95) : error A2039: line too long

Здесь у меня 95: INVOKE GetMessage,ADDR msg,0,0,0 ; ожидаем.....

Что же делать? Вроде же все верно. Что же и как же ему еще написать?
0
25.06.2014, 18:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2014, 18:15

Выходит ошибка Необработанное исключение в "0x0007102f" в "Lab08.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00078000". Как исправить
.586 .model flat, stdcall option casemap :none ; case sensitive ; Раздел...

Есть строка. Нужно сделать так, чтобы "re" и "not" заменялись на "***".
Есть строка. Нужно сделать так, чтобы "re" и "not" заменялись на "***". Data...

Из двух строк "ABCDE" и "12345" сделать одну - "A1*B2*C3*D4*E5"
Нужно из двух строк ‘ABCDE’ и ‘12345’ сделать одну - ‘A1*B2*C3*D4*E5’....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru