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



End start

 

Include-файл masm 32\ include \ masm 32 rt . inc содержит инструкции подключения к программе всех прототипов и библиотек пакета MASM32. Откройте этот файл в Notepad++ и просмотрите хотя бы его начало. Для нормальной работы с этим шаблоном должны быть прописаны в path пути d:\masm32\; d:\masm32\bin; d:\masm32\inc; d:\masm32\lib, потому что подключаемые файлы находятся именно в этих папках. Если этих путей в path не будет, нормальной сборки программы не произойдет и она не откомпилируется.

Исполняемый ехе-модуль создается вызовом buildc имя_исходного_файла. Расширение asm тут писать не следует.

 

в которой макросами пакета МАСМ32 ввести строку…

Следует использовать макрос input ("Подсказка для ввода:"). Этот макрос принимает с клавиатуры ввод строки в автоматически создаваемую строковую переменную и возвращает адрес этой строковой переменной. Этот макрос – функционально вызываемый, то есть он используется как операнд выражения. Например такого:

mov EDX , input ("Введите строку:")

Здесь регистр EDX назначен как ячейка, куда будет записан адрес строки, автоматически созданной макросом inkey(). Можно было бы использовать имя 4-хбайтной переменной, но тогда ее следовало бы сначала создать в секции данных (Точка Д шаблона), например, так:

Var4 dd 0

 

… и выполнить ее эхо-вывод.

Макрос print позволяет вывести на экран консоли строку, задаваемую адресом. Поскольку предыдущая команда адрес строки сохранила в EDX, то его и следует использовать в print. После строки неплохо бы вставить перевод строки в виде вывода двух управляющих курсором байтов 13, 10. Окончательно

Print edx, 13, 10

Организовать программную задержку до нажатия любой клавиши с подсказкой «Нажмите какую-нибудь клавишу для продолжения…».

 

inkey «Нажмите какую-нибудь клавишу для продолжения…».


Вопросы для самопроверки

а) Что записано в файле masm32\include\masm32rt.inc? Какой смысл в этих записях?

б) Почему для использования этого шаблона нужен гарантированный доступ к папкам bin, lib, include пакета MASM32?

в) Как ввести в программу текстовую строку?

г) Как текстовую строку вывести на экран консоли?

д) Как при выводе курсор консоли перевести на новую строку?

е) Как организовать программную задержку выполнения для просмотра результатов?

 

 


 

МАКРОСЫ

Дан кусочек исходного текста с меткой внутри.

Кусочек может быть абсолютно любой. Например, такой:

mov ax, bx

push eax

m1:

pop edx

jne m1

 

Корректно (ручкой на бумаге) преобразовать его в макрос.

Преобразование фрагмента исходного текста выполняется  дописыванием сверху заголовка макроса с ключевым словом MACRO, а снизу – завершителя ENDM. Заголовок может быть, например такой: MyFrag MACRO.

Но «корректно» сздать макрос означает еще и не забыть про внутренние метки. Здесь это метка m1.

Проблема с этими метками состоит вот в чём. Макросы обычно многократно подставляются в программу, они и существуют-то для того, чтобы освободить программиста от повторного написания одинаковых кусков исходного текста. При вызове макроса строчка его вызова заменяется в исходном тексте программы телом макроса, то есть приведенным выше «кусочком». Но сколько раз мы вызовем макрос MyFrag, столько раз и попадет в исходный текст метка m1. Этого допускать нельзя, потому что метка – это адресная константа, численно равная смещению метки в секции кода. Может константа иметь больше одного значения? – Очевидно, что нет. (Простая аналогия. Может на одной улице быть несколько домов с одинаковым номером 14? Как почтальон разберется, в какой из них доставлять письма? Неправильная ситуация, недопустимая). Как же обеспечить уникальность внутренних меток при повторных вставках тела макроса в программу?

Эту работу для нас легко сделает макрогенератор, встроенный в компилятор ML.EXE. Достаточно после заголовка макроса написать LOCAL, и перечислить метки макроса, которые должны обыть в программе уникальными. В нашем случае это LOCAL m1. Окончательно текст макроса получается такой:

MyFrag MACRO

LOCAL m1

mov ax, bx

push eax

m1:

pop edx

jne m1

ENDM

 

 

Написать на бумаге две подстановки этого макроса в программу, показав знание того, как обрабатываются повторные вставки меток.

Для описанных локальних меток макрогенератор при подстановках автоматически генерирует искусственные имена по шаблону ??XXXX, где ХХХХ – это запись последовательных чисел в 16-ричном формате от 0000 до FFFF.  Имена в ассемблере должны начинаться с буквы, но символы ?, _, @ в ассемблере считаются буквами , так что всё в порядке.

При первой подстановке метку «окрестят» ??0000, при второй - ??0001 и так далее.

Раз так, первая подстановка нашего макроса выглядит так:

mov ax, bx

push eax

??0000:

pop edx

jne ??0000

 

Вторая:

mov ax, bx

push eax

??0001:

pop edx

jne ??0001

Как видим, в каждой подстановке имя метки разное, что и требовалось.

Вопросы для самопроверки

а) Какой цели служит использование макроса?

б) Что такое «локальная метка в макросе»?

в) Как макрогенератор обеспечивает уникальность локальных меток при повторных вставках макроса?

г) Является ли символ «?» буквой в ассемблере?

 

 


 

ЦИКЛЫ

Ручкой на бумаге описать sz-строку в секции данных.

Любая строка – это массив кодов символов, то есть однобайтных целых чисел. Код символа соответствует изображению выводимого символа. Коды и изображения символов связываются через т.н. кодовые таблицы. Например, код 65 соответствует изображению заглавной английской А.

Чтобы обозначить в памяти конец строки, принято за последней литерой строки ставить байт со значением 0 (ноль-байт). Строки с таким «довеском» называются sz-строками, или ASCIIZ-строками. Расшифровка аббревиатур: «sz» от «String and Zero», «ASCIIZ» от «American Standard Code of Information Interchange with Zero».

Описание строки в секции данных обычное: метка (то есть имя), директива размещения db, перечисление символов строкой и/или числами. Например:


Дата добавления: 2018-10-26; просмотров: 316; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!