Д. Кнут - Искусство программирования том 1 (1119450), страница 35
Текст из файла (страница 35)
Команда Последующее содержимое гА 10А 2000 1.0А 2000(1:Б) !.ОА 2000(3:Б) !.РА 2000(0:3) (.ОА 2000(4:4) ЫА 2000(0:О) 1,РА 2000(1:1) (В последнем примере значение частично не определено, так как размер байта переменный.) ° !.ОХ (1оаг( Х вЂ загрузи Х). С = 15; г = поле. Эта команда идентична 1,ОА, за исключением того, что вместо гА загружается гХ. в !.Ог (1оаг( г — загрузить г). С = 8+ г; г = поле. Эта команда идентична ООА, только вместо гА загружается г1г. Индексный регистр содержит только два байта (а не пять) и знак; байты 1, 2, 3 всегда считаются нулевыми.
Поэтому, если установить для байтов 1, 2 или 3 любые значения. не равные нулю, то команда 1.Ог станет неопределенной. В описаниях всех команд "г" обозначает целое число, 1 < г < 6. Таким образом. 1.Ог обозначает шесть различных команд: !.01, 1.02, ..., 1.06. ° 1.ОАИ (1оаг( А пе8аг(ге — загрузить в А с обратным знаком). С = 16; г = поле.
° 1.ОХИ ()оас1 Х пе8атгге — загрузить в Х с обратным знаком). С = 23; г = поле. ° ООгИ (!оад г пебабхе — загрузить в г' с обратным знаком). С = 16+ г; г = поле. Эти восемь команд идентичны командам ЕОА, ЕОХ и !.Ог соответственно. но только величины загружаются с обрапгнмм знаком. Команды записи в память ° БТА (э1оге А — записать А). С = 24; г = поле. Часть содержимою гА заменяет поле СОИТЕИТБ(М), которое указано в Г Другие части СОИТЕИТБ(М) остаются неизменными. Для операции записи в память поле г имеет противоположный смысл по сравнению с операцией загрузки. Нужное количество байтов в поле, взятом из правой части регистра, в случае необходимости сдвигаегся влево, а затем помещается в соответствующее поле СОИТЕИТБ(М).
Знак меняется только тогда, когда он является частью поля. Содержимое регистра также остается без изменений. Примеры. Предположим, в ячейке 2000 содержится а в регистре А Тогда получаем следующее. Команда Содержимое ячейки 2000 после выполнения команды ЯТА 2000 ЯТА 2000(1гб) ЯТА 2000(6:6) БТА 2000(2:2) ЯТА 2000(2:3) ЯТА 2000(0:1) ° ЯТХ (эгоге Х вЂ записа Х) С = 31: г = поле. Идентична команде ЯТА,но только сохраняется содержимое гХ, а не гА.
° ЯТ1 (этосе 1 — записать 1). С = 24+1; Е = поле. Идентична команде ЯТА, за исключением того, что сохраняется содержимое гБ, а не гА. Байты 1, 2 и 3 индексного регистра являются нулевыми, поэтому, если в г11 содержится значит, в нем находится ° ЯТЗ (э1оге 3 †сохрани Л). С = 32; Е = поле. Идентична команде ЯТг, но только сохраняется гЗ н знаком всегда является "ч-". Для команды ЯТэ стандартной спецификацией поля для г является (О:2), а не. (О: 5).
И это естественно, так как ЯТЛ почти всегда выполняет запись в адресное поле команды. ° ЯТ2 (этосе вего — записать нуль). С = 33; Г = поле. Идентична команде ЯТА, но только сохраняется нуль со знаком "+". Другими словами, заданное поле СОИТЕИТЯ(М) обнуляется. Арифметические комаиды. При выполнении операций сложения, вычитания, умножения и деления допускается спецификация поля.
Спецификацию поля "(О:6)" можно использовать для указания операции с плавающей точкой (см. раздел 4.2). Но лишь в некоторых программах для И1Х мы будем пользоваться этой возможностью, так как, в первую очередь, нас будут интересовать целочисленные алгоритмы. Стандартной спецификацией поля, как обычно, является (О: 5). Остальные поля имеют такой же смысл, как при выполнении команды 10А. Буквой "1г' будем обозначать заданное поле СОИТЕИТЯ(М).
Таким образом, У вЂ” это значение, которое должно быть загружено в регистр А, если кодом операции является ЫА. ° АОР (сложение), С = 1; Е = поле. У добавляется к гА. Если абсолютное значение результата слишком велико для того, чтобы поместиться в регистре А, то для триггера переполнения устанавливается значение 1, а в гА остается значение, которое выглядит так, как будто "Г перенесено в другой регистр слева от гА. (В противном случае значение для триггера переполнения не меняется.) Если результат равен нулю, то знак регистра гА остается неизменным. Пример.
Последовательность команд, приведенных ниже, служит для вычисления суммы значений, находящихся в пяти байтах регистра А. ЯТА 2000 10А 2000(6:5) АРО 2000(4:4) АРР 2000(3:3) АОО 2000(2:2) АОР 2000(1:1) Иногда эту операцию называют сложевнем наискосок. В одних компьютерах ИХХ переполнение происходит, а в других †н, что связано с разницей в размерах байта. Мы не говорили, что переполнение обязательно произойдет, если результат превысит число 1 073 741 623; переполнение случается, когда абсолютное значение результата не помещается в пяти байтах (в зависимости от размера байта). Тем не менее можно написать программы, которые правильно работают и дают одинаковь1е окончательные результаты независимо от размера байта. гА до операции Ячейка 1000 гА после операции АР0 1000 гА до операции Ячейка 1000 гА после операции ЯЧВ 1000 гА до операции Ячейка 1000 гА после операции гХ после операции И01.
1000 ° йрй (вычитание). С = 2; Е = поле. Ч вычитается из гА. (Эквивалентна команде А00, только вместо Ч берется -Ч.) ° ЖП. (умножение). С = 3; Е = поле. Занимающее 10 байт произведение Ч и значения из гА заменяет содержимое регистров А и Х. В качестве знаков гА и гХ устанавливается алгебраический знак произведения (а именно — "+", если знаки Ч и гА были одинаковы, и "— ", если они были различны). ° 01У (деление).
С = 4; Г = поле. Значение из гА и гХ, рассматриваемое как 10-байтовое число гАХ со знаком гА, делится на значение Ч. Если Ч = 0 или если абсолютная величина частного не помещается в пяти байтах (это эквивалентно условию )гА! > ~Ч!), то регистры А и Х заполняются неопределенной информацией и для триггера переполнения устанавливается значение 1. В противном случае частное ~~~гАХ/Ч(( помещается в гА. а остаток ~((гАХ(шог1)Ч() — в гХ. После выполнения операции знаком гА становится алгебраический знак частного (а именно — "+", если знаки Ч и гА были одинаковы, и "— ", если они были различны). Знаком гХ после выполнения операции будет тот знак, который был у гА до ее выполнения. Примеры арифметических команд.
В большинстве случаев арифметические действия выполняются только со словами И1Х, которые являются одинарными пятибайтовыми числами. не упакованными в нескольких полях. Тем не менее можно выполнять арифметические операции и над упакованными словами И1Х, если принять некоторые меры предосторожности.
Для этого следует внимательно изучить приведенные ниже примеры. (Как и раньше, т обозначает неопределенное значение.) гА до операции Ячейка 1000 гА после операции гХ после операции И01 1000(1:1) гА до операции Ячейка 1000 гА после операции гХ после операции И01 1000 гА до операции гХ до операции Ячейка 1000 гА после операции гХ после операции 01Ч 1000 гА до операции гХ до операции Ячейка 1000 гА после операции гХ после операции ИЧ 1000 (Эти примеры были подготовлены с учетом той точки зрения, что лучше дать трудное, но полное описание, чем простое, но неполное.) Команды операций с адресами. В следующих операциях "адрес" М (возможно, индексированный) используется как число со знаком, а не как адрес ячейки памяти.
в ЕМТА (епгег А). С = 48; Р = 2. Величина М загружается в гА. Это действие эквивалентно команде кйраи для загрузки из памяти слова, содержащего число М со знаком. Если М = О, то загружается знак команды. Примеры. "ЕМТА 0" обнуляетгА и устанавливаетдля него знак "+". «ЕМТА 0,1" заносит в гА текущее содержимое индексного регистра 1, только -0 меняется на +О.
Действие команды "ЕМТА -0,1" аналогично, только +О меняется на -О. ° ЕМТХ (епФег Х вЂ” ввести Х). С = 55; Р = 2. ° ЕМТг' (еп1ег ( — ввести (). С = 48+ г'; Р = 2. Эти команды аналогичны ЕМТА, но только загружается соответствующий регистр. ° ЕММА (епгег пейасгее А — ввести А с обратным знаком). С = 48; Р = 3. ° ЕММХ (епсег пейас(те Х вЂ” ввести Х с обратным знаком). С = 55; Р = 3. ° ЕИИ? (епсег пе8агьте 1 — ввести ? с обратным знаком). С = 48+1; Г = 3. Эти команды идентичны ЕМТА. ЕИТХ и ЕИТ?, но в данном случае при загрузке знак меняется на противоположный. Пример. Команда "ЕИИЗ 0,3" меняет на противоположный знак содержимого регистра г?3, хотя — О так и остается — О.
° 1ИСА (шсгеаве А — увеличить А). С = 48; Р = О. К содержимому регистра гА добавляется величина М; это эквивалент команды А00 для добавления из памяти слова, содержащего величину М. Здесь также возможно переполнение, которое обрабатывается, как и в случае команды А00. Пример. Команда "1ИСА 1" увеличивает содержимое гА на единицу. я 1ИСХ (?псгеазе Х вЂ” увеличить Х), С = 55; Р = О.
Величина М добавляется к содержимому гХ. Если происходит переполнение, то оно обрабатывается так же. как в случае команды А00, только вместо гА используется гХ. Действие этой команды никогда не затрагивает регистр А. ° 1ИС? (?псгевзе 1 — увеличиты). С = 48+ 1; Р = О. К содержимому г?1 добавляется величина М. Переполнения быть не должно; если М+ г?1 не помещается в двух байтах, то результат команды считается неопределенным. ° ОЕСА (бесгеаве А — уменьшить А). С = 48; Р = 1. ° 0ЕСХ (бесгеаве Х вЂ” уменьшить Х). С = 55; Р = 1. ° 0ЕС? (с?есгеазе 1 — уменьшить 1).