Оператор OFFSET
Возвращает смещение в соответствующий сегмент выражения.
Синтаксис
См. также
Дополнительные ресурсы
Значок отказа согласно Закону Калифорнии о защите конфиденциальности потребителей (CCPA)
- Светлая
- Темная
- Высокая контрастность
- Предыдущие версии
- Блог
- Участие в доработке
- Конфиденциальность
- Условия использования
- Товарные знаки
- © Microsoft 2024
Дополнительные ресурсы
Значок отказа согласно Закону Калифорнии о защите конфиденциальности потребителей (CCPA)
- Светлая
- Темная
- Высокая контрастность
- Предыдущие версии
- Блог
- Участие в доработке
- Конфиденциальность
- Условия использования
- Товарные знаки
- © Microsoft 2024
Смещение (информатика) — Offset (computer science)
В информатике смещение смещение в массиве или другом объекте структуры данных представляет собой целое число, указывающее расстояние (перемещение) между началом th объект и данный элемент или точка, предположительно внутри одного объекта. Концепция расстояния действительна, только если все элементы объекта имеют одинаковый размер (обычно задаются в байтах или словах ).
Например, в A как массив символов, содержащий «abcdef» , четвертый элемент, содержащий символ ‘d ‘ имеет смещение на три от начала A .
В языке ассемблера
В компьютерной инженерии и низкоуровневом программировании (например, язык ассемблера ), смещение смещение обычно обозначает количество ячеек адреса, добавленных к базовому адресу, чтобы перейти к конкретному абсолютному адресу. В этом (исходном) значении смещения для указания размера смещения используется только базовая адресная единица, обычно 8-битный байт. В этом контексте смещение иногда называют относительным адресом .
В предыдущем примере описывается косвенное способ обращения к ячейке памяти в формате сегмент: смещение. Например, предположим, что мы хотим обратиться к ячейке памяти 0xF867. Один из способов сделать это — сначала определить сегмент с начальным адресом 0xF000, а затем определить смещение 0x0867. Кроме того, нам также разрешено сдвигать шестнадцатеричный сегмент, чтобы достичь окончательного абсолютного адреса памяти. Здесь следует отметить, что мы можем достичь нашего окончательного абсолютного адреса разными способами.
Что такое offset и как обратиться к информации что хранится в нём?
У меня имеется оффсет: 0x0264FEF8 по которому (или в котором) должен храниться массив всех возможных цветов главного меню тестового ПО.
К примеру, цветом заднего плана меню установлен белый, он хранится под номер «0», но я хочу поставить зеленый, а он хранится под номером «3».
Каким образом получить доступ к этому массиву имея «оффсет» и руками выбрать приемлемый цвет, а также что такое offset и с чем его «едят»?
- Вопрос задан более двух лет назад
- 1924 просмотра
1 комментарий
Простой 1 комментарий

Василий Дёмин @includedlibrary
Откуда у вас такое условие, скиньте его целиком. Пока что я понимаю это так, что по адресу 0x0264FEF8 находится массив цветов. Чтобы извлечь нужный цвет, нужно сначала вычислить его адрес, а потом разыменовать указатель:
color_t c = *(0x0264FEF8 + i*sizeof(color_t));
Но вообще странно, сейчас бинарники на c/c++ обычно position independent, поэтому заранее адрес предсказать нельзя.
Решения вопроса 0
Ответы на вопрос 4

Участник OpenStreetMap
0x0264FEF8 + (размер элемента цвета) * (индекс цвета)
Ответ написан более двух лет назад
Комментировать
Нравится 1 Комментировать

Еда — это святое
Для начала разобраться, смещение в чём и относительно чего
Ответ написан более двух лет назад
Комментировать
Нравится Комментировать
Developer, ex-admin
offset — смещение (от какого-то базового адреса).
Т.е. адрес вашего объекта вычисляется так: base address + offset.
Осталось узнать базовый адрес и можно работать с цветами.
Ответ написан более двух лет назад
Комментировать
Нравится Комментировать
Делай добро и бросай его в воду.
Что такое offset?
«offset» — в данном контексте это адрес массива в памяти.
Теоретически элементы в этом «массиве» не обязаны храниться в памяти аналогичному тому, как это происходит в C++, потому что в Lua любой «массив» — это на самом деле хеш-таблица, и может содержать элементы разных типов.
Как обратиться к информации, что хранится в нём?
Зависит от того, чем именно вы хотите обратиться, какие у вас средства. Например, если Lua встроен в ваше же собственное приложение, из которого вы и хотите получит доступ, то лучше делать это средствами API самого Луа, то есть вынимать нужный элемент из таблицы и получать его на блюдечке.
Если же вы хотите прочитать память другого процесса, то по сути это взлом и универсальных рецептов здесь не может быть.
Можете изучить память того приложения каким-нибудь образом, можно теми же утилитами для читов в играх — ArtMoney или более серьёзный аналог CheatEngine. Изменяя цвет в самом приложении, ищите его в памяти, пока не найдёте точный адрес. А дальше смотрите, как он устроен, от чего зависит и т.д.
Precious C++
Проясним момент насчет различия операторов ADDR и OFFSET в программах, написанных на Ассемблере.
Первоочередное назначение данных операторов — это получение адреса переменной в памяти.
В программах на ассемблере могут присутствовать как локальные так и глобальные переменные.
Глобальные переменные существуют в памяти на протяжении всего времени выполнения программы, локальные — только во время выполнения процедуры, в которой они определены, и удаляются как только она завершит работу. Поэтому адреса глобальных переменных известны уже на стадии ассемблирования, тогда как адреса локальных переменных в стеке станут известны только во время выполнения программы, а точнее при выполнении процедуры, в которой эти переменные объявлены.
Что касается операторов, то OFFSET вычисляет адрес уже размещенных к началу выполнения программы переменных, а это значит что данный оператор можно использовать для вычисления адресов только глобальных переменных.
С помощью оператора ADDR можно получить адрес локальной переменной.
Но почему так получается, что с помощью ADDR можно узнать адрес локальной пременной, а с помощью OFFSET — нельзя. Дело в том, что ассемблер, встретив оператор ADDR, использующийся с локальной переменной, генерирует последовательность инструкций
lea eax, localVar push eax
ну а инструкция lea уже делает свое дело. Т.к. ADDR превращается в выше указанную посдедовательность инструкций, данный оператор можно использовать только с директивой invoke для передачи адреса переменной в качестве параметра. Присваивание регистру полученного таким способом адреса невозможно. ADDR можно так же использоваться и с глобальными переменными. В этом случае ассемблер сгенерирует
push offset globalVar
И в отличие от OFFSET, ADDR не умеет вычислять смещения меток, определенных далее в коде.
mov eax, offset l1 ; так можно invoke Foo, ADDR l1; так нельзя l1: xor ebx, ebx invoke Foo, ADDR l1; так можно