Это был бы возможный дизайн для x86.ARM выставляет свой программный счетчик для чтения / записи как R15 .Это необычно, однако.
Это позволяет очень компактную функцию пролога / эпилога, а также возможность вставлять или извлекать несколько регистров с помощью одной инструкции: push {r5, lr}
при вводе и pop {r5, pc}
для возврата.(Записать сохраненное значение регистра ссылки в счетчик программы).
Однако это делает реализацию ARM с высоким перфорированным / неупорядоченным заказом менее удобной и была отброшена для AArch64.
Так что возможно, но использует один из регистров .32-разрядный ARM имеет 16 целочисленных регистров (включая ПК), поэтому для кодирования номера в машинном коде ARM требуется 4 бита.Другой регистр почти всегда связан как указатель стека, поэтому ARM имеет 14 целочисленных регистров общего назначения.(LR может быть сохранен в стеке, поэтому он может использоваться и используется как регистр общего назначения внутри тел функций).
Большая часть современного x86 унаследована от 8086. Он был разработан с довольно компактной переменной-кодирование длины, и только 8 регистров, требующих только 3 бита для каждого регистра src и dst в машинном коде.
В оригинальном 8086 они были не очень общего назначения, и SP-относительная адресация не 'Это возможно в 16-битном режиме, поэтому по существу 2 регистра (SP и BP) связаны для заполнения стека.Это оставляет только 6 регистров общего назначения, и если один из них будет ПК вместо общего назначения, это приведет к значительному сокращению доступных регистров, что значительно увеличит количество разливов / перезагрузок в типичном коде.
AMD64 добавил r8-r15 и режим относительной RIP-адресации.lea rsi, [rip+whatever]
и режимы относительной RIP-адресации для прямого доступа к статическим данным и константам - все, что вам нужно для эффективного независимого от позиции кода.Косвенных инструкций JMP вполне достаточно для записи в RIP.
На самом деле ничего нельзя получить, разрешив использовать произвольные инструкции для чтения или записи на ПК, поскольку вы всегда можете сделать то же самое сцелочисленный регистр и косвенный переход.Было бы почти чистым недостатком R15 для x86-64 быть таким же, как RIP, особенно для производительности архитектуры в качестве цели компилятора.(Рукописные asm странные вещи уже были очень необычной нишей к 2000 году, когда разрабатывался AMD64.)
Таким образом, AMD64 действительно впервые, когда x86, возможно, получил полностью выставленный счетчик программ, такой какARM, но было много веских причин не делать этого.