Рекомендации по оформлению отчета




ИЗУЧЕНИЕ КОМПИЛЯТОРА MASM32

 

 

Методические рекомендации по выполнению лабораторной работы по МДК.01.01 Системное программирование для студентов 2 курса

 

 

Составитель: Токаева Я.Ю.,

преподаватель колледжа

 

 

Изучение компилятора MASM32. Методические рекомендации по выполнению лабораторной работы по МДК.01.01 Системное программирование для студентов 2 курса /Составитель: Токаева Я.Ю./ ‒ Череповец: Череповецкий металлургический колледж имени академика И.П. Бардина, 2019. – 23 с.

 

Рецензенты:

 

 

Данная методическая разработка рассмотрена на заседании цикловой комиссии «Информационные технологии и вычислительная техника» и рекомендована к применению.

Председатель: /Молоткова Л.Н./

__________________2019 г.

Протокол №___

 


 

Содержание

 

 

  Цель работы  
  Средства обучение  
  Теоретическое обоснование  
  Задание  
  Ход работы  
  Рекомендации по оформлению отчета  
  Контрольные вопросы  
  Литература  
  Приложение А – Варианты заданий  

 

 


 

Лабораторная работа № 9 «Изучение компилятора MASM32»

 

1 Цель работы: закрепление на практике основных принципов работы с компилятором MASM32.

 

2 Средства обучения:

· ПЭВМ;

· методические рекомендации;

· MASM32.

 

Теоретическое обоснование

Когда исходный текст набран и сохранен, его можно компилировать.

За процесс получения готовой программы отвечает компилятор, и состоит этот процесс из двух основных этапов.

1) Исходный текст преобразуется в промежуточный файл. Это делает транслятор (в случае с MASM'ом он называется ml.exe).

2) Затем создается готовый исполняемый модуль в определенном формате. То есть программа. Это делает линковщик (в случае с MASM'ом он называется link.exe).

Значит, для того чтобы делать программы, нужно иметь текстовый редактор и компилятор, который состоит из двух основных частей - транслятор и линковщик.

MASM32 вовсе не компилятор, а сборник для программирования под Win32, в который входит 32-битный компилятор MASM.

Основных файлов всего два:

· ml.exe – транслятор. Он преобразует исходный текст в obj-файл (объектного формата COFF или OMF),

· link.exe – линковщик. Создает готовый исполняемый exe или dll модуль (в формате для DOS, Windows...).

Эти файлы включены в основной состав MS Visual Studio (и в.NET).

Каждая программа загружается в собственное изолированное виртуальное адресное пространство, или виртуальное пространство процесса (ВПП).

Адреса в таком ВПП могут быть от 00000000 до FFFFFFFF (4Gb), будем называть их виртуальными.

При загрузке и далее при выполнении в эту виртуальность проецируется все необходимое для работы программы (код и данные операционной системы, динамические части самой программы, файлы и т.п.).

Программа, кроме собственных вычислений, практически ничего самостоятельно сделать не может. Ей приходится просить ОС вывести что-либо или предоставить в ее ВПП. Для этого она вызывает нужные API-функции.

Файлы с машинным кодом и данными у Win32-программ устроены в соответствии с PE-форматом, который довольно сильно связан с особенностями защищенного режима процессора.

Исполняемые файлы PE-формата делятся на секции. Должна быть минимум одна секция (секция кода), но файл может иметь и другие секции для разных целей (данные, ресурсы, служебные секции и т.д.).

В защищенном режиме существуют 4 уровня привилегий. Нулевой самый сильный, 3-й самый слабый. Эти уровни называют кольцами (ring0,1,2,3).

Win32 использует только ring0 для ядра и драйверов и ring3 для прикладных программ.

Рассмотрим пример.

prax05.asm:

.386

.model flat, stdcall

option casemap:none; case sensitive

;#############################################################

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

;#############################################################

.data

MsgBoxCaption db "It's the first your program for Win32",0

MsgBoxText db "Assembler language for Windows is a fable!",0

;#############################################################

.code

start:

invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK

invoke ExitProcess, NULL

end start

 

Задание

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

 

5 Ход работы:

· изучить теоретическое обоснование работы;

· выполнить задание согласно варианту (приложение А);

· ответить на контрольные вопросы;

· сделать выводы по проделанной работе;

· оформить отчет.

 

Рекомендации по оформлению отчета

Лабораторная работа оформляется в соответствии с ГОСТ 2.105-95 и требованиями, принятыми в колледже. Отчет по лабораторной работе должен содержать:

· вид работы;

· название работы;

· цель работы;

· средства обучения;

· ход работы;

· ответы на контрольные вопросы;

· выводы по проделанной работе.

 

7 Контрольные вопросы

1. Сколько основных файлов в MASM32?

2. Из каких этапов состоит процесс компиляции?

3. Для чего служит транслятор?


 

Литература

 

1 Зубков С.В. Assembler. Для DOS, Windows и Unix. 12-е изд. – М.: ДМК, 2016. – 514 с.

2 Углев С.Л. 20 уроков Accembler. – М.: SelfPub, 2018. – 80 с.

3 Фельдман С.К. Системное программирование. Полный курс лекций. – М.: Бук Пресс, 2016. – 514 с.

 

 


 

ПРИЛОЖЕНИЕ А

Варианты заданий

 

Вариант 1

В компиляторе Masm32 осуществить тестирование следующей программы: рассчитать формулу в языке Ассемблер. Формула имеет вид:

D = 4*Pi*Ha*Fi*D0/L.

; D = 4 * Pi * Ha * Fi * D0 / L

.386; Директива определения типа микропроцессора

. Model flat, stdcall; задачи линейной модели памяти

; И соглашения ОС Windows

option casemap: none; отличие малых и больших букв

include \masm32\include\windows.inc

include \masm32\include\kernel32.inc

include \masm32\include\fpu.inc

include \masm32\include\user32.inc

includelib \masm32\lib\user32.lib

includelib \masm32\lib\kernel32.lib

includelib \masm32\lib\fpu.lib

BSIZE equ 30

. Data; директива определения данных

D0 dword 200;сохранение в 32-разрядной ячейке памяти переменной х

L dword 1; резервирования 32-х разрядов памяти для переменной y

Ha dd 3,4,5

Fi dd 1,2,3

const dd 4

st1 db "Результат вычисления:", 0

st2 db 10 dup (?), 0

. Code; директива начала кода

_start:

lea esi, Ha

lea edi, Fi

mov ebx, 3

m1:

mov ecx, 3

lea edi, Fi

m2:

finit

fldpi; заносим значения Пи

fimul const; Pi * 4

fild dword ptr [esi]

fmul; умножаем результат на На

fild dword ptr [edi]; заносим результат Фи

fmul; умножаем результат на Фи

fild D0; заносим значение D0

fmul; умножаем результат на D0

fild L; заносим значение лянда

fdiv; делим результат на лянда

pushad; сохраняем все регистры общего назначения в стек

invoke FpuFLtoA, 0, 10, ADDR st2, SRC1_FPU or SRC2_DIMM

invoke MessageBox, NULL, addr st2, addr st1, MB_OK

popad; считываем из стека

add edi, 4;следующий элемент в массиве

loop m2

add esi, 4; следующий элемент в массиве

dec ebx

jnz m1; переходить на метку m1 пока ebx не станет равна 0

invoke ExitProcess, NULL; возврат управления Windows

; и освобождения ресурсов

end _start;директива окончания программы с именем start

 

 

Вариант 2

В компиляторе Masm32 осуществить тестирование следующей программы: ввести 2 дробных числа и сложить их и вывести на консоль и в MessageBox.

.686; Директива определения типа микропроцессора

. Model flat, stdcall; задачи линейной модели памяти

; И соглашения ОС Windows

option casemap: none; отличие малых и больших букв

include \masm32\include\windows.inc

include \masm32\include\kernel32.inc

include \masm32\include\fpu.inc

include \masm32\include\msvcrt.inc

include \masm32\include\user32.inc

includelib \masm32\lib\user32.lib

includelib \masm32\lib\kernel32.lib

includelib \masm32\lib\msvcrt.lib

includelib \masm32\lib\fpu.lib

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;директива определения данных

frmt db "% d",0

buf db 30 dup (0)

buf2 db 20 dup (0)

stdout DWORD?

stdin DWORD?

const dd 10

temp1 dd 0.0

temp2 dd 0.5

temp3 dd 0.5

temp4 dd 0.5

identif1 dd 1

identif2 dd 1

st1 db "Vvedyte a",0

st2 db "Vvedyte b",0

st3 db "Результат вычисления a + b",

st4 db "a + b ="

. Code; директива начала кода

_start:

invoke GetStdHandle,STD_OUTPUT_HANDLE

mov stdout,eax

invoke GetStdHandle,STD_INPUT_HANDLE

mov stdin,eax

invoke WriteConsoleA, stdout, ADDR st1, 11, NULL,NULL; VIVOD ST1

invoke ReadConsole, stdin, ADDR buf, 20, ADDR cRead,ULL; чтения числа как символ

invoke crt_atoi, ADDR buf; преобразовать символ в число

mov temp1, eax

lea edi, buf

mov ecx, 30

m1:

mov al, '.'

mov bl, [edi]

xor al, bl

jz m2

inc edi

loop m1

m2:

lea esi, buf2

mov ecx, 20

m3:

inc edi

mov ebx, [edi]

mov [esi], ebx

inc esi

loop m3

invoke crt_atoi, ADDR buf2;преобразовать символ в число

mov temp2, eax

id1:

mov eax, identif1

mov ebx, const

mul ebx

SHL edx, 16; делаем сдвиг на 16

mov dx, ax

mov identif1, edx

mov ecx, temp2

sub ecx, edx

jc id_end1

jmp id1

id_end1:

invoke GetStdHandle, STD_OUTPUT_HANDLE

mov stdout, eax

invoke GetStdHandle, STD_INPUT_HANDLE

mov stdin, eax

invoke WriteConsoleA, stdout, ADDR st2, 11, NULL, NULL; VIVOD ST1

invoke ReadConsole, stdin, ADDR buf, 20, ADDR cRead, NULL; чтения числа как символ

invoke crt_atoi, ADDR buf; преобразовать символ в число

mov temp3, eax

lea edi, buf

mov ecx, 30

m4:

mov al, '.'

mov bl, [edi]

xor al, bl

jz m5

inc edi

loop m4

m5:

lea esi, buf2

mov ecx, 20

m6:

inc edi

mov ebx, [edi]

mov [esi], ebx

inc esi

loop m6

invoke crt_atoi, ADDR buf2; преобразовать символ в число

mov temp4, eax

id2:

mov eax, identif2

mov ebx, const

mul ebx

SHL edx, 16;делаем сдвиг на 16

mov dx, ax

mov identif2, edx

mov ecx, temp4

sub ecx, edx

jc id_end2

jmp id2

id_end2:

finit

fild temp1

fiadd temp3

fild temp2

fidiv identif1

fadd st (0), st (1)

fild temp4

fidiv identif2

fadd st (0), st (1)

invoke FpuFLtoA, 0, 10, ADDR st4, SRC1_FPU or SRC2_DIMM

invoke MessageBox, NULL, addr st4, addr st3, MB_OK

invoke ExitProcess, NULL;возврат управления Windows

; И освобождения ресурсов

end _start; директива окончания программы с именем start

Вариант 3

В компиляторе Masm32 осуществить тестирование следующей программы: задан массив А из N=4 элементов. Определить сумму элементов массива А, для которых биты 0 и 5 совпадают.

.686; Директива определения типа микропроцессора

. Model flat, stdcall; задачи линейной модели памяти

; И соглашения ОС Windows

option casemap: none; отличие малых и больших букв

include \masm32\include\windows.inc

include \masm32\include\kernel32.inc

include \masm32\include\fpu.inc

include \masm32\include\user32.inc

includelib \masm32\lib\user32.lib

includelib \masm32\lib\kernel32.lib

includelib \masm32\lib\fpu.lib

ExitProcess proto: DWORD

. Data; директива определения данных

st1 db "Вывод суммы массива! А", 0

st2 db 10 dup (?), 0

ifmt db "Сумма =% d", 0

masivA db 75,31,88,32

sum dw 0

iden db 0

work1 db 0

work2 db 0

prom dd 0

. Code; директива начала кода

_start:

mov eax, 0

mov ebx, 0

mov ecx, 3

mov edx, 0

lea esi, masivA

M1:

mov prom, ebx

mov al, byte ptr [esi + ebx]; пересылки значения массива в младший регистр al

inc ebx

mov bl, byte ptr [esi + ebx]; пересылки значения массива в младший регистр bl

mov work1, al

mov work2, bl

and eax, 21h

and ebx, 21h

sub eax, ebx проверка сходимости битов

jz M3

mov iden, 0;идентификатор. Он необходим для суммы.

M2:

mov ebx, prom

inc ebx

loop M1

jmp M4

M3:

mov al, work1

dec iden

jz Q1; если идентификатов = 0, тогда перейти на метку Q1

mov iden, 1

mov bl, work2

Q1: add sum, ax; подсчета суммы

add sum, bx; подсчета суммы

jmp M2

M4:

mov ebx, 0

mov bx, sum; пересылка значение суммы в регистр

invoke wsprintf, \

ADDR st2, \

ADDR ifmt, \

ebx

invoke MessageBox, \; функция вывода значения

NULL, \

addr st2, \

addr st1 \

MB_OK

invoke ExitProcess, 0

end _start; окончание программы

 

 

Вариант 4

В компиляторе Masm32 осуществить тестирование следующей программы: задан текст из 30 символов. Сжать текст, оставив между словами по одному пропуску.

.386; Директива определения типа микропроцессора

. Model flat, stdcall; задачи линейной модели памяти

; И соглашения ОС Windows

option casemap: none; отличие малых и больших букв

include \masm32\include\windows.inc

include \masm32\include\kernel32.inc

include \masm32\include\fpu.inc

include \masm32\include\user32.inc

includelib \masm32\lib\user32.lib

includelib \masm32\lib\kernel32.lib

includelib \masm32\lib\fpu.lib

ExitProcess proto: DWORD

BSIZE equ 30

. Data; директива определения данных

_a dword 3.0; сохранение в 32-разрядной ячейке памяти переменной х

_prob dword 0

_sum dd 0

mas1 db 'Privet kak dela u tebya'

mas2 db 30 dup (0), 0

st1 db "Вывод количества пробелов", 0

st2 db 10 dup (?), 0

ifmt db "Количество лишних пробелов в тексте =% d", 0

. Code;директива начала кода

_start:

lea edi, mas1

lea esi, mas2

mov ecx, 30; счетчик

mov edx, 1

mov ebx, 0

m1:

mov eax, 0

mov al, ''

mov bl, [edi]

xor al, bl; проверка равенство сроки пробел

jz m2

mov _sum, 0; сумма пробелов равна нулю

_m1: mov edx, 1

mov ax, [edi];Копирование сроки в сроке без лишних

mov [esi], ax; пробелов

inc esi

_m2:

cld

inc edi

loop m1; уменьшения счетчик

jmp m3; безусловный переход на выводок

m2:

inc _sum; инкрементирование

sub edx, _sum; проверка: это первый пробел или нет

jz _m1

mov edx, 1

inc _prob;подсчитывание лишних пробелов

jmp _m2

m3:

mov edx,0

mov edx,_prob

mov ecx,30

lea edi,mas1

mov eax,0

m4:

mov [edi],ax

inc edi

loop m4

lea edi,mas1

lea esi,mas2

mov ecx,30

m5:

mov ax,[Edi]; копирование второй строки в первую

mov [esi],x

inc esi

inc edi

cld

loop m5

invoke wsprintf, \

ADDR st2, \

ADDR ifmt, \

edx

invoke MessageBox, \

NULL, \

addr st2, \

addr st1 \

MB_OK

invoke ExitProcess, 0

end _start; окончание программы

Вариант 5

В компиляторе Masm32 осуществить тестирование следующей программы: задан массивы А и В по N=30 элементов. Привести алгоритм и программу формирования массива С по правилу: если в элементов Аi и Вi биты 4 и 9 совпадают, то Сi = Аi + Вi. Вывести соответствующие сообщения.

.686; Директива определения типа микропроцессора

. Model flat, stdcall;задачи линейной модели памяти

; И соглашения ОС Windows

option casemap: none; отличие малых и больших букв

include \masm32\include\windows.inc

include \masm32\include\kernel32.inc

include \masm32\include\fpu.inc

include \masm32\include\user32.inc

includelib \masm32\lib\user32.lib

includelib \masm32\lib\kernel32.lib

includelib \masm32\lib\fpu.lib

ExitProcess proto: DWORD

. Data; директива определения данных

st1 db "Вывод", 0

st2 db 10 dup (?), 0

ifmd db "Размер массива =% d. Количество одинаковых битов 4 и 9 =% d", 0

masivA dw 591,34,34,45,2,6,2, -6,1,9,8,6,4,5,45,12,12,31,46,84,54, -54, -25, 88,70,37, -1,0,0,5,0

masivB dw 963,2,7,43,13, -7,65,9,5,100,126,145,123,2,32, -48,84,256,987,20, -54, -12, -200,4,0,0,9,8,215,54

masivC dw 30 dup (0)

work1 dw 0

work2 dw 0

sum dd 0

. Code; директива начала кода

_start:

mov eax, 0

mov ebx, 0

mov ecx, 30

mov edx, 0

lea esi, masivA

lea edi, masivB

lea edx, masivC

M1:

mov ax, [esi]

mov bx, [edi]

inc esi

inc esi

inc edi

inc edi

mov work1, ax; сохранение значений

mov work2, bx; сохранение значений

and eax, 210h; маска для проверки

and ebx, 210h;маска для проверки

. IF (eax == ebx; условие

jmp M3

. ENDIF

M2:

loop M1

jmp M4

M3:

inc sum

mov ax,work1

mov bx,work2

add ax,bx

mov [edx],ax; пересылка сумма в массив С

inc edx

inc edx

jmp M2

M4:

mov ecx,30

mov ebx,sum

invoke wsprintf,\

ADDR st2,\

ADDR ifmd,\

ecx,bx

invoke MessageBox, \

NULL, \

addr st2, \

addr st1 \

MB_OK

invoke ExitProcess, 0

end _start; окончание программы

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-06-05 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: