Model flat,stdcall
option casemap: none; отличие строчных и прописных букв PUBLIC Mas_sum ; константы ; сообщения, приходящие при открытии ; динамической библиотеки DLL_PROCESS_DETACH equ 0 DLL_PROCESS_ATTACH equ 1 DLL_THREAD_ATTACH equ 2 DLL_THREAD_DETACH equ 3 Includelib kernel32.lib Includelib user32.lib ExitProcess proto: DWORD Mas_sum proto: DWORD,: DWORD,: DWORD; прототип процедуры Code DLLENTRY: Mas_sum proc EXPORT arg1: DWORD, arg2: DWORD, masiv: DWORD Mov ebx, 0 Mov eax, masiv Cmp eax, arg1 Jnc m1 Jmp _end m1: Cmp eax, arg2 Jc m2 Jmp _end m2: Inc ebx _end: Ret; возвращение управления ОС Mas_sum endp; окончание процедуры с именем Mas_sum ; окончание программы с именем start End DLLENTRY; директива окончания программы с именем DLLENTRY Файл 1111dll.asm
Model flat, stdcall option casemap: none; отличие строчных и прописных букв Include windows.inc Include kernel32.inc Include fpu.inc Include user32.inc Include msvcrt.inc Includelib user32.lib Includelib kernel32.lib Includelib msvcrt.lib Includelib fpu.lib Includelib 1111.lib ExitProcess proto: DWORD Mas_sum proto: DWORD,: DWORD,: DWORD; прототип процедуры Data; директива определения данные _c dd 40 Sum dd 0 Op1 dd 6; запись в 32-разрядную память op1 Op2 dd 22; минимальных предел frmt db " %d", 0 buf db 30 dup(?) stdout DWORD? stdin DWORD? cRead dd? temp dd? Mas1 dd 40 dup(0) st1 db " Vvesty masiv: " st2 db " Вывод количества элементов в пределах (6, 22) массива! ", 0 St3 db 10 dup(0) ifmt db " количество = %d", 0 Code; директива начала кода программы _start: Lea esi, mas1; загрузка адреса начала массива Mov ecx, _c m1: Mov ebx, ecx Invoke GetStdHandle, STD_OUTPUT_HANDLE Mov stdout, eax Invoke GetStdHandle, STD_INPUT_HANDLE Mov stdin, eax Invoke WriteConsoleA, stdout, ADDR st1, 14, NULL, NULL; VIVOD ST1 invoke ReadConsole, stdin, ADDR buf, 20, \ ADDR cRead, NULL; чтения числа как символ Invoke crt_atoi, ADDR buf; преобразовать символ в число mov [esi], eax Add esi, 4 Mov ecx, ebx Loop m1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mov ecx, _c Lea esi, mas1; загрузка адреса начала массива mov eax, [esi]; загрузка числа m3: Invoke Mas_sum, op1, op2, eax Add sum, ebx Add esi, 4; расчет адреса нового числа mov eax, [esi] Loop m3 Mov ebx, sum invoke wsprintf, \ ADDR st3, \ ADDR ifmt, \ Ebx invoke MessageBox, \ NULL, \ addr st3, \ addr st2, \ MB_OK Invoke ExitProcess, 0 Ret
|