У цьому уроці паказывается введення елементів в двовимірний масив. Наводиться приклад знаходження максимального елемента масиву в асемблері. І відбувається висновок у MessageBox.
Приклад: Ввести двовимірний масив розміром 7 х 4. Знайти найбільший елемент двомiрного масива. Видалити рядок з максимальним елементом.
Текст програми:
.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 text_com ; перейти, якщо 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 ; кінець програми
Результат роботи програми: