Найти в Дзене

OFFSET в Ассемблере

В переводе с английского “offset” - это смещение. Допустим, у нас есть такая программка:

Когда ассемблер доходит до строки 06, он заменяет offset Hello на адрес (смещение) строки, с которой связано имя Hello. В итоге в регистре DX будет нечто вроде этого:

-2

В нашем примере смещение от начала программы равно 0108h. Это число и будет записано в DX.

Если бы мы забыли использовать оператор offset и сделали так:

MOV DX, WORD PTR Hello

то в регистре DX оказался бы не адрес строки, а первые её два байта, то есть буквы He.

-3

Таким образом в регистре DX у нас число 6548h - коды первых двух букв слова Hello.

Почему байты поменялись местами (ведь код английской буквы H - 48h, а буквы е - 65h), надеюсь, вы знаете. Ну а если не знаете, то кратко - у процессоров Интел байты в слове имеют обратный порядок. То есть младший байт (который справа) является как бы первым, а старший - вторым. Поэтому, хотя в памяти, где записана строка, последовательность байтов правильная, при записи слова из памяти в регистр байты этого слова переворачиваются (меняются местами).

Кроме того, выполнение прерывания 21h, скорее всего, привело бы к ошибке, поскольку весьма вероятно, что число, которое мы поместили в DX вместо адреса и которое ассемблер воспринимает как адрес, находился бы за пределами текущего сегмента.

А поскольку у нас СОМ-программа, то вся она должна умещаться в один сегмент и выходить за его пределы мы не должны. Кстати, по этой же причине мы ничего не помещаем в сегментный регистр DS, так как в случае СОМ-программой при её загрузке в память все сегментные регистры принимают значения сегмента, в который загрузилась наша программа.

На этом всё. Надеюсь, погружение в старый добрый 16-разрядный мир “досовских” ассемблерных программ было для вас приятным (ну во всяком случае для тех, кто это помнит))).

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