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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2023, 03:33   #1
groverx
Пользователь
 
Регистрация: 08.11.2023
Сообщений: 24
По умолчанию Опять про создание окна. Вопрос от новичка

Хочу разобраться с программированием на чистом ассемблере. Допустим, у меня такая программа

Код:
.386
.model flat,stdcall
option casemap:none
include E:\masm32\include\windows.inc

include E:\masm32\include\kernel32.inc
include E:\masm32\include\user32.inc
includelib E:\masm32\lib\kernel32.lib
includelib E:\masm32\lib\user32.lib

.data
er      DB "ошшшшшибкаааа",0
er1     DB "eeeerrrrrr",0
gav     DB "GAV!!!",0
mes     DB "тут",0
klass   DB "class",0
okno    DB "tipa_okno",0

wStil   DD 4003h                       ;стиль
wProc   DD 0                           ;процедура окна
        DD 0
        DD 0
wProg   DD 0
wIkon   DD 0
wKurs   DD 0
wCvet   DD 11h                         ;цвет
wMenu   DD 0
wClass  DD 0

hOkno   DD 0
hProg   DD 0
msg     DD 0,0,0,0,0,0,0,0,0
       

.code
start:
        push 0
        call GetModuleHandleA
        mov [hProg],eax
        mov [wProg],eax
                                ;регистрировать класс

       
        push 7f00h
        push 0
        call LoadIconA
        mov [wIkon],eax
        push 7f00h
        push 0
        call LoadCursorA
        mov [wKurs],eax     
        mov eax,offset klass
        mov [wClass],eax
        mov eax,offset okProc
        mov [wProc],eax
        mov eax,offset wStil
        push eax
        call RegisterClassA
        cmp eax,0
        jz errr1
                                                ;создать окно
        push 0
        push [hProg]
        push 0
        push 0
        push 80000000h                        ;высота
        push 80000000h                        ;ширина
        push 80000000h                        ;Y
        push 80000000h                        ;X
        push 0cf0000h                   ;стиль
        push offset okno
        push offset klass
        push 0
        call CreateWindowExA
        cmp eax,0
        jz errr

        mov [hOkno],eax
        push 1
        push [hOkno]
        call ShowWindow
        push [hOkno]
        call UpdateWindow

        call soob

cikl:   push 0                           ;цикл
        push 0
        push 0        
        push offset msg
        call GetMessageA        
        cmp eax,0
        jz vyh
        push offset msg
        call TranslateMessage
        push offset msg
        call DispatchMessageA
        jmp cikl

okProc: mov ebp,esp
        cmp dword ptr [ebp+0ch],2        ;wm_destroy
        jz des
        cmp dword ptr [ebp+0ch],1        ;wm_create
        jz retur
        push dword ptr [ebp+14h]
        push dword ptr [ebp+10h]
        push dword ptr [ebp+0ch]
        push dword ptr [ebp+8h]
        call DefWindowProcA
        jmp retur
des:    push 0
        call PostQuitMessage
retur:  mov eax,0
        ret        
   
vyh:    push 0
        call ExitProcess



soob:   push 30h
        push offset mes
        push offset gav
        push 0  
        call MessageBoxA
        ret
errr:   push 30h
        push offset er
        push offset er
        push 0  
        call MessageBoxA
        jmp vyh        
errr1:  push 30h
        push offset er1
        push offset er1
        push 0  
        call MessageBoxA
        jmp vyh          
end start
В MASM32 компилируется нормально, а после запуска выдает ошибку после CeateWindowExA
т.е срабатывает jz errr.
Кто-нибудь подскажет, почему?
groverx вне форума Ответить с цитированием
Старый 08.11.2023, 15:56   #2
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от groverx Посмотреть сообщение
Код:
        push 80000000h                        ;высота
        push 80000000h                        ;ширина
        push 80000000h                        ;Y
        push 80000000h                        ;X
Сколько-сколько? -2147483648 пикселей? Выдыхай, бобер, выдыхай!
Vapaamies на форуме Ответить с цитированием
Старый 09.11.2023, 00:30   #3
groverx
Пользователь
 
Регистрация: 08.11.2023
Сообщений: 24
По умолчанию

80000000h - это CW_USEDEFAULT, см windows.inc
С другими значениями тоже не работает

Последний раз редактировалось groverx; 09.11.2023 в 00:36.
groverx вне форума Ответить с цитированием
Старый 09.11.2023, 14:51   #4
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Как именно не работает? Что возвращает GetLastError?
Vapaamies на форуме Ответить с цитированием
Старый 09.11.2023, 18:49   #5
groverx
Пользователь
 
Регистрация: 08.11.2023
Сообщений: 24
По умолчанию

Не знал про GetLastError. Прочитал про нее сейчас - она возвращает код последней ошибки
Короче, чтоб не париться я этот код загнал в MeesageBox, вот так у меня получилось:
Код:
errr:   
        call GetLastError
        mov dword ptr [xx],eax
        push 30h
        push offset er
        push offset xx
        push 0  
        call MessageBoxA
        jmp vyh
ну и в секции .data добавил xx dd 0,0
И мне выдало окошко с содержимым- х с квадратиком
Что это значит- я не знаю.
А вообще - что не так с моим кодом вообще?

Последний раз редактировалось groverx; 09.11.2023 в 18:58.
groverx вне форума Ответить с цитированием
Старый 09.11.2023, 19:37   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от groverx Посмотреть сообщение
Что это значит- я не знаю.
Что строка и число это разные вещи.
p51x вне форума Ответить с цитированием
Старый 10.11.2023, 03:58   #7
groverx
Пользователь
 
Регистрация: 08.11.2023
Сообщений: 24
По умолчанию

накидал по-быстрому подпрограмку перевода 16ричных чисел в текст. Оказывается GetLastError
выдает код 0578h. В сравочнике написано:
1400: Недопустимый дескриптор окна.
Чем ему дескриптор- то не нравится?
groverx вне форума Ответить с цитированием
Старый 10.11.2023, 06:04   #8
groverx
Пользователь
 
Регистрация: 08.11.2023
Сообщений: 24
По умолчанию

р51х, строка и число - это одно и то же. Это тупо последовательность байт в памяти компьютера
groverx вне форума Ответить с цитированием
Старый 10.11.2023, 14:41   #9
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от groverx Посмотреть сообщение
1400: Недопустимый дескриптор окна.
После какой функции выдает? Еще не вижу в коде восстановления EBP из стека.
Vapaamies на форуме Ответить с цитированием
Старый 10.11.2023, 15:32   #10
groverx
Пользователь
 
Регистрация: 08.11.2023
Сообщений: 24
По умолчанию

а его и нет. зачем тебе ebp?
а выдает после функции CreateWindowExA. я позавчера об этом писал, см.выше..
groverx вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос от новичка Валерий718 Помощь студентам 4 23.10.2013 19:28
Вопрос новичка geranton Общие вопросы Delphi 2 23.03.2012 14:00
Вопрос новичка vaultboy2010 Общие вопросы C/C++ 3 02.10.2011 01:51
Создание функции вопрос от новичка C CKent Общие вопросы C/C++ 2 07.12.2008 17:31