Как известно, чтобы правильно дизассемблировать код, нужно знать, откуда начинать это делать. Как пример приведу такой 16-битный x86-код, который мне попался под руку: Код (Text): db 0xeb,0x3a,0x90,0x43, 0x6f Если дизассемблировать с начала, то получим: Код (Text): jmp 0x3c ;0xeb, 0x3a nop ; 0x90 inc bx ; 0x43 outsw ; 0x6f А если дизассемблировать начиная с первого (не нулевого) байта, то получим: Код (Text): cmp dl, [bx+si+6f43] ; 0x3a, 0x90, 0x43, 0x6f Интересно, как можно получить код, который бы в обоих случаях делал что-то полезное? Идея в том, чтобы вызывать его то с помощью jmp start, то с помощью jmp start+1 и получать разные результаты. Проблема в том, что не могу придумать, как сделать такой код полезным. Варианты есть следующие: 1. Сделать первый байт префиксом, являющимся частью опкода (в мануале Intel это называется mandatory prefix). Но в этом случае полностью меняется только одна команда. 2. Поставить в начало двух/трех-байтовый опкод. Отсекаться тогда будет escape-бит 0x0f и опкод будет становиться однобайтовым, а все последующие коды будут декодироваться совершенно по-другому. 3. Поставить в начало инструкцию с однобайтовым опкодом и параметрами. После отсечения параметры станут опкодом или префиксом. Все инструкции можно перебрать, их меньше 256, но вот подобрать параметр, одновременно являющийся префиксом/опкодом и выполняющий свою функцию, довольно трудно. Вроде бы это все варианты, кроме префикса и опкода в начале ничего стоять и не может. Может быть кто-то уже предлагал такую идею и как-нибудь ее реализовал? Или есть у кого-нибудь идеи составления такого кода?