close

Вход

Забыли?

вход по аккаунту

?

МЗЯпротокол(лаба6)

код для вставкиСкачать
Лабораторная работа №6
Вариант №7
ФИОКравченко С.В.ГруппаПрин-266ПреподавательКирносенко С.И.Срок сдачиОценка
Формулировка
Используя шаблон выполнить согласно варианту следующие преобразования с введенными пользователем данными - перевести число, введенное в десятичном формате в шестнадцатеричное.
Программный код
; windlg.asm
; Графическое win32-приложение, демонстрирующее работу с диалогом
;
; Компиляция MASM
; ml /c /coff /Cp windlg.asm
; rc /r windlg.rc
; link windlg.obj windlg.res /subsystem:windows
;
; Компиляция TASM
; tasm /m /ml /D_TASM_ windlg.asm
; brcc32 windlg.rc
; tlink32 /Tpe /aa /c /x windlg.obj,,,,,windlg.res
;
; Компиляция WASM
; wasm windlg.asm
; wrc /r /bt=nt windlg.rc
; wlink file windlg.obj res windlg.res form windows nt op c
; идентификаторы контролов (элементов диалога)n IDC_EDIT equ 0
IDC_BUTTON equ 1
IDC_EXIT equ 2
; идентификаторы элементов меню
IDM_TOSECONDS equ 10
IDM_CLEAR equ 11
IDM_EXIT equ 12
include def32.inc
include kernel32.inc
include user32.inc
.386
.model flat
.data
res dd 0
umn dd 10
DECIMAL_SIZE EQU 5
strdb8 dup(?),0
dialog_namedb"ZZZ_Dialog",0 ; имя диалога в ресурсах
.data?
bufferdb512 dup(?); буфер для введённого текста
.code
_start:
xorebx,ebx; в EBX будет 0 для команд push 0 (короче в 2 раза)
; определим идентификатор нашей программы
pushebx
callGetModuleHandle
; запустим диалог
pushebx; значение, которое перейдёт как параметр WM_INITDIALOG
pushoffset dialog_proc ; адрес процедуры типа DialogProc
pushebx; идентификатор окна-предка (0 - ничей диалог)
pushoffset dialog_name ; адрес имени диалога в ресурсах
pusheax; идентификатор программы, в ресурсах которой
; находится диалог (наш идентификатор в EAX)
callDialogBoxParam
; выход из программы
pushebx
callExitProcess
;
; процедура dialog_proc
; вызывается диалогом каждый раз, когда в нём что-нибудь происходит
; именно здесь будут происходить вся работа программы
;
; процедура не должна изменять регистры EBP,EDI,ESI и EBX !
;
dialog_procprocnear
; так как мы получаем параметры в стеке, построим стековый кадр
pushebp
movebp,esp
; процедура типа DialogProc вызывается со следующими параметрами
dp_hWnd equ dword ptr [ebp+08h]; идентификатор диалога
dp_uMsg equ dword ptr [ebp+0Ch]; номер сообщения
dp_wParam equ dword ptr [ebp+10h]; первый параметр
dp_lParam equ dword ptr [ebp+14h]; второй параметр
movecx,dp_hWnd; ECX будет хранить идентификатор диалога
moveax,dp_uMsg; а EAX - номер сообщения
cmpeax,WM_INITDIALOG; если мы получили WM_INITDIALOG
jnenot_initdialog
pushIDC_EDIT
pushdp_hWnd
callGetDlgItem; определим идентификатор
pusheax; окошка редактирования текста
callSetFocus; и передадим ему фокус
not_initdialog:
cmpeax,WM_CLOSE; если мы получили WM_CLOSE
jnenot_close
push0
pushecx
callEndDialog; закрыть диалог
not_close:
cmpeax,WM_COMMAND; если мы получили WM_COMMAND
jnenot_command
moveax,dp_wParam; EAX = wParam (номер сообщения)
cmpdp_lParam,0; если lparam ноль - сообщение от меню
jnelParam_not_0
cmpax,IDM_TOSECONDS; если это пункт меню Get Text
jnenot_gettext
push512; размер буфера
pushoffset buffer; адрес буфера
pushIDC_EDIT; номер конрола редактирования
pushecx
callGetDlgItemText; считаем текст в buffer
LEA EDI,str
mov cx,7
NEXTT:
MOV [EDI],'0'
inc edi
DEC CX
cmp CX,0
JNE NEXTT
LEAEDI, buffer
mov res,0
mov umn,10
cmp [Edi],'0'
JE ex
cmp [Edi],0
JE ex
Next12:
mov eax,res
mul umn
mov edx,eax
mov eax,0
mov al,[Edi]
sub al,'0'
add eax,edx
mov res,eax
add edi,1
cmp [Edi],0
JNE Next12
LEAEDI,str
add edi,7
mov [EDI],'0'
mov umn,16
mov eax,res
mov cx,0
Next1:
mov edx,0
div umn
add [edi],dl
cmp edx,10
JB nextNum
add [EDI],7
nextNum:
dec edi
inc cx
cmp eax,0
JNE Next1
ex:
pushMB_OK
pushoffset dialog_name
pushoffset str pushdp_hWnd
callMessageBox; и покажем его в MessageBox
not_gettext:
cmpeax,IDM_CLEAR; если это пункт меню Clear
jnenot_clear
push0; NULL
pushIDC_EDIT; номер контрола
pushecx
callSetDlgItemText; установим новый текст
not_clear:
cmpeax,IDM_EXIT; если это пункт меню Exit
jnenot_exit
push0; код возврата
pushecx; идентификатор диалога
callEndDialog; закрыть диалог
lParam_not_0:; lParam не ноль - сообщение от контрола
cmpeax,IDC_EXIT; если сообщение от кнопки Exit
jnenot_exit
shreax,16
cmpeax,BN_CLICKED; если её нажали
push0; код возврата
pushecx; идентификатор диалога
callEndDialog; закрыть диалог
not_exit:
xoreax,eax; после обработки команды
inceax; DialogProc должен возвращать TRUE (eax=1)
leave
ret16; конец процедуры
not_command:; сюда передаётся управление если мы получили
; какое-то незнакомое сообщение
xoreax,eax; код возврата FALSE (eax=0)
leave
ret16; конец процедуры
dialog_proc endp
end _start
Результат выполнения программы
Документ
Категория
Рефераты
Просмотров
20
Размер файла
70 Кб
Теги
мзяпротокол, лаба
1/--страниц
Пожаловаться на содержимое документа