Пятница, 2025-06-20, 3:23 PM
Приветствую Вас Гость | RSS
Главная | DII на Ассемблере | Регистрация | Вход
Меню сайта
Вход на сайт
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Программирование

    Dll на ассемблере. Динамические библиотеки (Dll-файли)

     

     

    Пример: Написать программу на ассемблер. Задан массив А из N = 40 элементов. Навести алгоритм и программу определения количества элементов массива А, которые удовлетворяют условию  L >= Ai>= M, где  L = 6 и M = 22.


    Текст программы 
    файл 1.asm


    .386
    .model  flat,stdcall 
    option casemap:none  ; отличие строчных и прописных букв

    includelib\masm32\lib\kernel32.lib

    ExitProcess proto :DWORD 
    Mas_sum proto :DWORD, :DWORD, :DWORD ; прототип процедуры 
    .code 
    Mas_sum proc 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 
    end         ; окончание программы с именем start

    end start                       ; директива окончания программы с именем start

    Файл 1dll.asm


    .386
    .model  flat,stdcall 
    option casemap:none  ; отличие строчных и прописных букв 
    include \masm32\include\windows.inc 
    include \masm32\include\kernel32.inc 
    include \masm32\include\fpu.inc 
    include \masm32\include\user32.inc 
    include \masm32\include\msvcrt.inc

    includelib \masm32\lib\user32.lib 
    includelib \masm32\lib\kernel32.lib 
    includelib \masm32\lib\msvcrt.lib 
    includelib \masm32\lib\fpu.lib

    includelib 1.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 
    end _start             ; конец программы

    Результат работы программы:

    uCozCopyright MyCorp © 2025