Главная » Просмотр файлов » Сист. прогр. Ч1

Сист. прогр. Ч1 (1085725), страница 9

Файл №1085725 Сист. прогр. Ч1 (Методические указания к выполнению лабораторных работ по СПО) 9 страницаСист. прогр. Ч1 (1085725) страница 92018-01-12СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 9)

В50: ... ;Точка перехода при ВХ=0

Если ВХ содержит нулевое значение, команда СМР устанавливает флаг нуля ZF в единичное состояние и, возможно, изменяет (или нет) другие флаги. Команда JZ (переход, если нуль) проверяет только флаг ZF. При единичном значении ZF, обозначающем нулевой признак, команда передает управление на адрес, указанный в ее операнде, т.е. на метку В50.

КОМАНДЫ УСЛОВНОГО ПЕРЕХОДА

В предыдущих примерах было показано, что команда LOOP уменьшает на единицу содержимое регистра СХ и проверяет его: если не ноль, то управление передается по адресу, указанному в операнде. Таким образом, передача управления зависит от конкретного состояния. Ассемблер поддерживает большое количество команд условного перехода, которые осуществляют передачу управления в зависимости от состояний флагового регистра. Например, при сравнении содержимого двух полей последующий переход зависит от значения флага.

Команду LOOP в программе на рис.6.2 можно заменить на две команды: одна уменьшает содержимое регистра СХ, а другая выполняет условный переход:

Использование Использование
LOOP: условного перехода:

LOOP A20 DEC CX

JNZ A20

Команды DEC и JNZ действуют аналогично команде LOOP: уменьшают содержимое регистра СХ на 1 и выполняют переход на метку А20, если в СХ не ноль. Команда DEC, кроме того, устанавливает флаг нуля во флаговом регистре в состояние 0 или 1. Команда JNZ затем проверяет эту установку. В рассмотренном примере команда LOOP хотя и имеет ограниченное использование, но более эффективна, чем две команды: DEC и JNZ.

Аналогично командам JMP и LOOP, операнд в команде JNZ содержит значение расстояния между концом команды JNZ и адресом А20, которое прибавляется к командному указателю. Это расстояние должно быть в пределах от -128 до +127 байт. В случае перехода за эти границы ассемблер выдаст сообщение "Relative jump out of range" .

Знаковые и беззнаковые данные.

Рассматривая назначение команд условного перехода, следует пояснить характер их использования. Типы данных, над которыми выполняются арифметические операции и операции сравнения, определяют, какими командами пользоваться: беззнаковыми или знаковыми. Беззнаковые данные используют все биты как биты данных; характерным примером являются символьные строки: имена, адреса и натуральные числа. В знаковых данных самый левый бит представляет собой знак, причем если его значение равно нулю, то число положительное, и если равно единице, то отрицательное. Многие числовые значения могут быть как положительными, так и отрицательными.

В качестве примера предположим, что регистр АХ содержит 11000110, а ВХ - 00010110. Команда

СМР АХ,ВХ

сравнивает содержимое регистров АХ и ВХ. Если данные беззнаковые, то значение в АХ больше, а если знаковые - то меньше.

Переходы для беззнаковых данных

Мнемоника Описание Проверяемые флаги

JE/JZ Переход, если равно/нуль ZF

JNE/JNZ Переход, если не равно/не нуль ZF

JA/JNBE Переход, если выше/не ниже или равно ZF,CF

JAE/JNB Переход, если выше или равно/не ниже CF

JB/JNAE Переход, если ниже/не выше или равно CF

JBE/JNA Переход, если ниже или равно/не выше CF,AF

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

Переходы для знаковых данных

Мнемоника Описание Проверяемые флаги

JE/JZ Переход, если равно/нуль ZF

JNE/JNZ Переход, если не равно/не нуль ZF

JG/JNLE Переход, если больше/не меньше или равно ZF,SF,OF

JGE/JNL Переход, если больше или равно/не меньше SF,OF

JL/JNGE Переход, если меньше/не больше или равно SF,OF

JLE/JNG Переход, если меньше или равно/не больше ZF,SF,OF

Команды перехода для условия равно или ноль (JE/JZ) и не равно или не ноль (JNE/JNZ) присутствуют в обоих списках для беззнаковых и знаковых данных. Состояние равно/нуль происходит вне зависимости от наличия знака.

Специальные арифметические проверки

Мнемоника Описание Проверяемые

флаги

JS Переход, если есть знак (отрицательно) SF

JNS Переход, если нет знака (положительно) SF

JС Переход, если есть перенос (аналогично JB) CF

JNC Переход, если нет переноса CF

JO Переход, если есть переполнение OF

JNO Переход, если нет переполнения OF

JP/JPE Переход, если паритет четный PF

JNP/JP Переход, если паритет нечетный PF

Еще одна команда условного перехода JCXZ проверяет, равно ли содержимое регистра СХ нулю. Эта команда не обязательно должна располагаться непосредственно за командами арифметики или сравнения. Одним из мест для команды JCXZ может быть начало цикла, где она проверяет, содержит ли регистр СХ ненулевое значение.

Не спешите пока заучивать эти команды наизусть. Запомните только, что для беззнаковых данных есть переходы по состояниям равно, выше или ниже, а для беззнаковых - равно, больше или меньше. Переходы по проверкам флагов переноса, переполнения и четности имеют особое назначение. Ассемблер транслирует мнемонические коды в объектный код независимо от того, какую из двух команд вы применили. Однако команды JAE и JGE, являясь явно одинаковыми, проверяют различные флаги.

ПРОЦЕДУРЫ И ОПЕРАТОР CALL

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

BEGIN PROC FAR

……..

BEGIN ENDP

Операнд FAR информирует систему о том, что данный адрес является точкой входа для выполнения, а директива ENDP определяет конец процедуры. Кодовый сегмент, однако, может содержать любое количество процедур, которые разделяются директивами PROC и ENDP. Типичная организация многопроцедурной программы приведена на рис.6.3. Обратите внимание на следующие особенности:

Директивы PROC по меткам B10 и С10 имеют операнд NEAR для указания того, что эти процедуры находятся в текущем кодовом сегменте. Во многих последующих примерах этот операнд опущен, так как по умолчанию ассемблер принимает тип NEAR.

Каждая процедура имеет уникальное имя и содержит собственную директиву ENDP для указания конца процедуры. Для передачи управления в процедуре BEGIN имеются две команды: CALL BI0 и CALL C10. В результате первой команды CALL управление передается процедуре В10 и начинается ее выполнение. Достигнув команды RET, управление возвращается на команду, непосредственно следующую за CALL B10. Вторая команда CALL действует аналогично - передает управление в процедуру С10, выполняет ее команды и возвращает управление по команде RET.

Команда RET всегда выполняет возврат в вызывающую программу. Программа BEGIN вызывает процедуры В10 и С10, которые возвращают управление обратно в BEGIN. Для выполнения самой программы BEGIN операционная система DOS вызывает ее и в конце выполнения команда RET возвращает управление в DOS. Если процедура B10 не содержит завершающей команды RET, то выполнение команд продолжится из В10 непосредственно в процедуре С10. Если процедура С10 не содержит команды RET, то будут выполняться команды, оказавшиеся за процедурой С10 с непредсказуемым результатом.

CODESG SEGMENT PARA

BEGIN PROC FAR

CALL B1O

CALL C1O

RET

BEGIN ENDP



B10 PROC NEAR

RET ………………….



B10 ENDP

;……………………………………………….

C10 PROC NEAR

……………………..

RET

C10 ENDP

CODESG ENDS

END BEGIN



Рис.6.3. Вызов процедур

Использование процедур дает хорошую возможность организовать логическую структуру программы. Кроме того, операнды для команды CALL могут иметь значения, выходящие за границу от -128 до +127 байт.

Технически управление в процедуру типа NEAR можно передать с помощью команд перехода или даже обычным построчным кодированием. Но в большинстве случаев рекомендуется использовать команду CALL для передачи управления в процедуру и команду RET для возврата.

СЕГМЕНТ СТЕКА

До этого раздела в приводимых примерах встречались только две команды, использующие стек, - это команды PUSH в начале сегмента кодов, которые обеспечивают возврат в DOS, когда ЕХЕ-программа завершается. Естественно, для этих программ требуется стек очень малого размера. Однако команда CALL автоматически записывает в стек относительный адрес команды, следующей непосредственно за командой CALL, уменьшая при этом указатель вершины стека. В вызываемой процедуре команда RET использует этот адрес для возврата в вызывающую процедуру и при этом автоматически увеличивается указатель вершины стека.

Таким образом, команды PUSH записывают в стек двухбайтовые адреса или другие значения. Команды POP обычно выбирают из стека записанные в него слова. Эти операции изменяют относительный адрес в регистре SP (т.е. в указателе стека) для доступа к следующему слову. Данное свойство стека требует, чтобы команды RET и CALL соответствовали друг другу. Кроме того, вызванная процедура может вызвать с помощью команды CALL другую процедуру, а та в свою очередь -следующую. Стек должен иметь достаточные размеры для того, чтобы хранить все записываемые в него адреса. Для большинства примеров в данной книге стек объемом в 32 слова является достаточным.

Команды PUSH, PUSHF, CALL, INT, и INTO заносят в стек адрес возврата и, возможно, содержимое флагового регистра. Команды POP, POPF, RET и IRET извлекают эти адреса и флаги из стека.

При передаче управления в ЕХЕ-программу система устанавливает в регистрах следующие значения.

DS и ES: Адрес префикса программного сегмента - область в 256 (100Н) байт, которая предшествует выполняемому программному модулю в памяти.

CS: Адрес точки входа в программу (адрес первой выполняемой команды)-

IP: Нуль.

SS: Адрес сегмента стека.

SP: Относительный адрес, указывающий на вершину стека. Например, для стека в 32 слова (64 байт), определенного как

DW 32 DUP(7),
SP содержит 64, или 40Н.

При возврате из процедуры С10 команда RET извлекает 000В из стека (4В00 + 38), помещает его в указатель команд IP и увеличивает значение SP на 2. При этом происходит автоматический возврат по относительному адресу 000В в кодовом сегменте, т.е. в процедуру В10.

Команда RET в конце процедуры В10 извлекает адрес 0007 из стека (4В00 + ЗА), помещает его в IP и увеличивает значение SP на 2. При этом происходит автоматический возврат по относительному адресу 0007 в кодовом сегменте. Команда RET по адресу 0007 завершает выполнение программы, осуществляя возврат типа FAR.

7. ПРОГРАММА: РАСШИРЕННЫЕ ОПЕРАЦИИ ПЕРЕСЫЛКИ

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

page 65,132

TITLE MOVE (EXE) ;Расширенная пересылка

STACKSG SEGMENT PARA STACK 'Stack'

DW 32DUP(?)

STACKSG ENDS

DATASG SEGMENT PARA 'Data'

NAME1 DB 'ABCDEFGHI'

NAME2 DB ‘JKLMNOPQR'

NAHE3 DB 'STUVWXYZ*'

DATASG ENDS

CODESG SEGMENT PARA ‘Code’

BEGIN PROC FAR

ASSUME CS:CODESG, DS:DATASG, SS: STACKSG, ES:DATASG

PUSH DS

SUB AX, AX

PUSH AX

MOV AX, DATASG

MOV DS.AX

MOV ES.AX

CALL B10MOVE

CALL C10MOVE

RET

BEGIN ENDP

B10MOVE PROC

LEA SI, NAME1

LEA DI, NAME2

MOV CX , 09

B20:

MOV AL,[SI]

MOV [D1], AL

INC SI

INC DI

DEC CX

JNZ B20

RET

B10MOVE ENDP

LEA SI,NAME1

LEA DI,NAME2

MOV CX, 09

C20:

MOV AL,[SI]

MOV [DI], AL

INC DI

INC SI

LOOP C20

RET

C10MOVE ENDP

CQDESG ENDS

END BEGIN

Рис.7.1

Процедура С10MOVE аналогична процедуре В10MOVE с двумя исключениями: она пересылает данные из поля NAME2 в none NAME3 и использует команду LOOP вместо DEC и JNZ.

Обратите внимание на изменения в регистрах, командном указателе и стеке. Для просмотра изменений и полях NAME2 и NAME3 используйте команду D DS:0.

КОМАНДЫ ЛОГИЧЕСКИХ ОПЕРАЦИЙ: OR, XOR, TEST, NOT

Характеристики

Тип файла
Документ
Размер
1019 Kb
Тип материала
Высшее учебное заведение

Список файлов книги

Методические указания к выполнению лабораторных работ по СПО
сист прогр лабы
Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6551
Авторов
на СтудИзбе
299
Средний доход
с одного платного файла
Обучение Подробнее