Прежде всего необходимо различать архитектуры RISC и CISC .
В архитектуре RISC у вас обычно есть инструкции одинакового размера, поэтому двусмысленность не может быть представлена. Ваш ЦП будет получать, например, 4 байта для каждой инструкции, и, поскольку он должен будет начинать откуда-то (у вашего ЦП нет последовательности, подобной той, которую вы представили, у него наверняка будет начальная точка), как только он получит При правильном выравнивании никаких проблем возникнуть не может.
То, что происходит с набором команд CISC, по сути то же самое: начиная с точки входа в программу, оно будет извлекать инструкции в соответствии с вашими кодами операций. Ему не нужно знать, как математически различать неоднозначности, поскольку не случится так, что он просто не знает, как долго длится следующая инструкция или где завершена последняя.
Поэтому спрашивать, как отделить каждую инструкцию, все равно, что спрашивать, как отделить каждое слово в
thepenisonthetable
Нет математического доказательства, но вы знаете, какие буквы правильны вместе, а какие не имеют смысла. Предыдущее предложение содержит «сын», но вы знаете, что оно получено из «включен». Вы не сможете сказать это, не имея значащей фразы, но ваш процессор выполняет только значимые программы, в чем смысл?
Так что, если процессор может работать с предыдущим предложением, он найдет первую содержательную инструкцию «the», затем «pen», «is», «on», и «son» никогда не сможет быть распознан в любом случае.
EDIT
Для очистки в архитектурах CISC единственным ограничением, которое вы должны быть уверены, чтобы не было двусмысленности, является недопущение наличия инструкции, которая является префиксом другой. Давайте предположим, что конечный алфавит состоит из букв a-z вместо шестнадцатеричных чисел (только для практических целей).
Если счетчик программы указывает на
abbcbcaabdeffabd
вы можете иметь, что abb
- это целая инструкция. В этом случае ab
не будет действительной инструкцией, иначе процессор не сможет знать, где остановиться, в то же время abbc
тоже не может быть инструкцией, или это может создать проблемы. Если оставить его, например, ca
- следующая инструкция, c
- и cbc
.
Вы можете распространить эту аргументацию на всю строку. Вы увидите, что, если ЦП находится в состоянии, в котором следующий байт двоичного кода указывает на ПЕРВЫЙ байт инструкции, и нет инструкции, которая является префиксом другой инструкции, то в следующем состоянии счетчик программы будет указывать на ПЕРВЫЙ байт следующей правильной инструкции.