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

Ассемблер работа с файлами. Запись в файл

Написать программу с записью данных в файл. Проанализировать 2 массива, которые состоят из 15 элементов каждый. Подсчитать количество элементов первого массива, которые имеют равные значения во втором массиве. Вывести соответствующие сообщения.

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

.386 ; директива определения типа микропроцессора .model flat, stdcall ; задание линейной модели памяти ; но соглашения ОС Windows option casemap:none ; отличие малых и больших букв include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib BSIZE equ 42 ; количество байтов, которые записываются в файл .data ; директива определения данные fName BYTE "лабораторная по файлам",0 fHandle DWORD ? ; резервирование у памяти 32-разрядной cWritten DWORD ? ; резервирование 32-разрядного амбарчика памяти ; с именем cWritten для адреса символов выведения st1 db 'Количество одинаковых чисел в массиве = ',0 st1_kol = $ - st1 st2 db 50 dup(0) stemp2 db 2 dup(0),0 ifmt db "%d ",0 masivA db 1,6,4,6,9,15,21,2,51,8,12,3,13 masivB db 1,5,4,43,13,4,65,9,7,21,32,23,15,51,66 temp db 15 prom db 0

.code ; директива начала сегмента-данных start: ; метка начала программы с именем start

mov eax,0 mov ebx,0

lea esi, masivA

M1: mov eax,0 mov al, byte ptr[esi] lea edi, masivB dec temp jz _end inc esi mov ecx,15 Temp1: mov bl, byte ptr[edi] inc edi cmp eax,ebx jz M3 M2: loop Temp1 jmp M1

M3: inc prom jmp M1

_end: lea edi, st2 lea esi, st1 mov ecx,st1_kol

_m1: mov al[esi] mov [edi],al inc esi inc edi loop _m1 mov eax,0 mov al,prom

invoke wsprintf \ ; АПИ-ФУНКЦИЯ преобразования числа ADDR stemp2 \ ; адрес буфф., куда будет записан помет. символов ADDR ifmt \ ; адрес строки преобразования формата eax ; регистр, содержание которого преобразовывается lea esi, stemp2 mov ecx,2 dec edi z1: mov al[esi] mov [edi],al inc edi inc esi loop z1

invoke CreateFile, ADDR fName ; адрес имени файла с символами GENERIC_WRITE,\ ; запись в файл 0, NULL ; параметры многозадачности CREATE_ALWAYS ; уничтожить и создать новый файл FILE_ATTRIBUTE_ARCHIVE, 0 mov fHandle, eax ; запоминание дескриптора устройства invoke WriteFile, fHandle ; дескриптор устройства ADDR st2 ; адрес области памяти, которая хранит символы BSIZE ; количество символов ADDR cWritten ; адрес памяти, где сохраняется число NULL ; записанных в файл символ_в invoke CloseHandle, fHandle ; дескриптор файла invoke ExitProcess, 0 ; возвращение управления ОС Windows end start ; директива окончания программы с именем start

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

API-подобные процедуры в языке Ассемблер. Процедуры в Assembler

Процедуры в языке Ассемблер работают также, как и в других языках программирования.

Пример: Написать программу на Ассемблере вычисления выражений: b/c + ас где а =5; b =27; c = 86; е =1986; d =1112; Результат вычисления выражения сохранить в памяти. Навести значение и порядок размещения данные в памяти.

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

.386 ; директива определения команд микропроцессора .model flat,stdcall ; задание линейной модели памяти ; но соглашения ОС Windows option casemap:none ; отличие строчных и прописных букв includelib\masm32\lib\kernel32.lib ExitProcess proto :DWORD ADDDD proto :WORD, :WORD, :WORD ; прототип процедуры .data ; директива определения данные res dw 2 dup(0) ; резервирование амбарчиков для результата .code ; директива начала кода программы start: ; метка начала программы с именем start invoke AddDD,5,86,1986 ; вызов директивы AddDD с параметрами invoke ExitProcess,0 ADDDD proc arg1:WORD,arg2:WORD,arg3:WORD mov eax,0 ; очистка регистров mov ebx,0 mov ecx,0 mov edx,0 mov ах,arg3 ; arg3 = 1986 div arg2 ; операция деления mov bx,ax mov cx,dx

mov ах,arg1 ; ах := arg1 mul arg2 ; ax* arg2 = 86 SHL edx,16 ; операция здвигу mov dx,ax add ebx,edx mov res,cx ; запоминание в памяти mov res+2,dx ; запоминание в памяти ret ; возвращение из процедуры AddDD endp ; окончание процедуры с именем AddDD end start ; окончание программы с именем start

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