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

    Двумерные массивы на Ассемблере. Ассемблер двумерными массивами примеры

     

     

    В данном уроке паказывается ввод элементов в двумерный массив. Приводится пример нахождение максимального элемента массива в ассемблере. И происходит вывод в MessageBox.

    Пример: Ввести двумерный массив размером 7 х 4. Найти наибольший элемент двумерного массива. Удалить строку с максимальным элементом.


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

    .686                 ; директива определения типа микропроцессора
    .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

    .data               ; директива определения данные 
    _c dd 28 
    sum dd 0 
    max dd 0 ; переменная для максимального числа

    frmt db "%d",0 
    buf db 30 dup(?) 
    stdout DWORD ? 
    stdin DWORD ? 
    cRead dd ? 
    temp dd ? 
    mas1 dd 28 dup(0) 
    nomer dd 0 
    st1 db "Vvesty masiv: " 
    st2 db "Вывод результата удаления", 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: 
    .IF(eax>max)     ; условие 
    mov max,eax 
    add esi,4                         ; расчет адреса нового числа 
    mov eax[esi] 
    loop m3    

    .ELSE   ; иначе 
    add esi,4                         ; расчет адреса нового числа 
    mov eax[esi] 
    loop m3                       ; перейти, если ecx не равен 0

    .ENDIF                           ; окончание директивы высокого уровня

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    mov ecx,_c 
    lea esi, mas1              ; загрузка адреса начала массива 
    mov eax [esi]     ; загрузка числа 
    m4:

    .IF(eax == max)                ;  условие 
    inc nomer 
    add esi,4                         ; расчет адреса нового числа 
    mov eax[esi] 
    jmp m5 
    loop m4

    .ELSE   ; иначе 
    inc nomer 
    add esi,4                         ; расчет адреса нового числа 
    mov eax[esi] 
    loop m4                       ; перейти, если ecx не равен 0

    .ENDIF                           ; окончание директивы высокого уровня

    m5: 
    .IF(nomer <= 7)                ;  условие 
    mov ecx,7 
    x1:         lea esi, mas1                ; загрузка адреса начала массива 
    mov eax [esi]      ; загрузка числа 
    mov eax,0 
    add esi,4 
    loop x1 
    mov nomer,1 
    jmp end_prog 
    .ENDIF               

    .IF(nomer <=14)               ;  условие 
    mov ecx,7 
    lea esi, mas1                ; загрузка адреса начала массива 
    xx:         add esi,4 
    loop xx 
    mov ecx,7 
    x2:         mov eax [esi]      ; загрузка числа 
    mov eax,0 
    add esi,4 
    loop x2 
    mov nomer,2 
    jmp end_prog 
    .ENDIF               

    .IF(nomer <=21)               ;  условие 
    mov ecx,7 
    lea esi, mas1                ; загрузка адреса начала массива 
    xx2:      add esi,4 
    loop xx2 
    mov ecx,7 
    xx3:      add esi,4 
    loop xx3 
    mov ecx,7 
    x3:         mov eax [esi]      ; загрузка числа 
    mov eax,0 
    add esi,4 
    loop x3 
    mov nomer,3 
    jmp end_prog 
    .ENDIF               

    .IF(nomer <=28)               ;  условие 
    mov ecx,7 
    lea esi, mas1                ; загрузка адреса начала массива 
    xxx2:    add esi,4 
    loop xxx2 
    mov ecx,7 
    xxx3:    add esi,4 
    loop xxx3 
    mov ecx,7 
    xxx4:    add esi,4 
    loop xxx4 
    mov ecx,7 
    x4:         mov eax [esi]      ; загрузка числа 
    mov eax,0 
    add esi,4 
    loop x4 
    mov nomer,4 
    jmp end_prog 
    .ENDIF               

    end_prog:

    mov ebx,nomer

    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