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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.06.2012, 17:11   #1
Berlioz
Изучающий C и ASM
Пользователь
 
Регистрация: 25.05.2012
Сообщений: 89
По умолчанию GUI приложение x64

Всем привет! Пишу на FASM x64 программу

Взял из папки examples в качестве примера прорамму DIALOG

Следующий код работает на ура на x32, но не работает на x64.

Код:
cmp [wparam], BN_CLICKED shl 16 + IDC_BTN1
je .message
Поясняю: при нажатии на кнопку идет вызов сообщения. На х32 все хорошо, на х64 словно на эту кнопу нет события.

В чем проблема?
Berlioz вне форума Ответить с цитированием
Старый 21.06.2012, 20:55   #2
Dizelektwo
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 56
По умолчанию

В Win 64 нет эмулятора DOS, следовательно работать с 16битными регистрами ты не сможешь.
Пробуй на виртуальной машине.
Dizelektwo вне форума Ответить с цитированием
Старый 21.06.2012, 21:13   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
В Win 64 нет эмулятора DOS, следовательно работать с 16битными регистрами ты не сможешь.
Пробуй на виртуальной машине.
вы чего?
какой нафиг дос?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.06.2012, 21:48   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
cmp dword ptr [wparam], бла-бла
вроде как. Если не указывать размер, оно 8 байт будет сравнивать, если не ошибаюсь.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 22.06.2012, 03:52   #5
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

veniside
так при передаче параметров процедуре WndProc параметры hWnd, umsg, lparam и wparam должны уже быть описаны как DWORD
Mikl___ вне форума Ответить с цитированием
Старый 22.06.2012, 10:29   #6
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
cmp dword ptr [wparam], бла-бла

вроде как. Если не указывать размер, оно 8 байт будет сравнивать, если не ошибаюсь.
мысль правильная, только если это честные 64 бита, то длина wparam тоже 64 бита, более того в 64-м режиме если размер не указан явно предпочтение отдается размеру в 32 бита.
итого:
Код:
cmp QWORD PTR [wparam], BN_CLICKED shl 16 + IDC_BTN1
f.hump вне форума Ответить с цитированием
Старый 22.06.2012, 19:43   #7
Berlioz
Изучающий C и ASM
Пользователь
 
Регистрация: 25.05.2012
Сообщений: 89
По умолчанию

Все равно не пашет, хоть ты тресни
Вот код
Код:
format PE64 GUI 4.0
entry start

include '\fasm\include\win64a.inc'
include 'gui.inc'

section '.data' data readable writable
_title db 'Title from GUI',0
_message db 'Message',0

section '.code' code readable executable
start:

sub rsp,8*5

invoke GetModuleHandle, 0
invoke DialogBoxParam,rax,1000,HWND_DESKTOP,DialogProc,0

or      rax,rax
jz      exit

invoke  MessageBox,0 ,0, 0, 40h

exit:
invoke  ExitProcess, 0

proc DialogProc hwnddlg,msg,wparam,lparam
        push    rbx rsi rdi
        cmp     [msg],WM_COMMAND
        je      .wmcommand
        cmp     [msg],WM_INITDIALOG
        je      .wminit
        cmp     [msg],WM_CLOSE
        je      .wmclose
        xor     rax,rax
        jmp     .finish
  .wmcommand:
        cmp     [wparam],BN_CLICKED shl 16 + IDC_BTN2
        je      .wmclose
        cmp     [wparam],BN_CLICKED shl 16 + IDC_BTN1
        je      .message
  .wminit:
         jmp .processed
  .message:
        invoke  FindWindow, 0, 0
        invoke  MessageBox, rax, _message, _title, 40h
        ret
  .wmclose:
        invoke  EndDialog,[hwnddlg],0
  .processed:
        mov     rax,1
  .finish:
        pop     rdi rsi rbx
        ret
endp

section '.rsrc' resource data readable

directory RT_DIALOG,dialogs,\
          RT_ICON,icons,\
          RT_GROUP_ICON,group_icons

include "dialogs.tab"

include "dialogs.dat"

resource icons,\
         1,LANG_NEUTRAL,icon_data
resource group_icons,\
         114,LANG_NEUTRAL,main_icon
icon main_icon,icon_data,'gui.ico'


section '.idata' import data readable writeable

library kernel,'KERNEL32.DLL',\
          user,'USER32.DLL'

import kernel,\
         GetModuleHandle,'GetModuleHandleA',\
         ExitProcess,'ExitProcess'

import user,\
         DialogBoxParam,'DialogBoxParamA',\
         CheckRadioButton,'CheckRadioButton',\
         FindWindow, 'FindWindowA',\
         RegisterClass,'RegisterClassA',\
         GetDlgItemText,'GetDlgItemTextA',\
         IsDlgButtonChecked,'IsDlgButtonChecked',\
         LoadIcon, 'LoadIconA',\
         MessageBox,'MessageBoxA',\
         EndDialog,'EndDialog'
В dialogs.dat содержится сама форма программы

Последний раз редактировалось Berlioz; 22.06.2012 в 19:46.
Berlioz вне форума Ответить с цитированием
Старый 22.06.2012, 19:56   #8
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

только кнопка не работает?
Код:
proc DialogProc

        cmp     edx, WM_COMMAND
        je      .wmcommand
        cmp     edx, WM_INITDIALOG
        je      .wminit
        cmp     edx, WM_CLOSE
        je      .wmclose
        xor     rax,rax
        jmp     .finish
  .wmcommand:
        cmp     r8, BN_CLICKED shl 16 + IDC_BTN2
        je      .wmclose
        cmp     r8, BN_CLICKED shl 16 + IDC_BTN1
        je      .message
  .wminit:
         jmp .processed
  .message:
        invoke  FindWindow, 0, 0
        invoke  MessageBox, rax, _message, _title, 40h
        ret
  .wmclose:
        invoke  EndDialog, rcx, 0
  .processed:
        mov     rax,1
  .finish:

        ret
endp

Последний раз редактировалось f.hump; 23.06.2012 в 09:54.
f.hump вне форума Ответить с цитированием
Старый 23.06.2012, 07:25   #9
Berlioz
Изучающий C и ASM
Пользователь
 
Регистрация: 25.05.2012
Сообщений: 89
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
только кнопка не работает?
Не работает вообще ни один вызов из данной процедуры:

Программа не закрывается нажатием на "X", кнопки не работают, Alt+F4 тоже не работает
Berlioz вне форума Ответить с цитированием
Старый 23.06.2012, 09:53   #10
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

подкорректированную DialogProc пробовал? тот же результат?
f.hump вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запущенно ли приложение x64 N0iD Win Api 16 28.01.2012 13:22
простое GUI приложение NBAskel Visual C++ 0 22.01.2012 17:53
Как создать GUI приложение без дилоговых окон Shantri Visual C++ 2 29.10.2011 16:49
Win32 GUI приложение в Code::Blocks _-Re@l-_ Общие вопросы C/C++ 5 03.04.2011 09:55