2015-04-10 10 views
2

Я работаю над эмулятором Intel 8086 уже около месяца. Я решил начать подсчет циклов, чтобы сделать эмуляцию более точной и правильно ее синхронизировать с PIT.Подсчет тактов процессора Intel 8086

Цифры, используемые для каждой инструкции, подробно описаны в User Manual, но я хотел бы знать, как они рассчитываются. Например, я вывел следующие шаги для XCHG mem8,reg8 инструкции - которая занимает ровно 17 тактовых циклов в соответствии с инструкцией:

  1. декодировать вторые байты команды: +1 цикла;
  2. Перенос первого операнда из памяти во временное место: +7 циклов;
  3. перевод второго операнда из регистра в память: +8 циклов;
  4. Перенос первого операнда из временного места в место назначения: +1 цикл.

Но я, вероятно, совершенно не прав, поскольку мои рассуждения, похоже, не работают для всех инструкций. Например, я не могу понять, почему команда PUSH reg принимает 11 тактов, тогда как команда POP reg занимает всего 8 тактов.

Итак, не могли бы вы рассказать мне, как часы цикла проводятся в каждой инструкции или, скорее, общий метод, чтобы понять, откуда эти цифры?

спасибо.

+0

@downvoter Не могли бы вы сказать, м Что было так неправильно с моим вопросом, что вы должны были опустить меня? – NeatMonster

+0

проверить "8086 крошечных" источников. они могут быть вам интересны –

+0

@AlexanderZhak Я сделал. Но 8086tiny не учитывает тактовые циклы, только инструкции. – NeatMonster

ответ

3

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

CPU является параллельно машина и хотя для программистов это дизайн, как правило, описывается в некоторых упрощающих условиях, объясняющих трубопровод или microinstructions необходимо реализовать и т.д. CPU остается параллельной машины.

Для получения инструкций необходимо выполнить много крошечных сигналов bit-size с одного конца на другой. В некоторых местах процессоры должны ждать, пока не поступят все входные данные bit. Это скоординированное движение от одного stage к другому управляется clock-signal, который отправляется централизованно ко всем многим частям. Каждое такое движение, барабанное clock-signal, называется cycle.

Так что для того, чтобы знать, сколько cycle ей действительно необходимо, чтобы закончить работу, вы должны принять во внимание то, как являются wire s связаны и где bit s должен проходить через и где и сколько необходимые точки синхронизации ,

enter image description here

Я сомневаюсь, если Intel 8086 схематичное общедоступна, и даже если бы это было, то я сомневаюсь, что это будет читаемым. Но единственный правильный ответ лежит там. Все остальное это просто упрощение и воспроизвести точное поведение аппаратных средств в программном обеспечении, вы должны имитировать/интерпретировать CPU сек аппаратные

Смотрите также:

+1

Я подумал, правильно или неправильно, что были некоторые повторяющиеся шаблоны в том, как выполняются инструкции (без учета части «выборка в очередь»). Но я думаю, что это слишком сложно для того, что я пытаюсь выполнить, поэтому я пошел дальше и реализовал циклы часов, взятые из Руководства пользователя, в [мой эмулятор] (https://github.com/NeatMonster/Intel8086/commit/ 68e2cb69bebb67e0fedf9028af6b834379220083) и, похоже, работает _okay_. Большое спасибо! – NeatMonster

1

Вопрос довольно большой, поэтому я буду обращаться только к PUSH и к вопросу POP.

PUSH - это в основном MOV из регистра в память (плюс приращение регистра). POP - это MOV из памяти для регистрации (плюс регистр).

Если посмотреть на странице 2-61 вы найдете:

MOV

регистр, память 8 + EA 1 2-4 MOV BP, STACK_TOP

памяти, регистр 9+ EA 1 2-4 MOV COUNT [DI], CX

Для POP операции, у вас уже есть указатель стека в регистр, поэтому эффективный адрес (EA) равен нулю. Вы можете немедленно выполнить команду MOV, и я могу только предположить, что специальная операция POP может уменьшить указатель стека одновременно, где-то в более поздних тактах цикла операции чтения, как только адрес больше не нужен.

Для операции PUSH у вас есть EA 2, так как указатель стека должен быть увеличен до получения требуемого адреса для выполнения записи. Здесь не может быть параллелизма, поэтому у вас есть 9 циклов для MOV плюс, по-видимому, два для эффективного вычисления адреса (приращение указателя стека).

+0

, говоря о 'mov' only, reg to mem занимает один цикл больше, чем mem to reg (из цитаты, которую вы дали) на 8086: 9 + EA против 8 + EA, но на 286 mem to reg занимает два цикла больше, чем reg mem (5 против 3). Сначала я думал, что запись в память медленнее, чем чтение. но это не имеет смысла для 286 ... пропавших прочитанных спецификаций ... –

+0

снова для 386 записи в память на два часа быстрее, чем чтение из него –

+0

@AlexanderZhak Что могло бы объяснить эту разницу между чтением и записью на 8086? Был ли я на правильном пути с разбивкой по тактику «XCHG»? – NeatMonster