Что такое эмуляция ?

Тема в разделе "WASM.RESEARCH", создана пользователем Entropy, 15 фев 2026.

  1. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    255
    Мне как человеку который начал занимается относительно недавно,вообще не понятно что такое эмуляция,почитал википедию,как написано в википедии это копирование вычислительной системы,то есть если я напишу программу которая исполняет ассемблерную команду MOV EAX,700 ,это будет эмуляцией ?
     
  2. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    483
    Эмулятор(вирт машина) реализует состояние(task state) с изоляцией эмулируемого состояния.

    Куда сложнее дать определение интерпретации(байткод вм), тащит taint.
     
  3. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    255
    цитата из википедии https://ru.wikipedia.org/wiki/Эмуляция
    если исходить из этого определения,программа содержащая алгоритм,который эквивалентен ассемблерной инструкции MOV EAX,700 это будет эмуляция,так что всё правильно
     
  4. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    223
    Не совсем. Чтобы это стало эмуляцией программе нужен еще и код нахождения необходимости исполнения этой инструкции. И вот тогда это будет уже частичной эмуляцией. А чтобы полностью что-то эмулировать надо создавать код для всего набора переменных состояний всей эмулируемой системы. Это значит, что надо делать не только регистр EAX, а весь набор RIP,RAX-R15,EFL,ST0-ST7,FCW,FSW,MM0-MM7,XMM0-XMM31 и т.д. и всех команд. Но это только процессор. Надо еще эмулировать работу GPU, клавиатуры, мыши, сетевой карты и портов ВВ.
     
  5. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    15 окт 2022
    Сообщения:
    155
    Возможно бред собачий:
    Код (C):
    1. // Это  "виртуальный процессор"
    2. struct CPU {
    3.     int EAX; // Регистр EAX
    4.     int EBX;
    5.     int ECX;
    6.     // ... и все остальные регистры
    7. };
    8.  
    9. struct CPU my_emulated_cpu;
    10.  
    11. // Функция, которая "эмулирует" одну команду
    12. void emulate_command(int command_code) {
    13.     if (command_code == COMMAND_MOV_EAX_700) {
    14.         my_emulated_cpu.EAX = 700; // эмуляция
    15.         printf("Эмуляция: MOV EAX, 700 выполнена. EAX = %d\n", my_emulated_cpu.EAX);
    16.     }
    17. }
    --- Сообщение объединено, 15 фев 2026 ---
    https://wiki.qemu.org/Documentation/TCG/frontend-ops
     
  6. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    483
    Не поленился заскринил.
     

    Вложения:

    • vm.png
      vm.png
      Размер файла:
      953,7 КБ
      Просмотров:
      97
  7. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    255
    то есть алгоритм должен установить зачем вообще в регистр помещать непосредственное значение ?
     
  8. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    223
    Не должен. Он должен найти код соответствующей инструкции в потоке команд перед тем как выполнить подобную операцию (MOV EAX, 700 только когда в потоке команд встретится B8 BC 02 00 00).

    ADD: После выполнения этой операции поток команд должен быть пропущен ровно на количество байт в коде этой инструкции, чтобы перейти к следующей. Точно так же и после инструкции JMP не надо пропускать инструкцию т.к. новый адрес инструкции уже готов в указателе команды после этой операции.

    ADD2: По сути эмуляции это программный цикл, который исполняет оборудование. Т.е. ЦП точно так же выбирает инструкцию за инструкцией и выполняет их. Вот именно это и будет подразумевать эмуляция в первом приближении. Дальше надо будет сделать еще математику преобразования адресов эмулируемого ЦП на хост память и т.д. для всей эмулируемой системы.
    --- Сообщение объединено, 21 фев 2026 ---
    Вообще полный код будет примерно такой:
    Код (Text):
    1. NextOpcode:
    2. MOV EAX, [CPU.REGS.EIP]
    3. CMP BYTE [EAX], 0B8h
    4. JNZ UnderConstructionOpcodes
    5. MOV EDX, DWORD [EAX + 1]
    6. ADD EAX, 5
    7. MOV [CPU.REGS.EAX], EDX
    8. MOV [CPU.REGS.EIP], EAX
    9. JMP NextOpcode
    10. UnderConstructionOpcodes:
    11. HLT
    12. JMP UnderConstructionOpcodes
     
    Последнее редактирование: 21 фев 2026
  9. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    400
    MaKsIm, не обижайтесь, если что, но хотел полюбопытствовать. Это ваши мысли или вы их у ИИ одолжили? Я почему спрашиваю? С ИИ ведь, это как игра в рулетку - иногда очень точно попадает в цель, а чаще может с умным видом академика, нести полный бред и утверждать, что в его ответе нет ошибки. :)
     
  10. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    255
    MaKsIm, получается что нужно декодировать инструкцию
    --- Сообщение объединено, 22 фев 2026 ---
    MaKsIm, то есть по опкоду инструкции понять что нужно делать,например помещать значение а регистр
     
  11. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    370
    Entropy, я так же както задавалса этим вопросом на васме
     
  12. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    105
    Всегда недоумевал, почему не собрать всем васмом опенсорнсный эмулятор на c, чтобы мог декодировать код.
    Это офигенный способ понять, как работают компьютеры на низком уровне. Именно Си/ассемблер, а не чистый асм.
    С памятью, регистрами и т.д. С указателем на текущую инструкцию в памяти. С современными возможностями это не реально?
     
  13. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    483
    CaptainObvious

    Быстрый табличный эмуль, на целевом ISA(eg: div -> vm(div), как у аверов, bdshemu сырое-кривое). Тогда можно не использовать rX-память, меньше палева :preved:
     
  14. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    15 окт 2022
    Сообщения:
    155
    Как-то же такие эмуляторы работают. Сделать в виде набора вкладок.
    --- Сообщение объединено, 22 фев 2026 ---
    2026-02-22_17-48-49.png
     

    Вложения:

    • Tracing.rar
      Размер файла:
      194 КБ
      Просмотров:
      59
  15. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    400
    Ahimov, спасибо за ссылку на bddisasm. Штука любопытная, но сложноватая зараза. :) А в чужом коде - то ещё удовольствие разбираться. Что в эмуляторе, что в дизассемблере - где 5000 строк кода, где 3500. Ну в принципе разобраться можно. В Visual Studio все прекрасно компилируется. Я только ещё не до конца понял, как там код Питона запускать и главное с чем?

    Нужно, правда, как там выше предлагали, что-нибудь своё, учебное разработать на базе, скажем, пяти инструкций. Так потихоньку, помаленьку - глядишь и свой WASM'кий визор разработаем. :)
     
    Последнее редактирование: 23 фев 2026
  16. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    483
    GRAFik

    Код (Text):
    1. ViJCC:
    2.     mov eax,D[eax][2]   ; disp32
    3.     add eax,[esi].Control.rEip
    4.     add eax,6   ; flow
    5.     mov edx,[ebx].Ia.Opcode
    6.     sub edx,80H   : CC
    7. ViCC:
    8.     push eax
    9.     invoke DiIsCC, Edx, [Esi].Control.rEFlags   ; CC & state{}.EFlags
    10.     pop eax
    11.     .if Zero?
    12.         mov eax,[ebx].Ia.S1ze   ; skip
    13.         add eax,[esi].Control.rEip   ; state{}.Eip
    14.     .endif
    15.     ret
     
  17. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    255
    так всё же мои догадки по поводу эмуляции верны ?
     
  18. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    223
    Вообще эмуляция это комплексный процесс. Декодирование опкодов инструкций и выполнение подобных им команд только часть связанная с ЦП. Сама по себе эмуляция подразумевает, что будет воспроизводиться не только работа ЦП, но и всех остальных сопутствующих устройств. Таким образом программа попавшая в эмулятор не должна отличать свое исполнение от исполнения на реальном железе.
     
  19. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    255
    MaKsIm, то есть получается так,эмуляция это программное воспроизведение принципов работы физического устройства,с максимальной точностью
     
  20. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    223
    Так точно. Именно это и было написано еще в ответе #2 у Ahimov, Я лишь вам попытался донести тоже, но без специальной терминологии. Некоторые старички пользуются краткими определениями, которые зачастую не понятны по смыслу для новичков.
    --- Сообщение объединено, 24 фев 2026 ---
    Вообще, скажем, у вас есть PS1/SNES/NES или другая консоль. Вы можете запустить эмулятор этой консоли на ПК и игры к ним (может со скрипом), но запустятся. При этом ЦП этой консоли может отличаться от ЦП на ПК. Вот эмуляция дешифрует поток команд игры для консоли и создает на ПК среду для исполнения программы. Таким образом программа думает, что работает на PS1, а вместо этого вы играете в игру на ПК. Получается что от программы изолирована реальная среда и создана подходящая для её работы программно.
     
    Последнее редактирование: 24 фев 2026