Найти тему

Процессор не отличает данные от кода

Привет всем любителям низкого уровня. Сегодня расскажу о том, что, скорее всего, не пригодится в жизни. Но это любопытно. Для начала такой код:

.model tiny
.code
ORG 100h
begin:
MOV AH, 9
MOV DX, OFFSET Msg
INT 21h
RET
Msg DB 'Hello, World!!!$'
END begin

Ничего необычного. Просто выводим строку на экран. Подробнее об этом здесь. Однако этот код можно написать и так:

.model tiny
.code
ORG 100h
begin:
MOV AH, 9
MOV DX, OFFSET Msg
Msg DB 'Hello, World!!!$'
INT 21h
RET
END begin

При этом компиляция будет выполнена, поскольку с точки зрения синтаксиса ошибок нет. Однако при запуске программа зависнет (или отладчик будет ругаться). Почему?

Потому что процессор в данном случае будет распознавать строку Hello, World!!! как набор инструкций, а не как набор данных. В этом можно убедиться, запустив программу в отладчике:

Как видим, после команды MOV DX, OFFSET Msg откуда-то взялась команда DEC AX, потом команда DB 65h, потом INSB и так далее. Это всё команды, которых нет в коде. Однако, поскольку процессор не понимает, что строка Hello, World!!! - это данные, а не команды, то он пытается преобразовать эту строку в набор команд. Разумеется, безуспешно. Поэтому отладчик выдаст сообщение о наличии неподдерживаемой команды, а если запустить такую программу без отладчика, то она просто зависнет.

Из этого делаем вывод, уже обозначенный в начале статьи - процессор не отличает данные от кода. Он просто выполняет последовательность байтов, которые указал ему программист. Поэтому программист должен следить за тем, чтобы данные не попали в область кода, иначе процессор начнёт их выполнять.

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.