8085 Инструкция: JMP - Количество машинных циклов, когда условие не выполняется?

Машинный код для инструкции JMP состоит из: opcode - 11CCC010 (where CCC is the state of the flag bit used to set the condition) 8 bits и address для перехода - допустим, 16-битный адрес.

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

i - Теперь, если условие удовлетворяет: нет. необходимых машинных циклов = 1 (для выборки) + 2 (для чтения 16-битного адреса) = 3

II. если условие не выполняется: не должно быть циклов чтения (после цикла выборки), поэтому необходимое количество машинных циклов должно быть равно 1, т.е. только цикл выборки.

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

В случае возникновения путаницы с машинным циклом и тактовым циклом, пожалуйста, не стесняйтесь отвечать в любом случае.


person aste123    schedule 23.05.2014    source источник
comment
@lurker извините, но эти sildes, похоже, не имеют никакой информации о количестве тактов, необходимых для любой инструкции (не говоря уже об инструкции JMP). Он просто показывает, что делает инструкция. Прошу прощения, если я что-то упустил, но за слайд-шоу действительно трудно следить без указателя или страницы с содержанием, которые есть в большинстве других документов.   -  person aste123    schedule 23.05.2014


Ответы (1)


Хотя это нелогично для тех из нас, кто привык к 8080 или z80, проверка эта документация подтверждает ваше мнение. JC занимает два машинных цикла и семь тактов, если условие не выполняется, но требует три машинных цикла и десять тактов, если выполняется. Сравните и сопоставьте с z80, где всегда три машинных цикла и десять тактовых циклов, независимо от того, взяты они или нет.

Однако я думаю, что ваше замешательство связано с тем, что вы воображаете, что не читать адрес как-то бесплатно, но есть еще ПК для увеличения.

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

В этот момент я полагаю, что 8085 достаточно умен, чтобы, если ветвь не будет принята, он мог отказаться от чтения второго байта целевого адреса и просто снова увеличить ПК. 8080 и z80, вероятно, разрешили начать чтение второго байта и, вполне вероятно, не могут увеличивать ПК без чтения из него в целом, поэтому они выполняют это, а затем отбрасывают весь целевой адрес.

Итак, вкратце: он не ждет решения начать чтение целевого адреса; как только чтение младшего байта выполняется, оно позволяет этому закончиться. Альтернативами были бы инструкция, которая занимает больше времени, если переход выполняется, и необходимость иметь возможность выполнять двойное увеличение без чтения ПК, что, вероятно, иначе не возникнет.

Все предположения, конечно. У кого-нибудь есть настоящий 8085 и логический анализатор? Они могли бы проверить, происходит ли первый цикл доступа, даже если прыжок не был выполнен.

person Tommy    schedule 23.05.2014
comment
Извините, я не понял, что это значит that not reading the address is somehow free but there's still the PC to increment. Я не знал, что в 8085 есть конвейерная обработка. Это может объяснить, почему это на одно машинное состояние больше, чем я ожидал. - person aste123; 23.05.2014
comment
Предположим, он только что прочитал JC и решил не брать его. Затем, чтобы перейти к следующей инструкции, нужно выполнить PC' = PC + 2. Нет другого времени, нет другого места, где ПК нужно увеличивать дважды. Было бы очень маловероятно, что они смогут перенаправить ПК на ALU, поэтому, вероятно, им просто нужно будет запросить два приращения подряд. Даже если он сможет избежать каких-либо операций чтения памяти целевого адреса, вряд ли это будет иметь какой-либо эффект. - person Tommy; 23.05.2014
comment
извините, это сбивает с толку. Если в игру вступает конвейерная обработка и младший байт уже читается где-то еще, то ПК уже находится на 1 и в настоящее время указывает на байт старшего порядка (вторую часть) целевого адреса. ПК будет снова увеличиваться, когда вторая часть адреса будет прочитана/выбрана; так чтобы пропустить, что нам нужно увеличить ПК на +1 вместо +2 (надеюсь, я прав). Кроме того, в вашем недавнем комментарии вы хотите сказать, что преднамеренное (неестественным образом) увеличение ПК вызывает побочный эффект и требует дополнительных тактов? (Извините, мой первый язык не английский) - person aste123; 24.05.2014
comment
@aste123 да. Я предполагаю, что либо второй цикл связан с тем, что извлекается младшая часть адреса, либо, если он не извлекается, это связано с тем, что нет другого способа добиться двойного приращения. Они альтернативы. - person Tommy; 24.05.2014
comment
stackoverflow.com/ вопросы/23838410/ - person Patt Mehta; 24.05.2014
comment
Обратите внимание, что 6502 также будет медленнее при переходе на ветку: 2 такта, если она не выполняется, и 3 такта, если она выполняется. Кроме того, если ветвь была на двух страницах (ветвь была 2 байта, один байт в 0xFF предыдущей страницы и следующий байт в 0x00 следующей страницы), то вы потеряли еще один цикл. - person Alexis Wilke; 24.05.2014
comment
@AlexisWilke, но разве это не потому, что 6502 условных ветвления являются относительными, поэтому их использование требует арифметических затрат? - person Tommy; 24.05.2014
comment
Конечно. 8-битное целое число со знаком, добавляемое к IP после прочтения инструкции. - person Alexis Wilke; 25.05.2014