Эмулятор 8-битного процессора
Разбираюсь с заданием с Yayza CTF: нужно по документации написать эмулятор 8-битного процессора. Во врайтапе есть код, в котором во время выполнения инструкций JNZ и JZ Program Counter перемещается по указанному адресу с прибавлением 4, а в JMP 4 не прибавляется.
Почему нужно прибавлять и почему именно такое значение?
Ответы (1 шт):
Во врайтапе есть код, в котором во время выполнения инструкций JNZ и JZ Program Counter перемещается по указанному адресу с прибавлением 4, а в JMP 4 не прибавляется.
Вы что-то путаете - должно быть наоборот (если речь идёт об CPU-x86). В х86-32 архитектуре, переходы бывают абсолютные, и относительные.
При абсолютных, к указателю (Programm Counter)
EIPприбавляется 32-битное смещение, в результате чего можно совершать прыжки вплоть до 4 ГБайт от текущего адреса. Безусловные переходыJMPи вызов функцийCALLиспользуют именно абсолютную адресацию, т.е.EIP+4байта.Условные-же переходы
JZ/JNZвсегда используют относительную адресацию, с прыжками только в диапазоне +/-128 байт от текущего значенияEIP. Такие переходы кодируются всего 1 байтом со-знаком. Когда этот байт имеет положительное значение00..7Fh, значит переход осуществляется вперёд, если-же операнд отрицательный в диапазоне80..FFh, то соответственноEIPсместится назад.

