Как компьютер различает данные и инструкции?
Я смотрел видео на 8-битном ПК, на котором запитывали программу - вручную, используя физические переключатели.
Сытая программа была:
MAIN:
0000 0001 0100 # 0 = LDA [4]
0001 0010 0101 # 1 = ADD [5]
0010 0101 0000 # 2 = OUT
0011 1111 0000 # 3 = HLT
DATA:
0100 00001110 # 4 = #14
0101 00011100 # 5 = #28
Я хочу знать, как компьютер, если он это делает, различает данные и инструкции, потому что нет никаких флагов, которые отделяют данные от инструкций.
0001 0001 0010 может интерпретироваться как:
1 = LDA [2]
или же:
1 = #10
Это потому, что во время работы программы адреса обрабатываются как инструкции. но из-за HLT программа прекращает выполнение адресов памяти, как если бы они были инструкциями, и оставляет более высокие адреса; а затем LDA / ADD / SUB и т. д. обрабатывают все места в памяти как двоичные значения.
В этом случае:
0000 0010 0000 интерпретируется как:
0 = ADD #32
и не
0 = ADD [ ADD [ ADD [ ADD ...]]]
** Во время написания этого вопроса я понял, что нового происходит по мере продвижения
лучший пример:
Если остановки не было, будет ли программа работать нормально, но затем продолжайте переходить к данным и интерпретируйте как:
0010 0000 1110 # 4 = NOP [14]
0101 0001 1100 # 5 = LDA [12]
Если это так, произойдет ли сбой компьютера 1: потому что NOP дан операнд, а 2: потому что адреса памяти 12 и 14 не определены.
1 ответ
Вы находитесь на грани важного осознания: данные не имеют смысла без метаданных - чтобы понять смысл данной последовательности битов, необходимо иметь некоторое "знание" о том, как эти биты должны интерпретироваться.
Что касается инструкций, то набор команд ЦП определяет размер каждой инструкции и сопровождающих ее данных. Каждая инструкция начинается с кода операции, а следующие данные обычно имеют фиксированный размер (размер зависит от кода операции). Каждая инструкция выполняется по порядку (пока не встретится команда перехода), начиная с некоторого начального адреса, который встроен в ЦП.
Так что, если начальный адрес окажется адресом MAIN
метка, первый код операции, который увидит процессор, будет 0000 0001
и поэтому он будет знать, что это LDA
за инструкцией, за которой он знает, должно следовать четырехбитное число. Все, что следует за этими четырьмя битами, является следующей инструкцией.
Что произойдет, если позже будет выполнена неверная инструкция перехода, отправив процессор в третью группу битов в вашем примере? (Исходя из вашего примера, я предполагаю, что процессор работает с четырехбитными "байтами".) Тогда действительно, процессор будет ошибаться 0100 0001
для кода операции и некоторого числа следующих битов в качестве данных для этого кода операции, и, скорее всего, все пойдет не так.
В компьютерных системах адрес инструкции поступает с ПК (счетчик программ), а адрес данных - не с ПК. Вот как они различаются.