Макрогенераторы и макросы

3.1 Цель работы

Изучить технику сотворения и внедрения макросов. Научиться следить за плодами работы макрогенератора, встроенного в ml.exe.

3.2 Выполнение программки

3.2.1 Макроопределение и макрорасширение

Макрогенератор выдал ошибку «error A2044: invalid character in file», так как нет поддержки кириллицы. Соответственная ошибка была выведена и в консоль и в файл m1.lst.

Таблица 3.1 – Сопоставление файлов m1.asm и Макрогенераторы и макросы m1.lst

m1.asm m1.lst
.486 .MODEL flat, stdcall ;точка1 – место макроопределений mdef MACRO ; Просто текст mov eax, edx ; рядовая команда ; с обыденным комментарием ;; Сокрытый комментарий push edx ;; обыденные pop esi ;; команды endm .data ; точка2 - секция данных .code ; точка3 - секция кода mdef end .486 .MODEL flat, stdcall ; точка1 - место Макрогенераторы и макросы макроопределений .data ; точка2 - секция данных .code ; точка3 - секция кода ; Просто текст mov eax, edx ; рядовая команда ; с обыденным комментарием push edx pop esi end

При макрорасширении обыденные комменты остались на прежних местах, сокрытые комменты были удалены. Также макрос был удален с места собственного определения. Тело макроса поменяло его вызов в Макрогенераторы и макросы файле m1.asm.

3.3.2 Повторение строк Repeat

В таблице 3.2 приводится содержимое файлов m2.asm и m2.lst.

Таблица 3.2 – Сопоставление файлов m2.asm и m2.lst

m2.asm m2.lst
.486 .MODEL flat, stdcall ; точка1 - место макроопределений .data ; точка2 - секция данных A = 1 Massiv Label Word Repeat 10 Dw A*A A = A + 1 Endm .code Макрогенераторы и макросы ; точка3 - секция кода end .486 .MODEL flat, stdcall ; точка1 - место макроопределений .data ; точка2 - секция данных A = 1 Massiv Label Word Dw A*A A = A + 1 Dw A*A A = A + 1 Dw A*A A = A + 1 Dw A*A A = A + 1 Dw A*A A = A + 1 Dw A*A A = A Макрогенераторы и макросы + 1 Dw A*A A = A + 1 Dw A*A A = A + 1 Dw A*A A = A + 1 Dw A*A A = A + 1 .code ; точка3 - секция кода end

При макрорасширении команда Repeat была заменена десятком повторений тела команды

3.2.3 Цикл For

В таблице 3.2 приводится содержимое файлов m3.asm и m3.lst.

Таблица 3.2 – Сопоставление файлов m Макрогенераторы и макросы3.asm и m3.lst

m3.asm m3.lst
.486 .MODEL flat, stdcall ; точка1 - место макроопределений .data ; точка2 - секция данных massiv label word for y, dw y endm .code ; точка3 - секция кода For x, mov eax, x endm end .486 .MODEL flat, stdcall ; точка1 - место макроопределений .data ; точка2 - секция данных massiv label word Макрогенераторы и макросы dw 1 dw 4 dw 9 dw 16 dw 25 .code ; точка3 - секция кода mov eax, 1 mov eax, 3 mov eax, 5 mov eax, 7 mov eax, 9 end

При макрорасширении цикл были изменены обыденным повторением инструкций, которые описывались в теле цыклов.

3.2.4 Анализ расширенного листинга программки

Содержимое файла coff1.asm:

include \masm32\include\masm32rt.inc

; Исследование РАСШИРЕННОГО ЛИСТИНГА

;

macrodef MACRO par1, par Макрогенераторы и макросы2, par3

LOCAL M3

mov par2, par1 ; рядовая команда

; с обыденным комментарием

;; Сокрытый комментарий

M3:

push par3 ;; обыденные

pop par2 ;; команды

endm

.data

;

Num1 dd 11223344h, 55667788h

Str1 db "ABCDEF", 0

.code

start:

;

Mov EAX, Num1 ; 11223344

Mov dl, [Str2 + 3]; J

macrodef EAX, EDX, Num1

.data

;

Num2 dd 99aabbcch, 0ddeeff00h

Str2 db "GHIJKLM",0

.code

;

Mov EBX,[Num2 + 4] ; DDEEFF00

Mov dl, [Str1 + 4] ; E

macrodef Num2, ESI, EAX

; 6. примеры Макрогенераторы и макросы реальных вызовов макросов и процедур

print "Hello, world!" ; макрос сообщения

;---------------------------------------

invoke ExitProcess,0 ; выход в Windows

end start

Содержимое файла coff1.asm.ELST:

; Исследование РАСШИРЕННОГО ЛИСТИНГА

;

macrodef MACRO par1, par2, par3

LOCAL M3

mov par2, par1 ; рядовая команда

; с обыденным комментарием

; Сокрытый комментарий

M3:

push par3 ;; обыденные

pop par2 ;; команды

endm

00000000 .data

;

00000000 11223344 Num1 dd 11223344h, 55667788h

00000008 41 42 43 44 45 Str1 db "ABCDEF", 0

46 00

00000000 .code

00000000 start:

;

00000000 A1 00000000 R Макрогенераторы и макросы Mov EAX, Num1 ; 11223344

00000005 8A 15 0000001A R Mov dl, [Str2 + 3]; J

macrodef EAX, EDX, Num1

1 LOCAL M3

0000000B 8B D0 1 mov EDX, EAX ; рядовая команда

1 ; с обыденным комментарием

0000000D 1 ??0019:

0000000D FF 35 00000000 R 1 push Num1

00000013 5A 1 pop EDX

0000000F .data

;

0000000F 99AABBCC Num2 dd 99aabbcch, 0ddeeff00h

DDEEFF00

00000017 47 48 49 4A 4B Str2 db "GHIJKLM",0

4C 4D 00

00000014 .code

;

00000014 8B 1D 00000013 R Макрогенераторы и макросы Mov EBX,[Num2 + 4] ; DDEEFF00

0000001A 8A 15 0000000C R Mov dl, [Str1 + 4] ; E

macrodef Num2, ESI, EAX

1 LOCAL M3

00000020 8B 35 0000000F R 1 mov ESI, Num2 ; рядовая команда

1 ; с обыденным комментарием

00000026 1 ??001A:

00000026 50 1 push EAX

00000027 5E 1 pop ESI

; 6. примеры реальных вызовов макросов и процедур

print "Hello, world!" ; макрос сообщения

2 LOCAL nustr

= " 2 quot SUBSTR ,1,1

2 IFIDN quot,

0000001F 2 .data

0000001F 48 65 6C Макрогенераторы и макросы 6C 6F 2 ??001B db "Hello, world!",0

2C 20 77 6F 72

6C 64 21 00

00000028 2 .code

2 EXITM

00000028 68 0000001F R * push OFFSET ??001B

0000002D E8 00000000 E * call StdOut

1 invoke StdOut,reparg("Hello, world!")

1 IFNB

1 invoke StdOut,chr$()

1 ENDIF

;---------------------------------------

invoke ExitProcess,0 ; выход в Windows

00000032 6A 00 * push +000000000h

00000034 E8 00000000 E * call ExitProcess

end start

При макрорасширении сделал подстановку тел макросов, подмену формальных характеристик снутри тела макроса на фактические характеристики Макрогенераторы и макросы, а локальные метки макроопределений были изменены на ??001A и ??0019.

Выводы

Во время лабораторной работы мы исследовали технику сотворения и внедрения макросов, научились следить за плодами макрогенератора, встроенного в ml.exe.

Остренок ЗКІт-151

КОНСОЛЬНЫЙ ВВОД-ВЫВОД

4.1 Цель работы

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

4.2 Выполнение работы

4.2.1 Ввод Макрогенераторы и макросы-вывод функциями Win32

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

;cio-api.asm

include \masm32\include\masm32rt.inc

comment * ===========================

Шаблон малой учебной программки

* ===================================

.data

ZapisanoByte dd 0

AnyString db "Строчка для вывода.",0

DlinaStroki dd 18

PotokStdOut dd ?

InputBuffer db 25 dup(0)

bLen dd 23

ProchitanoByte Макрогенераторы и макросы dd 0

PotokStdIn dd ?

.code

start:

;ТОЧКА А

invoke GetStdHandle, STD_INPUT_HANDLE

mov PotokStdIn, eax

invoke SetConsoleMode, PotokStdIn, \

ENABLE_LINE_INPUT or \

ENABLE_ECHO_INPUT or \

ENABLE_PROCESSED_INPUT

invoke ReadFile, PotokStdIn, ADDR InputBuffer, bLen, ADDR ProchitanoByte, NULL

invoke GetStdHandle, STD_OUTPUT_HANDLE

mov PotokStdOut, eax

invoke WriteFile, PotokStdOut, ADDR InputBuffer, ProchitanoByte, ADDR ZapisanoByte, NULL

inkey

invoke ExitProcess,0

end start

На рисунке Макрогенераторы и макросы 4.1 представлен итог выполнения сценария, представленого выше.

Набросок 4.1 – Итог выполнения программки cio-api.exe

4.2.2 Испытание макросов консольного ввода и вывода

Ниже приведен листинг программки cio.exe, в какой употребляются макросы консольного ввода и вывода.

;cio.asm

include \masm32\include\masm32rt.inc

comment * ===========================

Шаблон малой учебной программки

* ===================================

.data

lpNumString dd 0

.code

start:

mov lpNumString, input Макрогенераторы и макросы("Введите 16ричное число: ")

print "По сути введен текст "

print lpNumString, 13, 10

;ТОЧКА А

inkey "Нажмите пробел..."

invoke ExitProcess,0

end start

На рисунке 4.2 представлен итог выполнения сценария, представленого выше.

Набросок 4.2 – Итог выполнения программки cio.exe

4.2.3 Преобразование строчки в число и назад

Ниже приведен код программки, после внесения конфигураций, согласно приобретенного задания по преобразованию строчки Макрогенераторы и макросы в число и числа в строчку.

;cio.asm

include \masm32\include\masm32rt.inc

comment * ===========================

Шаблон малой учебной программки

* ===================================

.data

lpNumString dd 0

.code

start:

mov lpNumString, input("Введите 16ричное число: ")

print "По сути введен текст "

print lpNumString, 13, 10

mov EDX, h2ud(lpNumString)

mov EBX, DWORD PTR [EDX]

print "Оборотный вывод введенного числа = ", 13, 10

print str$(EBX), 13, 10

print "То Макрогенераторы и макросы же число, но 16-рично: "

print hex$(EBX), 13, 10

;ТОЧКА А

inkey "Нажмите пробел..."

invoke ExitProcess,0

end start

На рисунке 4.3 представлен итог выполнения сценария, представленого выше.

Набросок 4.3 – Итог выполнения программки cio.exe

4.2.4 Получения кода знака

В тексте сценария, представленного ниже, предвидено получения кода знака выведенного при выполнении макроса inkey.

;cio.asm

include \masm Макрогенераторы и макросы32\include\masm32rt.inc

comment * ===========================

Шаблон малой учебной программки

* ===================================

.data

lpNumString dd 0

.code

start:

mov lpNumString, input("Введите 16ричное число: ")

print "По сути введен текст "

print lpNumString, 13, 10

mov EDX, h2ud(lpNumString)

mov EBX, DWORD PTR [EDX]

print "Оборотный вывод введенного числа = ", 13, 10

print str$(EBX), 13, 10

print "То же число, но 16-рично: "

print hex$(EBX), 13, 10

;ТОЧКА А

inkey Макрогенераторы и макросы "Нажмите пробел..."

print str$(eax), 13, 10

inkey "Выскочил код пробела 32?"

invoke ExitProcess,0

end start

На рисунке 4.4 представлен итог выполнения сценария, представленого выше.

Набросок 4.4 – Итог выполнения программки cio.exe

ВыВОДЫ

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


Остренок ЗКІт-151


magnitotverdie-materiali-referat.html
magomed-mamed-mamish-stranica-4.html
maha-bandha-mudra-simvol-velikogo-zamka.html