AOP_Tom1 (1021736), страница 36
Текст из файла (страница 36)
раздел 4.2). Но лишь в некоторых программах для И1Х мы будем пользоваться этой возможностью, так как, в первую очередь, нас будут интересовать целочисленные алгоритмы. Стандартной спецификацией поля, как обычно. является (О: 5), Остальные поля имеют такой же смысл, как прн выполнении команды ЕОА. Буквой "У" будем обозначать заданное поле СОМТЕИТЯ (М) .
Таким образом, Ъ' — это значение, которое должно быть загружено в регистр А, если кодом операции является (.ОА. ° АОО (сложение). С = 1; Г = поле. У добавляется к гА. Если абсолютное значение результата слишком велико для того, чтобы поместиться в регистре А, то для триггера переполнения устанавливается значение 1, а в гА остается значение, которое выглядит так, как будто "1" перенесено в другой регистр слева от гА.
(В противном случае значение для триггера переполнения не меняется.) Если результат равен нулю, то знак регистра гА остается неизменным. Пример. Последовательность команд, приведенных ниже, служит для вычисления суммы значений, находящихся в пяти байтах регистра А. БТА 2000 ЕРА 2000(6:6) АОР 2000(4:4) АРР 2000(3:3) АОР 2000(2:2) АОО 2000(1:1) Иногда эту операцию называют сложением наискосок.
В одних компьютерах И1Х переполнение происходит, а в других †н,что связано с разницей в размерах байта. Мы не говорили, что переполнение обязательно п)юнзойдет, если результат превысит число 1 073 741 823; переполнение случается, когда абсолютное значение результата не помещается в пяти байтах (в зависимости от размера байта).
Тем не менее можно написать программы, которые правильно работают и дают одинаковые окончательные результаты независимо от размера байта. ° БРВ (вычитание). С = 2: г = поле. Н вычитается из гА. (Эквивалентна команде АРР, только вместо Н берется — Н.) ° ВЛ. (умноженне). С = 3; г' = поле. Занимающее 10 байт произведение Н и значения из гА заменяет содержимое регистров А и Х. В качестве знаков гА и гХ устанавливается алгебраический знак произведения (а именно — "+", если знаки Ч и гА были одинаковы, и "— ", если они были различны).
° 017 (деление). С = 4; г = поле. Значение из гА и гХ, рассматриваемое как 10-байтовое число гАХ со знаком гА, делится на значение Ч. Если Н = 0 или если абсолютная величина частного не помещается в пяти байтах (это эквивалентно условию )гА~ > (Н~), то регистры А и Х заполняются неопределенной информацией и для триггера переполнения устанавливается значение 1. В противном случае частное ~( ~гАХ/Ч() помещается в гА. а остаток х(~гАХ! гпог1 (Н!) — в гХ. После выполнения операции знаком гА становится алгебраический знак частного (а именно — "+", если знаки Ч и гА были одинаковы, н "— ", если они были различны). Знаком гХ после выполнения операции будет тот знак, который был у гА до ее выполнения.
Примеры арифметических команд. В большинстве случаев арифметические действия выполняются только со словами И1Х, которые являются одинарными пятибайтовымн числами, не упакованными в нескольких полях. Тем не менее можно выполнять арифметические операции и над упакованными словами И1Х, если принять некоторые меры предосторожности. Для этого следует внимательно изучить приведенные ниже примеры. (Как и раныпе, ? обозначает неопределенное значение.) гА до операции Ячейка 1000 гА после операции АРР 1000 гА до операции Ячейка 1000 гА после операции БУВ 1000 гА до операции Ячейка 1000 гА после операции гХ после операции МРВ 1000 гА до операции Ячейка 1000 гА после операции гХ после операции ИК.
1000(1:1) гА до операции Ячейка 1000 гА после операции МШ 1000 гХ после операции гА до операции гХ до операции Ячейка 1000 гА после операции гХ после операции Р1У 1000 гА до операции гХ до операции Ячейка 1000 гА после операции гХ после операции 01У 1000 (Эти примеры были подготовлены с учетом той точки зрения, что лучше дать трудное, но полное описание, чем простое, но неполное.) Команды операций с адресами.
В следующих операциях "адрес" М (возможно, индексированный) используется как число со знаком, а ие как адрес ячейки памяти. в ЕМТА (епсег А). С = 48; г = 2. Величина М загружается в гА. Это действие эквивалентно команде "1.ОА" для загрузки из памяти слова, содержащего число М со знаком. Если М = О, то загружается знак команды. Примеры.
"ЕМТА 0" обиуляет гА иустаиавливаетдля него знак "+". "ЕМТА 0,1" заносит в гА текущее содержимое индексного регистра 1, только -О меняется па+О. Действие команды "ЕМТА -О, 1" аналогично, только +О меняется иа — О. ° ЕМТХ (епгег Х вЂ” ввести Х). С = 55; Г = 2. ° ЕМТ( (епсег 1 — ввести 1). С = 48+ 1; Р = 2. Эти команды аналогичны ЕМТА, но только загружается соответствующий регистр, ° ЕММА (еп1ег пейагьте А — ввести А с обратным знаком). С = 48; Г = 3.
° ЕММХ (еп1ег пейайте Х вЂ” ввести Х с обратным знаком). С = 55; Р = 3. ° ЕМ№ (еп»ег пейабте» вЂ” ввести» с обратным знаком). С = 48+»; Г = 3. Эти команды идентичны ЕМТА. ЕМТХ и ЕМТ», но в даннол» случае при загрузке знак меняется на противоположный. Пример. Команда "ЕММЗ 0,3" меняет на противоположный знак содержимого регистра г13, хотя — О так и остается — О. ° 1МСА (шсгеазе А — увеличить А). С = 48; Г = О. К содержимому регистра гА добавляется величина М; это эквивалент команды АРР для добавлении из памяти слова, содержащего величину М.
Здесь также возможно переполнение, которое обрабатывается, как и в случае команды АРР. Пример. Команда "1МСА 1" увеличивает содержимое »А на единицу. ь 1МСХ (»псгеаэе Х вЂ” увеличить Х). С = 55; Г = О. Величина М добавляется к содержимому гХ. Если происходит переполнение, то оно обрабатывается так же, как в случае команды АОР, только вместо гА используется гХ. Действие этой команды никогда не затрагивает регистр А. ° 1МС» (!псгеаве» вЂ” увеличиты). С = 48+»; Г = О. К содержимому г1» добавляется величина М. Переполнения быть не должно; если М + г1» не помещается в двух байтах, то результат команды считается неопределенным. ° РЕСА (»1есгеаве А — уменьшить А).
С = 48; Г = 1. ° РЕСХ (»)есгеазе Х вЂ” уменьшить Х). С = 55; Г = 1, ° РЕС» (»1есгеазе» вЂ” уменьшить»). С = 48+»; Г = 1. Эти восемь команд аналогичны 1МСА, 1МСХ и 1МС» соответственно, но только М не добавляется к содержимому регистра, а вычитается из него. Обратите внимание, что для команд ЕМТА, ЕММА, 1МСА и РЕСА используется один и тот же код операции С; поле Г используется для того, чтобы можно было отличить одну операцию от другой.
Команды сравнения. При выполнении всех команд сравнения М1Х сравнивается величина, содержащаяся в регистре, с величиной, содержащейся в памяти. Затем для флага сравнения устанавливается значение ЕЕ86 (меньше), ЕЦРАР (равно) или ОЕЕАТЕЕ (больше) в зависимости от того, будет ли содержащееся в регистре значение меньше, равно или больше величины, содержащейся в ячейке памяти.
При этом нуль со знаком "—" считается равным нулю со знаком "+". ° СИРА (со»праге А — сравнить А). С = 56; Г = поле. Заданное поле гА сравнивается с»пем з»се полем СОМТЕМТЯ(М). Если Г не содержит бит знака, то оба поля считаются неотрицательными; в противном случае сравнение выполняется с учетом знака. (Равенство всегда будет результатом сравнения, если à — это (О:О), так как нуль со знаком "—" равен нулю со знаком "+".) ° СИРХ (сошраге Х вЂ” сравнить Х). С = 63; Г = поле.
Эта команда аналогична СМРА. ° СМР» (сошраге» вЂ” сравнить»). С = 56+»; Г = поле. Аналог СИРА. Байты 1, 2 и 3 индексного регистра при сравнении считаются нулевыми. (Поэтому, если Г = (1; 2), результатом сравнения не может быть знак ОНЕАТЕН (больше) .) Команды перехода~ Команды обычно выполняются последовательно. Другими словами, команда, которая выполняется после команды из ячейки Р, обычно находится в ячейке Р тг 1. Но команды "перехода" позволяют нарушить этот последовательный ход выполнения. При выполнении типичной команды перехода в регистр Л заносится адрес следующей команды (т.
е. команды, которая оказалась бы следующей, не будь перехода), Затем в случае необходимости программист сможет использовать "адрес Х' для определения адресного поля другой команды, чтобы вернуться к первоначальному месту программы. Содержимое регистра Л меняется при каждом переходе в программе, за исключением случая, когда используется команда перехода лБл. Если перехода нет, содержимое этого регистра измениться никак не может.
° ЛМР (~шпр — перейти). С = 39; Г = О. Команда безусловного перехода: следующая команда выбирается из ячейки ХЕ ° ЛЕЛ ()пшр, ваге Л вЂ” перейти, сохранить Л). С = 39; Г = 1. Эта команда идентична ЛМР, но только содержимое гЛ не меняется. ° ЛОЧ ()шпр оп огегбоя — перейти при переполнении). С = 39; Г = 2.
Если для флага переполнения установлено значение 1, то он переключается в положение 0 и выполняется команда ЛИР; в противном случае ничего не происходит. ° ЛМОЧ ()пшр оп по огегЯоя — перейти, если нет переполнения). С = 39; Е = 3. Если для флага переполнения установлено значение О, то выполняется команда ЛИР; в противном случае ничего не происходит. ° Л., ЛЕ, ЛС, ЛСЕ, ЛМЕ, Л.Е ()пшр оп 1еэк, ег1па1, кгеасег, реасег-ог-ейпа1, ппейпа1, !езв-ог-ес1па! †перей, если меньше, равно, больше, больше или равно, не равно, меньше или равно).
С = 39; Г = 4, 5, б, 7, 8, 9 соответственно. Переход осуществляется в случае, если для флага сравнения установлено указанное значение. Например, по команде ЛМЕ переход будет выполнен, если значением флага сравнения является ЕЕЕБ (меньше) или СЕЕАТЕЕ (больше). Заметим, что эти команды не изменяют значение самого флага сравнения. ° ЛАМ, ЛАХ, ЛАР, ЛАММ, ЛАМЕ, ЛАМР (шшр А пейайче, кето, ров!СЬ е, поппейак!ге, попкего, попрояк!ге — перейти, если в регистре А отрицательное значение, нулевое, положительное, ненулевое, неположительное). С = 40; Г = О, 1, 2, 3, 4, 5 соответственно.