Главная /
Ассемблер /
Для чайников /
Введение в Ассемблер /
Оператор OFFSET
|
Лучшие книги по Ассемблеру
Сделал подборку не новых, но проверенных книг по программированию на языке ассемблера. Если вы также как и я любите погружаться на низкий уровень, в те закоулки мира программирования, куда не всем путь открыт, то посмотрите. Возможно, что-то вам понравится.
Подробнее...
|
OFF SET можно перевести как “вне набора”. Применительно к языку ассемблера ещё более вольный перевод может звучать так: за пределами набора команд. Почему этот оператор назвали именно так, поймёте, прочитав эту статью. Ну а вообще слово OFFSET переводится как “смещение”. И это, конечно, настоящий перевод. Но я позволил себе немного пофилософствовать )))
Оператор OFFSET возвращает адрес (смещение) некоторой метки данных относительно начала сегмента. Под смещением здесь понимается то количество байтов, которое отделяет метку данных от начала сегмента.
В защищённом режиме работы процессора смещения всегда являются 32-разрядными числами без знака. В реальном и виртуальном режимах адресации смещения всегда 16-разрядные.
С помощью оператора OFFSET в ассемблере можно объявлять переменные, то есть связывать адрес в
памяти с именем переменной. По этой ссылке вы найдёте пример объявления строки. Но переменные могут быть, разумеется, не только строковыми.
Пример:
.model tiny
.code
ORG 100h
start:
MOV AX, wVar ; AX = 65535
MOV DX, OFFSET wVar ; DX = 107
RET
wVar DD 65535 ; Объявляем переменную типа WORD
END start
Здесь мы объявили переменную wVar
и назначили сразу ей какой-то значение (в нашем случае 65535).
В программе мы записали ЗНАЧЕНИЕ этой переменной в регистр АХ. А вот потом, с помощью оператора OFFSET,
мы получаем адрес (смещение) переменной wVar
, относительно начала сегмена (в нашем случае это 100h).
И в нашем случае смещение будет равно 107 в шестнадцатеричной системе, потому что:
- Сегмент начинается с адреса 100h (
ORG 100h
)
- Команда
MOV AX, wVar
занимает 3 байта с адресами: 100h, 101h, 102h
- Команда
MOV DX, OFFSET wVar
занимает следующие 3 байта с адресами: 103h, 104h, 105h
- Команда
RET
занимает 1 байт по адресу: 106h
Ну и получается, что наша переменная wVar
находится по адресу 107h.
Таким вот нехитрым образом можно получить адрес первого байта любой объявленной переменной. Соответственно, чтобы получить адрес следующего байта, надо просто прибавить 1 к смещению. Это обычно используется при работе со строками, когда надо получить отдельный символ строки. Пример:
.model tiny
.code
ORG 100h
start:
MOV AH, 09h ;Номер функции 09h
MOV DX, OFFSET stroka+7 ;Адрес строки записываем в DX
INT 21h
RET
stroka DB 'Hello, World!!!$' ;Строка для вывода
END start
END start
Здесь мы выводим не всю строку, а начиная с 8-го символа, потому что к смещению адреса переменной stroka
мы прибавили 7. Но прибавили мы 7, а не 8, потому что адресация начинается с нуля, а не с единицы. Таким образом на экран будет выведено:
World!!!
то есть только нужная нам часть строки.
На этом пока всё. Подключайтесь к группе Основы программирования в Телеграм, или к другим каналам (ссылки ниже), чтобы ничего не пропустить.
|
Первые шаги в программирование
Главный вопрос начинающего программиста – с чего начать? Вроде бы есть желание, но иногда «не знаешь, как начать думать, чтобы до такого додуматься».
У человека, который никогда не имел дело с информационными технологиями, даже простые вопросы могут вызвать большие трудности и отнять много времени на решение.
Подробнее...
|