Поиск максимального элемента в каждой строке матрицы (asm x86)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 19:39, 9 августа 2015.

Пример: Задана матрица 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

Результат программы представлен на рисунке 1.

Рис. 1.Результат программы