Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабораторная 2 Архитектура компютера.docx
Скачиваний:
11
Добавлен:
12.11.2019
Размер:
296.03 Кб
Скачать

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

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

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