В данном уроке паказывается ввод элементов в двумерный массив. Приводится пример нахождение максимального элемента массива в ассемблере. И происходит вывод в 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 ; конец программы
Результат работы программы: