Ассемблер для IBM PC

МнемокодДействиеОперанд 1Операнд 2ПримечаниеCMPSСравнение пары элементов: [DS:SI]=[ES:DI]?; SI:=SI+d; DI:=DI+d,Регистры DS и SIРегистры ES и DIЗаписывается без операндов. По результатам сравнения изменяется

Ассемблер для IBM PC

Методическое пособие

Компьютеры, программирование

Другие методички по предмету

Компьютеры, программирование

Сдать работу со 100% гаранией

 

 

 

 

 

 

 

 

Ассемблер для IBM PC

 

 

Введение

 

Данная разработка является второй частью методического руководства к выполнению лабораторных работ. В нее вошли вопросы, касающиеся обработки символьной информации, работы с процедурами, выполнения логических битовых операций. Разработка составлена на основе лекций, читаемых авторами по курсу «Архитектура вычислительных систем и сетей», «Организация ЭВМ и систем», «Введение в язык Ассемблера».

Изучение тем, предлагаемы в данном руководстве необходимо при подготовке профессиональных программистов, поскольку позволяет лучше понять принципы работы ЭВМ, операционных систем с языков высокого уровня, а также разрабатывать высокоэффективные программы.

Описание каждой лабораторной работы состоит из следующих разделов:

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

·основные сведения - содержат минимальных набор теоретических сведений, необходимых в ходе выполнения работы;

·пример выполнения работы - типовое задание и программа, реализующая поставленную задачу, можно рассматривать как шаблон для выполнения работы по данной теме;

·варианты заданий для индивидуальной работы;

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

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

Отчет по лабораторной работе должен включать: вариант задания, тексты программ в виде листинга трансляции, исходные данные и результаты выполнения программы для нескольких наборов данных.

1. Обработка символьной информации

 

Цель: Изучить команды для обработки строк, приемы, используемые в работе со строками, рассмотреть приемы их использования, реализовать приведенные базовые операции при решении задач.

Задачи:

üНаучиться проводить действия над блоками памяти, представляющими собой последовательности элементов размерами байт и слово.

üИзучить синтаксис и использование префиксов повторений: REP, REPE и REPNE.

üИзучить синтаксис и использование команд:

oпересылки строк MOVS, LOADS, STOS и их эквивалентные формы;

oпроверки строк CMPS и его эквивалентную форму;

üНаучиться приемам обработки строк.

Цепочечные или строковые команды.

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

Особенности строковых команд.

1. Каждая строковая операция представлена двумя командами: одна из них предназначена для обработки строк из байтов (мнемокод содержит букву b (byte)), а другая - для обработки строк из слов (мнемокод содержит букву w (word)). В целом действия этой пары команд совпадают, поэтому обычно про них говорят как про одну команду, и в случае необходимости уточняют, какой именно вариант ее имеют в виду.

2. Для выполнения своих функций строковые команды используют определенные регистры. Полные физические адреса для операндов строковых команд следующие: адрес источника src - пара DS: SI, адрес приемник dst - пара ES: DI.

3. Все строковые команды по завершении основного действия выполняют изменение регистров SI и DI так, чтобы в них оказались адреса соседних элементов строк (на величину d).

. Направление просмотра строки зависит от значения флага направления DF. Изменить флаг DF можно командами:

очистка флага DF (clear DF) - CLD (DF:=0) - просмотр слева направо;

установка флага DF (set DF) - STD (DF:=1) - просмотр справа налево.

Существует пять основных строковых команд: загрузка (LODS), запись (STOS), пересылка (MOVS), сканирования (SCAS) и сравнения (CMPS), которые можно разделить на группы:

  • команды пересылки строк: MOVS - пересылка, LOADS - загрузка, STOS - запись;
  • команды проверки строк: SCAS - сканирование, CMPS - сравнение.

Перечень команд обработки строк представлен в таблице 1.

Замечание. Алгоритм работы команды CMPS заключается в последовательном выполнении вычитания над очередными элементами обеих строк. По результатам вычитания изменяется содержимое регистра флага, но при этом не меняется информация в ячейках памяти, адресуемые регистрами SI и DI. Если строка-источник src меньше, чем строка-приемник dst, то CF = 1. Если строки равны, то ZF = 1. Если строка-источник src больше, чем строка-приемник dst, то CF = 0 и ZF = 0. В этих командах могут быть использованы префиксы повторения REPE - повторить пока dst = src или REPNE - повторить пока dst <> src.

 

Таблица 1. Строковые команды

МнемокодДействиеОперанд 1Операнд 2ПримечаниеCMPSСравнение пары элементов: [DS:SI]=[ES:DI]?; SI:=SI+d; DI:=DI+d,Регистры DS и SIРегистры ES и DIЗаписывается без операндов. По результатам сравнения изменяется регистр флагов.SCASСканирование строки (сравнения значения аккумулятора AL/AX с байтом / словом в памяти) AL=[ES:DI]?; DI: - DI±1Регистры ES:DIALИспользуется для поиска в строке элемента, равного заданному (в AL или АХ) или отличного от заданногоMOVSПересылка строки: [DS:SI] => [ES:DI]; SI:=SI+d; DI:=DI+dИсточник - регистры DS и SIПриемник - ES и DIНе меняет флаги и потому выход из цикла возможен только по СХ=0.STOSПеренос элементов из аккумулятора в строку-приемник dst: AL®[ES:DI]регистра ALрегистров ES:DIИспользуется для записи во все ячейки какой-то области памяти одной и той же величины, указанной в регистре AL или АХLODSПеренос элементов из строки-источника src в аккумулятор: [DS:SI] ® ALрегистрами DS:SIрегистр AL (AX)Используется вместе с командой STOS для переписи строк, когда между считыванием и записью элементов строк над ними должна быть выполнена какая-то дополнительная операция

В таблице 2 приведены условные переходы, которые можно использовать с командой CMPS.

 

Таблица 2. Условные переходы для команд сравнения

УсловиеБез знакаСо знакомsrc < dstJBJLsrc <= dstJBEJLEsrc <> dstJNE (JNZ)JNE (JNZ)src = dstJE (JZ)JE (JZ)src >= dstJAEJGEsrc > dstJAJG

Команды префикса повторения.

Строковые команды могут обрабатывать только один байт или слово. При обработке длинных строк используются специальные префиксы повторения. Префикс заставляет команду выполняться несколько раз. В строковых командах можно использовать следующие префиксы повторения:

ürep (repeat) - повторять, пока CX > 0; используется с командами, реализующими операции-примитивы пересылки (movs) и сохранения элементов цепочек (stos);

ürepe или repz (repeat while Equal or Zero) - повторять, пока флаг нуля установлен и CX > 0; используются с командами сравнения (cmps) и сканирования (scas) для поиска отличающихся элементов цепочек;

ürepne или repnz (repeat while Not Equal or Zero) - повторять, пока флаг нуля сброшен и CX > 0; используются с командами сравнения и сканирования для поиска совпадающих элементов цепочек.

Префиксы повторения указываются перед нужной цепочечной командой в поле метки. Для их использования необходимо поместить в регистр CX значение, равное количеству повторов строковой команды. При этом цепочечная команда, перед которой стоит префикс, автоматически уменьшает содержимое cx на единицу.

Примеры программ, реализующих действия со строками.

Фрагмент программы копирования 10 байт из поля отправителя source в поле получатель dst.

 

data

srcDBABCDEFGHIJ; строка-источникDB10 dup (?); строка - приемник

code

ASSUME DS: @data, ES: @data

Main:

MOVAX, @data; загрузка сегментных регистров

MOVDS, AX; настройка DS на адрес сегмента данных

MOVES, AX; настройка ES на адрес сегмента данныхSI, src; поместить в SI смещение строки-источника srcDI, dst; поместить в DI смещение строки-приемника dstCX, 10; длина строки; по возрастанию адресовMOVS dst, src; повторить пока CX > 0

 

Examle 7.1.Фрагмент программы сканирования буфера buffer, со сбросом старшего бита каждого байта и сохранением результата в output.

 

data

bufferDB0C8h, 0FBh, 0F5h, 0Cah, 41h, 32h, 43h. 04h, 87h, 8ChDB10 DUP (?)

code

MOVSI, OFFSET buffer; буфер-источникDI, OFFSET output; буфер-приемник

MOVCX, 10; длина буфера:buffer; копировать DS: SI в ALAL, 7FH; очистить старший битoutput; сохранить AL в ES: DIL; повторить пока CX <> 0

Сравнить две строки S1 и S2 каждая длиной N.

 

CLD ; просмотр вперед

LEA SI, S1; в DS:SI поместить начало S1

LEADI, S2; в ES:DI поместить начало S2

MOVCX, N; в CX длина строк

L:

CMPSB; сравнить пару элементов

JNENOEG; если S1<>S2, то NOEG

LOOP L; к следующей паре

EQ:

…; действия, если S1 = S2

NOEG:

…; действия, если S1 <> S2

 

В строке S из 500 символов заменить первое вхождение символа '*' на точку.

 

CLD ; просмотр строки вперед

PUSHDS;

POPES ; установить ES на сегмент данных

LEADI, S; ES:DI=начало SСХ, 500; длина строки

MOVAL, '*'; символ для поиска

REPNESCASB; поиск первого вхождения '*' в S

JNEFIN; в строке S нет

Похожие работы

1 2 3 4 5 > >>