Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2011, 21:35   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Адресация к членам класса/структур

Доброго времени суток Уважаемые специалисты. Есть такой вопросик, как можно найти реальный адрес переменной, например как в примере кода LOCAL.1? MOV DWORD PTR SS:[EBP-4],ECX
То есть я правильно понимаю, отняв от указателя 4 и перейти по адресу в дампе, развернув адрес мы и получим реальной адрес нашей переменной так?
Если так, какие методы еще существуют?

Код:
004460F0  /$  55            PUSH EBP
004460F1  |.  8BEC          MOV EBP,ESP
004460F3  |.  51            PUSH ECX
004460F4  |.  894D FC       MOV [LOCAL.1],ECX
004460F7  |.  8B45 FC       MOV EAX,[LOCAL.1]
004460FA  |.  8B4D 08       MOV ECX,[ARG.1]
004460FD  |.  8B50 08       MOV EDX,DWORD PTR DS:[EAX+8]
00446100  |.  33C0          XOR EAX,EAX
00446102  |.  3B51 08       CMP EDX,DWORD PTR DS:[ECX+8]
00446105  |.  0F94C0        SETE AL
00446108  |.  8BE5          MOV ESP,EBP
0044610A  |.  5D            POP EBP
0044610B  \.  C2 0400       RET 4
Ах да, совсем забыл, по теме - как по указателю добраться к переменным структур и класса? (Можно маленький примерчик, за ранее спасибо)

Последний раз редактировалось coNsept; 08.03.2011 в 21:39.
coNsept вне форума Ответить с цитированием
Старый 09.03.2011, 06:27   #2
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Цитата:
Сообщение от coNsept
как по указателю добраться к переменным структур и класса?
Код:
; masm windows gui #
.386                                       
.model flat
RECT STRUCT
  left    dd      ?
  top     dd      ?
  right   dd      ?
  bottom  dd      ?
RECT ENDS
.code
BEGIN proc 
local rct:RECT
	lea ecx,rct                   |4000C4 55             |push ebp
	assume ecx: ptr RECT          |4000C5 8BEC           |mov ebp,esp
	mov [ecx].left,300            |4000C7 83C4F0         |add esp,-16
	mov [ecx].right,0             |4000CA 8D4DF0         |lea ecx,[ebp-10h]
	mov [ecx].bottom,60           |4000CD C7012C010000   |mov dword ptr [ecx],12Ch
	mov [ecx].top,eax             |4000D3 C7410800000000 |mov dword ptr [ecx+8],0
	assume ecx: nothing           |4000DA C7410C3C000000 |mov dword ptr [ecx+0Ch],3Ch
	RET ; выходим из подпрограммы |4000E1 894104         |mov [ecx+4],eax            
BEGIN endp                            |4000E4 C9             |leave
                                      |4000E5 C3             |retn
END BEGIN
Mikl___ вне форума Ответить с цитированием
Старый 09.03.2011, 13:28   #3
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Вопрос с первым ответом поражают своей жестокостью проявляющейся в наличии адресов в ВП и опкодов инструкций
В процедуре из вопроса происходит сравнение двух значений в неких структурах, адреса которых подаются в регистре есх и в аргументе функции в стеке. В обоих случаях из структур берутся значения двордов по смещению 08h от начала каждой структуры, значения эти и сравниваются. [Локал.1] это похоже на какой то плуг к олли, который посчитал что тут локальная переменная, когда здесь просто вершина стека очень хитро адресуется через ebp, а переменных нет вообще. Остальное по вопросу не понял
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 09.03.2011, 14:44   #4
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Вообщем желание удовлетворено, теперь картина стала яснее, спасибо вам ребят
coNsept вне форума Ответить с цитированием
Старый 09.03.2011, 15:39   #5
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от coNsept Посмотреть сообщение
Ах да, совсем забыл, по теме - как по указателю добраться к переменным структур и класса? (Можно маленький примерчик, за ранее спасибо)
у тебя есть структура

Код:
RECT STRUCT
  left    dd      ?
  top     dd      ?
  right   dd      ?
  bottom  dd      ?
RECT ENDS
адрес структуры например в ECX, чтобы получить адрес её поля надо просто прибавить к регистру ECX смещение этого поля внутри структуры.
т.е. адрес right будет ECX+8, а само значение [ECX+8]

что такое класс - это чисто высокоуровневое понятие, де-факто это та же структура. От структуры класс отличается только тем что в ней есть private-поля и protected-поля и защита доступа к ним реализуется чисто за счёт того что на этапе компиляции при попытке доступа к private-полю или protected-полю мы получим ошибку, на уровне ассемблера защита чисто формальная . Функция-член (метод) класса это такое же поле только поле содержит адрес искомой функции.
rpy3uH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Адресация многомерных массивов Valter Общие вопросы C/C++ 6 17.12.2010 12:59
mpi и адресация переменных SkrudjMakdak Общие вопросы C/C++ 0 26.04.2010 16:53
адресация в формулах andrewx Microsoft Office Excel 2 29.06.2009 17:44
LPT-порт адресация #378 Dj_smart Компьютерное железо 0 08.06.2009 15:53
StringGrid:=адресация Nemesisking Компоненты Delphi 12 02.03.2007 02:20