• Почему 2 раза используется команда "push ax"?

    Vindicar
    @Vindicar
    RTFM!
    Обрати внимание, что двум вызовам push ax соответствуют два вызова pop ax.
    Push сохраняет регистр на стеке, смещая вершину стека. Pop выталкивает значение с вершины стека в регистр и смещает вершину назад. Поэтому паттерн push-use-pop встречается довольно часто, если нам нужен регистр, но мы не хотим терять его предыдущее значение.
    В твоем случае этот паттерн встретился дважды, один внутри другого. Внешний сохраняет регистр при входе в подпрограмму, и восстанавливает при выходе (чтобы поменьше мешать вызывающей подпрограмме). Внутренний - сохраняет регистр AX перед пересылкой, так как мы не можем напрямую писать в ES, только через другой регистр.
    Ответ написан
    Комментировать
  • Почему 2 раза используется команда "push ax"?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Первый раз - сохранение регистров при входе в подпрограмму Out_char.
    Второй раз - сохранение регистра перед использованием его для изменения ES.
    Ответ написан
    3 комментария
  • Как найти схему дешифратора кода (instruction decoder) Intel 8080?

    @gsaw
    Вот какой то эмулятор 8080 на питоне, там в коде есть ссылки на инструкции и прочее.

    https://github.com/JetStarBlues/Intel-8080-Emulato...

    www.jk-quantized.com/blog/2018/03/16/8080-emulator
    Ответ написан
    Комментировать
  • Как найти схему дешифратора кода (instruction decoder) Intel 8080?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Для начала, 8080 это коммерческий процессор Intel. Не opensource продукт. Вполне возможно, что никто и не публиковал схемы и инструкции, которые вполне могут быть еще защищены и коммерческой тайной и патентами. Можно попробовать устроиться в компанию intel и там изучить архивные документы.

    Во-вторых пробовали просто искать?
    даже на вики есть полезные ссылки
    https://en.wikipedia.org/wiki/Intel_8080
    https://web.archive.org/web/20070928060215/http://...

    kazojc.com/elementy_czynne/IC/8080-3.pdf
    https://pastraiser.com/cpu/i8080/i8080_opcodes.html
    www-classes.usc.edu/engr/ce/108/computer.pdf
    Ответ написан
    Комментировать
  • Как процессор распознает длину команды?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как процессор может отличить длину команды (1, 2, и 3 байт), чтобы выполнить следующую команду ?

    По коду операции -- части команды, которая кодирует действие команды. В процессоре закодировано соответствие кода операции и длины команды. Код операции может полностью содержаться в первом байте команды (как в 8080), либо может быть распределён между несколькими байтами команды. В последнем случае часть кода операции находящаяся в первом байте должна отличаться от кода операции любой однобайтовой команды чтобы их можно было отличить.

    Почему кроме команды Остановить все команды занимают 3 байта?

    Если речь о 8080, то это утверждение неверно. В 8080 есть несколько однобайтовых команд (nop, битовые сдвиги и вращения, push/pop, и т.д.), несколько двухбайтовых (mvi и арифметика с непосредственными значениями -- adi, aci, и т.д.) и несколько трёхбайтовых (команды с прямой адресацией -- lda, sta, и т.д., переходы, вызовы подпрограмм и т.д.). Потому что значения, с которыми оперируют команды находятся в байтах следующих за первым -- в одном, если нужен 1-байтовый операнд и в двух если нужен 2-байтовый операнд или адрес.

    Как происходить выборка команды? Как найти логическую схему выборки команды?

    Можно посмотреть в исходники отреверсированного 8080.
    Ответ написан
    Комментировать
  • Как процессор распознает длину команды?

    begemot_sun
    @begemot_sun
    Программист в душе.
    Первый байт показывает какая это команда, или тип команды. Далее идет логика которая отрабатывает либо эту конкретную однобайтовую команду, либо осуществляет чтение следующих байт для конкретизации команды дальше. Т.о. как только процессору (с помощью дешифратора команд) становится понятно что за команда, он ей выполняет -- дает ток нужным элементам в нужном направлении.
    Ответ написан
    Комментировать
  • Как процессор распознает длину команды?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Один из вариантов написали выше - кодировать длину в отдельных битах. А можно ещё использовать префиксный код
    Ответ написан
    Комментировать
  • Как процессор распознает длину команды?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    процессор 8080 было восьмибитным.
    То есть он за один такт обрабатывал одну команду из одного байта, затем уже можно было понять как обрабатывать два последующих байта.
    Для таких вещей существует внутренний декодер.
    Раньше был просто специальный регистр (OPCODE), в который помещался первый байт инструкции и процессор декодируя его обрабатывал следующие байты уже согласно этой инструкции
    7tw6E.gif
    Ответ написан
    Комментировать
  • Как процессор распознает длину команды?

    @d-stream
    Готовые решения - не подаю, но...
    Самое простое для понимания:
    например два самых старших бита кода команды определяют ее длину
    соответственно команды
    от 0000000 до 00111111 - будут однобайтовыми
    от 0100000 до 01111111 - будут двухбайтовыми
    от 1000000 до 10111111 - будут трехбайтовыми
    от 1100000 до 11111111 - будут четырехбайтовыми

    Но это не для 8080. Просто для понимания общего смысла.

    А так - на структуре процессора видимо попадался элемент "дешифратор команд" - собственно это его задача понять по коду команды, что означают последующие байты.

    2. Однобайтных команд у 8080 больше одной. Навскидку: NOP, HALT, INT3. RET*, сдвиги, обмен между регистрами

    3. если говорить о 8080 - то удобнее и понятнее даже не логически, а схемотехнически... а так - один из источников
    Ответ написан
    1 комментарий
  • Как происходит выборка команды в процессоре?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Допустим, значение счетчика равно 0000, я должен записать байт 10h. Как я понял, команду нужно указать через пульта управления на RAM (слева). Например, указал 10h, то получается что во все 3 защелки записывается 10h (То есть 10h 10h 10h) ???

    Нет, не получается. Если значение счётчика равно 0000, то байт 10h ты запишешь только по адресу 0. А машина будет извлекать три байта по адресам 0000, 0001 и 0002 в защёлки:
    В нашем сумматоре каждая ко-
    манда занимает по 3 байта и извлекается из памяти побайто-
    во. Выборка одной команды занимает три цикла синхронизи-
    рующего сигнала, а полный командный цикл — четыре цикла
    синхронизирующего сигнала.


    А как записать команду 10h 00 00??

    Надо перейти к адресу 0001 и записать байт 00, затем к адресу 0002 и записать байт 00.
    В предыдущей главе написано, как можно программировать такую память.
    Ответ написан
    3 комментария