Мне как человеку который начал занимается относительно недавно,вообще не понятно что такое эмуляция,почитал википедию,как написано в википедии это копирование вычислительной системы,то есть если я напишу программу которая исполняет ассемблерную команду MOV EAX,700 ,это будет эмуляцией ?
Эмулятор(вирт машина) реализует состояние(task state) с изоляцией эмулируемого состояния. Куда сложнее дать определение интерпретации(байткод вм), тащит taint.
цитата из википедии https://ru.wikipedia.org/wiki/Эмуляция если исходить из этого определения,программа содержащая алгоритм,который эквивалентен ассемблерной инструкции MOV EAX,700 это будет эмуляция,так что всё правильно
Не совсем. Чтобы это стало эмуляцией программе нужен еще и код нахождения необходимости исполнения этой инструкции. И вот тогда это будет уже частичной эмуляцией. А чтобы полностью что-то эмулировать надо создавать код для всего набора переменных состояний всей эмулируемой системы. Это значит, что надо делать не только регистр EAX, а весь набор RIP,RAX-R15,EFL,ST0-ST7,FCW,FSW,MM0-MM7,XMM0-XMM31 и т.д. и всех команд. Но это только процессор. Надо еще эмулировать работу GPU, клавиатуры, мыши, сетевой карты и портов ВВ.
Возможно бред собачий: Код (C): // Это "виртуальный процессор" struct CPU { int EAX; // Регистр EAX int EBX; int ECX; // ... и все остальные регистры }; struct CPU my_emulated_cpu; // Функция, которая "эмулирует" одну команду void emulate_command(int command_code) { if (command_code == COMMAND_MOV_EAX_700) { my_emulated_cpu.EAX = 700; // эмуляция printf("Эмуляция: MOV EAX, 700 выполнена. EAX = %d\n", my_emulated_cpu.EAX); } } --- Сообщение объединено, 15 фев 2026 --- https://wiki.qemu.org/Documentation/TCG/frontend-ops
Не должен. Он должен найти код соответствующей инструкции в потоке команд перед тем как выполнить подобную операцию (MOV EAX, 700 только когда в потоке команд встретится B8 BC 02 00 00). ADD: После выполнения этой операции поток команд должен быть пропущен ровно на количество байт в коде этой инструкции, чтобы перейти к следующей. Точно так же и после инструкции JMP не надо пропускать инструкцию т.к. новый адрес инструкции уже готов в указателе команды после этой операции. ADD2: По сути эмуляции это программный цикл, который исполняет оборудование. Т.е. ЦП точно так же выбирает инструкцию за инструкцией и выполняет их. Вот именно это и будет подразумевать эмуляция в первом приближении. Дальше надо будет сделать еще математику преобразования адресов эмулируемого ЦП на хост память и т.д. для всей эмулируемой системы. --- Сообщение объединено, 21 фев 2026 --- Вообще полный код будет примерно такой: Код (Text): NextOpcode: MOV EAX, [CPU.REGS.EIP] CMP BYTE [EAX], 0B8h JNZ UnderConstructionOpcodes MOV EDX, DWORD [EAX + 1] ADD EAX, 5 MOV [CPU.REGS.EAX], EDX MOV [CPU.REGS.EIP], EAX JMP NextOpcode UnderConstructionOpcodes: HLT JMP UnderConstructionOpcodes
MaKsIm, не обижайтесь, если что, но хотел полюбопытствовать. Это ваши мысли или вы их у ИИ одолжили? Я почему спрашиваю? С ИИ ведь, это как игра в рулетку - иногда очень точно попадает в цель, а чаще может с умным видом академика, нести полный бред и утверждать, что в его ответе нет ошибки.
MaKsIm, получается что нужно декодировать инструкцию --- Сообщение объединено, 22 фев 2026 --- MaKsIm, то есть по опкоду инструкции понять что нужно делать,например помещать значение а регистр
Всегда недоумевал, почему не собрать всем васмом опенсорнсный эмулятор на c, чтобы мог декодировать код. Это офигенный способ понять, как работают компьютеры на низком уровне. Именно Си/ассемблер, а не чистый асм. С памятью, регистрами и т.д. С указателем на текущую инструкцию в памяти. С современными возможностями это не реально?
CaptainObvious Быстрый табличный эмуль, на целевом ISA(eg: div -> vm(div), как у аверов, bdshemu сырое-кривое). Тогда можно не использовать rX-память, меньше палева
Как-то же такие эмуляторы работают. Сделать в виде набора вкладок. --- Сообщение объединено, 22 фев 2026 ---
Ahimov, спасибо за ссылку на bddisasm. Штука любопытная, но сложноватая зараза. А в чужом коде - то ещё удовольствие разбираться. Что в эмуляторе, что в дизассемблере - где 5000 строк кода, где 3500. Ну в принципе разобраться можно. В Visual Studio все прекрасно компилируется. Я только ещё не до конца понял, как там код Питона запускать и главное с чем? Нужно, правда, как там выше предлагали, что-нибудь своё, учебное разработать на базе, скажем, пяти инструкций. Так потихоньку, помаленьку - глядишь и свой WASM'кий визор разработаем.
GRAFik Код (Text): ViJCC: mov eax,D[eax][2] ; disp32 add eax,[esi].Control.rEip add eax,6 ; flow mov edx,[ebx].Ia.Opcode sub edx,80H : CC ViCC: push eax invoke DiIsCC, Edx, [Esi].Control.rEFlags ; CC & state{}.EFlags pop eax .if Zero? mov eax,[ebx].Ia.S1ze ; skip add eax,[esi].Control.rEip ; state{}.Eip .endif ret
Вообще эмуляция это комплексный процесс. Декодирование опкодов инструкций и выполнение подобных им команд только часть связанная с ЦП. Сама по себе эмуляция подразумевает, что будет воспроизводиться не только работа ЦП, но и всех остальных сопутствующих устройств. Таким образом программа попавшая в эмулятор не должна отличать свое исполнение от исполнения на реальном железе.
MaKsIm, то есть получается так,эмуляция это программное воспроизведение принципов работы физического устройства,с максимальной точностью
Так точно. Именно это и было написано еще в ответе #2 у Ahimov, Я лишь вам попытался донести тоже, но без специальной терминологии. Некоторые старички пользуются краткими определениями, которые зачастую не понятны по смыслу для новичков. --- Сообщение объединено, 24 фев 2026 --- Вообще, скажем, у вас есть PS1/SNES/NES или другая консоль. Вы можете запустить эмулятор этой консоли на ПК и игры к ним (может со скрипом), но запустятся. При этом ЦП этой консоли может отличаться от ЦП на ПК. Вот эмуляция дешифрует поток команд игры для консоли и создает на ПК среду для исполнения программы. Таким образом программа думает, что работает на PS1, а вместо этого вы играете в игру на ПК. Получается что от программы изолирована реальная среда и создана подходящая для её работы программно.