Озадачился было созданием многоразрядного pic кода, работающего по-разному в зависимости от разрядности (диспетчеризация). Поиск дал вариант от
Arkon и способ от товарища PROFi, кажется. Сорцы были безжалостно рипнуты, и объединены. Получился код, выполняющийся в 16, 32, 64 битном режимах по-разному.
loc_entry:
use32
xor eax, eax
inc eax
nop
jz x86_64_code
; 16 bit or 32 bit code
x86_16_32_code:
use16
mov ax, 0x29a
jmp short x86_16_code
jmp x86_32_code
x86_16_code:
use16
ret
x86_32_code:
use32
nop
ret
; x64 code
x86_64_code:
use64
nop
ret
Пояснения интересных мест:
inc eax
; выполняется подобно в 16, 32 битном коде. В 64 битном байт 0x40 идёт как префикс к следующему нопу, и трактуется с ним как одна команда. Поэтому, zf будет взведён только для x64.
mov ax, 0x29a
;в 16 битном выполняется как есть. В 32 битном вторая команда поглощается первой, и будет здесь mov eax, 0x2eb029a вместо их двух, поэтому перехода на 16 битный код нет, а есть дальше только на 32 битный.
В данном коде нет нулей, так что может использоваться как шеллкод.