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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2023, 09:05   #41
groverx
Пользователь
 
Регистрация: 08.11.2023
Сообщений: 24
По умолчанию

R71MT, спасибо. А если ещё подскажешшь, какими регистрами можно пользоваться - век буду благодарен. API-функции ведь портят содержимое еbx, ecx,edx?
groverx вне форума Ответить с цитированием
Старый 09.12.2023, 09:10   #42
groverx
Пользователь
 
Регистрация: 08.11.2023
Сообщений: 24
По умолчанию

я просто учился программировать на 6502, с 64 кб памяти, а там, каждый байт на вес золота. Вот и привык все действия алгоритмизировать..
groverx вне форума Ответить с цитированием
Старый 09.12.2023, 09:42   #43
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от groverx Посмотреть сообщение
А если ещё подскажешшь, какими регистрами можно пользоваться - век буду благодарен.
Любыми, если по соглашению востановите изначальное значение.

Цитата:
Сообщение от groverx Посмотреть сообщение
API-функции ведь портят содержимое еbx, ecx,edx?
Какая ОС? Какая размерность? https://en.wikipedia.org/wiki/X86_ca...ing_convention

Цитата:
Сообщение от groverx Посмотреть сообщение
я просто учился программировать на 6502, с 64 кб памяти, а там, каждый байт на вес золота. Вот и привык все действия алгоритмизировать..
И?
p51x вне форума Ответить с цитированием
Старый 09.12.2023, 11:59   #44
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,555
По умолчанию

Цитата:
Сообщение от groverx Посмотреть сообщение
Вот и привык все действия алгоритмизировать..
Перевожу на нормальный язык: оптимизировать. Is n't ?
digitalis вне форума Ответить с цитированием
Старый 10.12.2023, 16:42   #45
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от groverx Посмотреть сообщение
API-функции ведь портят содержимое еbx, ecx,edx?
Так и пусть портят.. Ты можешь использовать любые регистры РОН.
Суть в том, что в большинстве случаях тебе не нужно сохранять какие-либо регистры перед вызовом api. Ты просто оперируешь ими под свою задачу, а далее.. если это 32-бит, то отправляешь регистры со-своими значениями в стек как аргументы api, а если софт под х64, то аргументы кладёшь в rcx/rdx/r8/r9.

Если-же говорить о вызове доп api внутри оконной процедуры WindowProc(), её 4-аргумента всегда будут лежать в стеке, к которым ты сможешь обратиться в любой момент. Таким образом сохранение регистров скорее исключение, чем правило.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 12.12.2023, 09:13   #46
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

groverx, вот тебе небольшая демка, которая создаёт "окно регистрации" с полем ввода пароля, и последующей его проверкой. Оригин пароль лежит в открытом виде, но это сейчас не важно.

Окно диалоговое, строится в секции-ресурсов, а создаётся функцией DialogBoxParam() вместо CreateWindowEx(). Как видно, здесь уже нет триады Get/Translate/DispatchMessage() - этим занимается сама система, которая по-сути и создаёт в фоне родительское окно чз CreateWindowEx(). Если юзер введёт валидный пароль, то из оконной процедуры "MyProc" (псевдоним WindowProc) вызывается пользовательская функция "GetMsgTime", чтобы сбоксить приветствие + время мессаги, полученное через GetMessageTime(). Кстати последняя возвращает время в миллисек с последнего запуска системы, а не дату/день/час.

Код:
; fasm-code
;-------------
format  pe gui
include 'win32ax.inc'
include 'encoding\win1251.inc'
;//---------------------------
.data
ID_BOX  =    102
pass    db  '123456789',0
okey    db  'Спасибо за регистрацию!',10
buff    rb   256
;//---------------------------
.code
start:  invoke  DialogBoxParam,0,69,0,MyProc,0  ; создаём окно
        invoke  ExitProcess,0

; Процедура обработки оконных сообщений (имеет 4 параметра из структуры MSG)
proc    MyProc, hndl, msg, wparam, lparam
        cmp     [msg],WM_COMMAND
        je      @cmd                ;<--- если кнопки Ок/Отмена
        cmp     [msg],WM_CLOSE
        je      @close              ;<--- если закрыли окно
        jmp     @next        ;<---------- игнор остальных сообщений!

; Смотрим какие кнопки юзаются
@cmd:   cmp     [wparam],BN_CLICKED shl 16 + IDCANCEL
        je      @close              ;<--- если да
        cmp     [wparam],BN_CLICKED shl 16 + IDOK
        jne     @next               ;<--- если нет

; Значит буттон "ОК" - читаем 10 символов из бокса в свой буфер
        invoke  GetDlgItemText,[hndl],ID_BOX,buff,10

; Проверить строки на валидность
        mov     esi,buff        ; источник
        mov     edi,pass        ; приёмник
        mov     ecx,10          ; длина строки
        repe    cmpsb           ; сравнить по-байтно..
        jcxz    @ok             ; ок, если ECX=0 (совпало по всей длине)

        invoke  MessageBox,0,<'Пароль неверный!',0>,<'Тест',0>,0
        jmp     @close          ; иначе: облом и на выход

@ok:    call    GetMsgTime      ; good - зовём свою функцию

@close: invoke  EndDialog,[hndl],-1  ; прихлопнуть окно
@next:  xor     eax,eax              ; коллбэк системе
        ret                          ; ^^^^^
endp                 ;<--------------- конец оконной процедуры
;-----------
GetMsgTime:
        invoke  GetMessageTime
       cinvoke  wsprintf,buff,<'Время сообщения: %u мс.',0>,eax
        invoke  MessageBox,0,okey,<'Тест',0>,0
        ret

.end start           ;<--------------- конец секции-кода ---------------

;//----------
; секция ресурсов с описанием окна
section '.rsrc' data resource readable
directory  RT_DIALOG,dialogs

resource dialogs,69,LANG_ENGLISH+SUBLANG_DEFAULT,rsrc_dialog
dialog rsrc_dialog,'Окно регистрации',70,70,190,60,WS_CAPTION+WS_SYSMENU,,,'Segoe UI',8

dialogitem 'STATIC','Введите код:',-1,10,10,190,8,WS_VISIBLE
dialogitem 'EDIT','',ID_BOX,10,20,170,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP

dialogitem 'BUTTON','ОК',IDOK,85,40,45,15,WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON
dialogitem 'BUTTON','Отмена',IDCANCEL,135,40,45,15,WS_VISIBLE+BS_PUSHBUTTON
enddialog
Теперь возьми fasm, распакуй архив в любою свою папку, запусти fasmw.exe, скопируй этот код в его окно, и нажми [F9] - результ должен быть примерно таким. Далее можешь добавлять в этот шаблон любые свои обработчики типа:

Код:
cmp  [msg],WM_ххх
je   @xxx
pw.png
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 12.12.2023, 16:55   #47
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Один единственный вопрос - зачем городить все это на ассемблере?
Не, я понимаю, если надо оптимизировать внутренний цикл и т.д. но чем "invoke MessageBox,0,<'Пароль неверный!',0>,<'Тест',0>,0" лучше "MessageBox(0, "Пароль неверный!", "Тест", 0)"...
waleri вне форума Ответить с цитированием
Старый 12.12.2023, 17:38   #48
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
лучше
чем? это те-же яйки, только вид сбоку.
просто тс хочет попрактиковаться в ассме, вот ему и пример.
а так да.. для больших проектов асм не оправдывает себя, хотя и собирает компактный код без всякой шелухи.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 12.12.2023, 18:41   #49
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

так ТС не признает ваших invoke, макросов и т.д.
p51x вне форума Ответить с цитированием
Старый 12.12.2023, 18:54   #50
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

мда... что-же теперь делать?
вот это проблема века.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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