Эмулятор 8-битного процессора

Рейтинг: 2Ответов: 1Опубликовано: 17.05.2023

Разбираюсь с заданием с Yayza CTF: нужно по документации написать эмулятор 8-битного процессора. Во врайтапе есть код, в котором во время выполнения инструкций JNZ и JZ Program Counter перемещается по указанному адресу с прибавлением 4, а в JMP 4 не прибавляется.

Почему нужно прибавлять и почему именно такое значение?

Фрагмент документацииРеализация на питоне

Ответы

▲ 2Принят

Во врайтапе есть код, в котором во время выполнения инструкций JNZ и JZ Program Counter перемещается по указанному адресу с прибавлением 4, а в JMP 4 не прибавляется.

Вы что-то путаете - должно быть наоборот (если речь идёт об CPU-x86). В х86-32 архитектуре, переходы бывают абсолютные, и относительные.

  1. При абсолютных, к указателю (Programm Counter) EIP прибавляется 32-битное смещение, в результате чего можно совершать прыжки вплоть до 4 ГБайт от текущего адреса. Безусловные переходы JMP и вызов функций CALL используют именно абсолютную адресацию, т.е. EIP+4 байта.

  2. Условные-же переходы JZ/JNZ всегда используют относительную адресацию, с прыжками только в диапазоне +/-128 байт от текущего значения EIP. Такие переходы кодируются всего 1 байтом со-знаком. Когда этот байт имеет положительное значение 00..7Fh, значит переход осуществляется вперёд, если-же операнд отрицательный в диапазоне 80..FFh, то соответственно EIP сместится назад.