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

    Ассемблер структуры. Примеры задач

     

     

    Пример: Задана матрица 3 X 4. Определить максимальный элемент каждой строки. Результат выполнения программы вывести в окно консоли.

    Текст программы:

    .386                ; директива определения типа микропроцессора
    .model  flat, stdcall         ; задание линейной модели памяти 
    option casemap:none            ; отличие малых и больших букв 
    include    \masm32\include\windows.inc 
    include    \masm32\include\user32.inc 
    include    \masm32\include\kernel32.inc 
    includelib \masm32\lib\user32.lib 
    includelib \masm32\lib\kernel32.lib
    ExitProcess   proto: dword     ; прототип API-функции

    DATE1 STRUCT           ; тип данных СТРУКТУРА с именем DATE1 
    elem1 db ?      ; имя первого поля структуры 
    elem2 db ?      ; имя второго поля структуры 
    elem3 db ?      ; имя третьего поля структуры 
    elem4 db ?      ; имя четвертого поля структуры 
    DATE1 ENDS 
    .data              ; директива определения данные 
    max db 0 
    nomer db 1 
    str1 DATE1 <20,9,2,15>               ; структура с именем str1 
    str2 DATE1 <6,31,1,3>                 ; структура с именем str2 
    str3 DATE1 <4,6,155,2>               ; структура с именем str2 
    st1 db " Вывод максимальных чисел ",0 
    st2 db 180 dup(?),0 
    stemp db 0 
    stemp2 db 3 dup(?),0 
    st4 db "                        Нажмите Ок",0 
    st3 db "-й ряд имеет максимальное число = " 
    kol3 = $ - st3 
    kol4 = $ - st4 
    ifmt db "%d ",0 
    .code   ; директива начала сегмента-данных 
    start:               ; метка начала программы с именем start 
    xor edx,edx              ; заполнение нулями 
    mov ebx,3                ; загрузка количества строк 
    lea esi, str1      ; загрузка адреса первой строки структуры 
    lea edi,st2 
    m1: mov ecx,4                          ; количество элементов в строке 
    mov max,0 
    m2: mov al[esi]          ; загрузка элемента из строки структуры 
    .IF (al > max) 
    mov max,al 
    .ENDIF 
    jmp m4                        ; безусловный переход, если наоборот 
    m3: add edx,eax  ; добавление негативных элементов строки структуры 
    m4: inc esi                  ; подготовка адреса нового элемента 
    loop m2                   ; есх := ecx – 1 и переход на m3, если не нуль

    mov eax,0 
    mov al,nomer 
    invoke  wsprintf \         ; API-ФУНКЦИЯ превращения числа 
    ADDR stemp \  ; адрес буфф., куда будет записан помет. символов 
    ADDR ifmt \          ; адрес строки превращения формата 
    eax               ; регистр, содержание которого превращается 
    mov al,stemp 
    mov [edi],al 
    inc edi

    lea esi, st3 
    mov ecx,kol3

    _m1: 
    mov al[esi] 
    mov [edi],al 
    inc esi 
    inc edi 
    loop _m1 
    mov eax,0 
    mov al,max 

    invoke  wsprintf \            ; API-ФУНКЦИЯ превращения числа 
    ADDR stemp2 \  ; адрес буфф., куда будет записан помет. символов 
    ADDR ifmt \               ; адрес строки превращения формата 
    eax                 ; регистр, содержание которого превращается 
    lea esi, stemp2 
    mov ecx,3 
    z1: 
    mov al[esi] 
    mov [edi],al 
    inc edi 
    inc esi 
    loop z1

    mov al,10 
    mov [edi],al 
    inc edi 
    inc nomer

    dec ebx           ; ebx := ebx – 1 
    .IF ebx == 2 
    lea esi,str2                         ; загрузка адреса новой строки 
    jmp m1           ; переход на новый цикл 
    .ELSEIF ebx == 1 
    lea esi,str3                         ; загрузка адреса новой строки 
    jmp m1           ; переход на новый цикл 
    .ENDIF

    mov al,10 
    mov [edi],al 
    inc edi 
    lea esi, st4 
    mov ecx,kol4 
    inc esi 
    _z1: 
    mov al[esi] 
    mov [edi],al 
    inc esi 
    inc edi 
    loop _z1

    invoke MessageBox \        ; API-ФУНКЦИЯ выведения окна консоли 
    NULL \                        ; hwnd – идентификатор окна 
    addr st2 \          ; адрес строки, который содержит  текст сообщения 
    addr st1 \ ; адрес строки, который содержит  заглавие сообщения 
    MB_OK                ; вид диалогового окна

    invoke ExitProcess, 0        ; возвращение управления ОС Windows 
    end start                 ; директива окончания программы с именем start


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


    uCozCopyright MyCorp © 2025