Подсчет тактов Intel 8086

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

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

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

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

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

Спасибо.

2 ответа

Решение

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

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

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

Итак, чтобы узнать, сколько cycleЭто действительно необходимо для завершения работы, вы должны принять во внимание, как wireсвязаны и где bitДолжны проходить потоки и где и сколько требуется точек синхронизации.

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

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

Вопрос довольно широкий, поэтому я остановлюсь только на 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 В этой операции советник равен 2, поскольку указатель стека должен быть увеличен до получения требуемого адреса для выполнения записи. Здесь не может быть никакого параллелизма, поэтому у вас есть 9 циклов для MOV плюс, по-видимому, два для вычисления эффективного адреса (приращение указателя стека).

Другие вопросы по тегам