2016-09-27 15 views
0

Я читаю книгу о процессоре Zilog Z80, в котором каждый раз, когда автор хочет, чтобы очистить бит переноса для возможной причины он одно из следующих действий:Как регистр XORing A очищает бит переноса в регистре F в Z80?

XOR A 
AND A 
OR A 

Как это влияет на битом C который находится в регистре F? Другими словами, как выполнение операции над некоторым регистром (A) влияет на другой регистр (F)?

+2

Я до сих пор не понимаю, что вы подразумеваете под «как». Вот как это работает, по определению. Это тоже не странно, аппаратно. – harold

+0

Но это не имеет смысла для меня, или я просто не понимаю. Я имею в виду, когда вы «LD A, 0' влияет на регистр A, а не на регистр B, а не на регистр F, потому что это регистр, который я выбрал для выполнения операции. Итак, почему исключение «XOR A»? –

+0

_ "как выполнение операции над некоторым регистром (A) влияет на другой регистр (F)" _. Это обычное, часто желаемое свойство. 'F' - это, в конце концов, регистр _flags_. Например, после выполнения 'cp' вы можете узнать, были ли операнды равными (Z установлен), а после' add' вы можете узнать, был ли сгенерирован перенос и т. Д. – Michael

ответ

5

Думаю, я понимаю вашу озабоченность. Регистр флагов получает результат операции, поэтому имеет смысл, что AND, OR, XOR все влияют на флаг Zero, флаг Sign и флаг четности. Это все прямые свойства результата. Но операции не являются арифметическими, поэтому Carry не является естественным свойством.

Я думаю, что ответ лежит на самом ALU. В качестве программистов мы рассматриваем ALU как многофункциональный блок. Вы даете ему значение и операцию и выполняет эту операцию на флажках установки аккумулятора в качестве побочного продукта. Внутренне мы подозреваем, что для каждой операции имеется отдельная схема: добавление, вычитание и/или xor.

На самом деле это больше похоже на многофункциональную функцию каждого бита, которая может быть изменена для выполнения желаемых операций. На высоком уровне мы видим это с добавлением vs add with carry. Внутренне единственная разница в этих инструкциях заключается в том, используется ли флаг переноса при выполнении добавления. Точно так же вычесть - это не что иное, как добавление двух дополнений к числу. Так что вычесть только имеет некоторую внешнюю замену операнда и использует ту же схему добавления.

Теперь рассмотрим, как мы делаем дополнение на одном бите. Игнорируя уведомление переноса, 0 + 0 = 1, 0 + 1 = 1 + 0 = 1 и 1 + 1 = 0. А как насчет нести? (0 + 0) = перенос (0 + 1) = перенос (1 + 0) = 0 и перенос (1 + 1) = 1.

Признать эти функции? Несущий два бита - это их И. Результатом добавления двух бит является их XOR. Если вы расширите эту идею еще немного, вы увидите, как простая схема может добавить два бита вместе с переносным вводом и создать результирующий бит и вывод переноса. Цепочка 8 из них вместе, и вы добавляете числа.

Если вы проектировали процессор, вы также можете заметить, что вы можете получить XOR почти бесплатно. XOR просто добавляет два числа вместе, но останавливает перенос от бит к бит. Подобные ярлыки могут вытащить значение AND, которое вы обычно получаете из расчета переноса, и я уверен, что есть какой-то другой трюк, чтобы найти OR там. Детали здесь очень важны, потому что дизайнеры Z-80 не использовали логики AND и XOR, но логику транзисторов с сыром, что еще более гибко в том, что она может производить из схемы.

Во всяком случае, теперь есть выбор. Наш XOR обнуляет перенос между каждым битом. Как насчет 8-го бита? Ну, извините, мы тоже должны его обнулить. В противном случае бит переноса будет символом AND знаковых битов, который, по-видимому, смущает и раздражает программистов ассемблера и не будет очень полезен. Но если мы ноль, несущий бит, как мы сделали все остальные, то у нас есть симпатичная симметричная схема, и результат ясен и однозначен. И, я подозреваю, легче обнулить значение, чем игнорировать его.

Итак, давая ноль переносить, мы сможем сэкономить несколько транзисторов. И этот побочный эффект пригодится в таких операциях, как «OR A, A» или «AND A, A», которые в противном случае не делают много. Теперь Z-80 унаследовал это поведение от 8080, поэтому на самом деле это был выбор дизайнера 8080, а не Z-80. Вы можете видеть, что они думали об этом в наборе команд, поскольку они давали нам две операции, непосредственно влияющие на перенос: SCF - установить флаг переноса в 1 и CCF - дополнять флаг переноса. Они явно избегали давать нам «четкий флаг переноса», поскольку «OR A, A» уже делает это бесплатно. Таким образом, весь бизнес сохраняет целую инструкцию. И, мы можем только предположить, они рассуждали, что обнуление флага переноса на логической операции не является большим препятствием для программирования. В большинстве случаев вы либо делаете логический расчет, либо арифметический, так что логические операции, связанные с переносом, не имеют большого значения. Очевидно, что другие разработчики процессоров не согласились, но это правильный выбор.

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

Подробную информацию см. В разделе Z-80 ALU operates internally и 8085 ALU internals.

+0

Я бы подумал, что для создания отдельного логического блока потребуется меньше транзисторов, чем для отключения/включения распространения переноса в двоичном сумматоре. Если это [hand-lookahead] (https://en.wikipedia.org/wiki/Adder_ (электроника) # Carry-lookahead_adder) сумматор, а не просто пульсация, это несколько дополнительных сигналов для отключения. Или вы можете затворить их с помощью одного транзистора для каждого сигнала, не вводя дополнительную задержку затвора в обычную работу сумматора? –

+0

Я не знаю достаточно о конструкции на уровне транзисторов, чтобы судить о выборе дизайна.Я знаю, что дизайнеры 6502 решили использовать отдельную логику для операций ALU и просто выбрать желаемый результат из всех выходов. Действительно, если бы Z-80 использовал (или нуждался) перенос пересылки, им вполне могло бы потребоваться изменить их подход. –

+0

Я должен был просто посмотреть на вашу внутреннюю ссылку Z-80 ALU, которая, кажется, отвечает на мой вопрос. Он показывает сигнал выполнения, проходящий через затвор NOR с управляющим сигналом R. Автору также предоставлен PDF-файл на основе транзисторов, но мне не очень любопытно самому разобрать ответ. Выполнение ADD с 2-мя проходами через 4-битный ALU показывает, насколько сужен бюджет транзистора, по сравнению с современными ALU. (например, почти каждый конвейерный процессор выполняет 32-разрядную ADD с задержкой в ​​1 цикл. Процессоры семейства Intel Sandybridge делают 64-битное умножение с задержкой в ​​3 цикла!) –

2

Эти 3 логические операции, применяемые к регистру A, не изменяют A (за исключением XOR, который его нулевает).

Но в качестве побочного эффекта все эти инструкции гарантируют очистку переносного бита, как указано в справочном руководстве Z80.

Этот побочный эффект - это тот эффект, который здесь нужен. OR A не будет делать ничего другого, что ясно C, а также влияют на другие флаги (в зависимости от исходного значения, равным нулю или нет, регистр Z также устанавливается/сбрасывается)

От OR instruction description:

эффекты: C и N флаги рассеялся, P/V определяет четность, ...

Карри бит устанавливается, когда добавление или через Substraction Переполнение/недорасход (ADD, SUB, ADC, SBC). Вы можете очистить флаги C, выполнив, например, нуль + ноль, но для этого потребуется больше инструкций, чем OR A, AND A или XOR A, что сделает последнее более эффективным.

Некоторые другие 8-разрядные процессоры, такие как 6502, имеют специальные инструкции CLC/SEC для очистки переноса и не нуждаются в этом побочном эффекте.

+0

. Мой вопрос во второй строке вашего ответа. Как происходит этот «побочный эффект»? –

+0

@AbdelrahmanEid, что вы подразумеваете под «как»? он просто очищает флаг – harold

+0

@harold Извините, если я не очень хорошо объясню. См. Мое редактирование, пожалуйста. –

2

перевозимый бит на Definitionem влияет, когда add или subtract инструкция (или тому подобное, inc и dec бы попасть в ту же категорию) будет занимать или перенести на следующий более высокий бит «выше» регистра.

Команды на основе ALU, которые влияют на флаги (то есть большинство, но команды LD x, y и ветвления) устанавливают или очищают бит C в соответствии с этим «заимствованием». Чистые логические (AND, OR, XOR) инструкции не занимают или несут поведение, потому что они влияют только на 8 бит в регистре и, таким образом, очищают флаг переноса.

EDIT: Если вы хотите знать, как это делается, - поскольку процессор построен таким образом, и внутренняя «проводка» заставляет бит C быть результатом логического превышения/уменьшения ALU после операция. Это не «побочный эффект», как вы, кажется, понимаете, а скорее очень важный, потому что флаги - единственный способ основать логическое решение (например, «IF» -клас ») на сборке Z80.

+0

Я понимаю, как/когда бит C установлен, мой вопрос: «Как выполнение операции над регистром (A) влияет на другой регистр (F)? –

+2

Хм. Что я не совсем понимаю, я боюсь, потому что процессор подключен так? – tofro

+0

Интересно, что вы говорите, что не можете иметь «IF» -clause, если флаг C не был очищен. 6502 не изменит флаг C на логические операции, это повлияет Z, чтобы вы знали, был ли результат равен нулю или нет, но C остался один. –

0

Большинство процессоров, созданные с помощью того, что мы называем микрокод Одна инструкции микрокода делает одну очень маленькой вещь

Таким образом, мы могли бы показать, что OR A инструкция делает что-то вроде этого:..

OR A  tmp ← A    modify register "tmp" 
     tmp ← tmp | A  apply OR and save result in "tmp" 
     A ← tmp    copy "tmp" back to A 
     F[C] ← 0    clear C flag 
     F[Z] ← A == 0  set Z to 1 if A == 0, zero otherwise 
     F[N] ← A[7]   set N to sign bit of A 

Обратите внимание, что, так как это не имеет эффект на A, они могли бы переименовать инструкцию CLC (clear carry).

Как уже упоминалось, очистка флага C была выбором, который решили дизайнеры z80. Большинство процессоров не влияют на флаг C при логической операции (AND, OR, XOR, NAND ...)

+0

Это не то, что такое микрокод. смешивая его с микрооперациями (т. е. R ISC-подобные внутренние операции, которые процессоры Intel декодируют в x86 инструкциях). Но даже микрооперации не так уж малы. 'add reg, reg' всегда декодировался до одного уровня на всех процессорах Intel, даже Pentium 4. Процессоры Core2 и Sandybridge-семейства декодировали наиболее распространенные инструкции для одного uop (в отличие от P4, где больше инструкций было множественным uops). –

+0

Эти внутренние операции, которые вы описываете *, - это все то, что схема управления должна выполнять отдельно при декодировании/выполнении инструкции, просто микрокоды или микрооперации не являются правильным именем для них. См. [Pdf-файл и таблицы инструкций для микроархива Agner Fog] (http://agner.org/optimize) и/или [рецензия Дэвида Кэнтера Sandybridge] (http://www.realworldtech.com/sandy-bridge/) для получения дополнительной информации о внутренних компонентах ЦП. –