ИЗУЧЕНИЕ КОМПИЛЯТОРА 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; окончание программы