Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Трабла со встроенным ассемблером  (Прочитано 8731 раз)
0 Пользователей и 1 Гость смотрят эту тему.
zubr
Гость
« : 28-05-2012 12:10 » 

Среда разработки - VC++.NET2003.
Создаю команду: _asm mov ebx,dword ptr [0x00402000]
В результате компилятор создает машинную команду: BB 00 20 40 00, что соответствует mov ebx,00402000h
Команда _asm mov ebx,0x00402000 создает тот же машинный код BB 00 20 40 00
В чем трабла? Может во встроенном ассемблере VC++ как-то по другому обозначается адрес ячейки памяти?
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #1 : 28-05-2012 13:38 » 

попробуйте указать явно сегментный регистр через который хотите обращаться, т.е.:
Код:
  _asm mov ebx,ds:[0x00402000]
Записан
zubr
Гость
« Ответ #2 : 28-05-2012 14:04 » 

Да, но тогда он создает 7-байтную машинную команду с префиксом 3E: 3E 8B 1D 00 20 40 00. А мне надо 6-байтовая: 8B 1D 00 20 40 00.
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #3 : 28-05-2012 14:31 » 

zubr, а зачем Вам это? А то может хватит и обычного:
Код:
  r = *((unsigned int*)0x402000);
« Последнее редактирование: 28-05-2012 14:42 от darkelf » Записан
zubr
Гость
« Ответ #4 : 28-05-2012 15:37 » 

Для эмулятора байт-кода.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 29-05-2012 08:44 » 

zubr, так правильно же - кастит число к указателю и грузит в регистр. А тебе, насколько понимаю, нужна косвенная адресация ?  В студии компилятор поступает так


Код:
22:       int aaa=7;
0040135B   mov         dword ptr [ebp-14h],7
23:
24:       int* A1=&aaa;
00401362   lea         edx,[ebp-14h]
00401365   mov         dword ptr [ebp-18h],edx
25:
26:       int A2=*A1;
00401368   mov         eax,dword ptr [ebp-18h]
0040136B   mov         ecx,dword ptr [eax]            <<<<<<<<<<<<<<<<<<<<<<<<
0040136D   mov         dword ptr [ebp-1Ch],ecx  <<<<<<<<<<<<<<<<<<<<<<<<<<

Добавлено через 1 минуту и 50 секунд:
видимо, указатель сначала нужно в регистр загрузить, только потом разыменовывать
« Последнее редактирование: 29-05-2012 08:46 от Алексей1153 » Записан

zubr
Гость
« Ответ #6 : 29-05-2012 09:20 » 

Алексей1153++, если быть точным, то это абсолютная прямая адресация. Обращение к ячейке памяти по адресу, указанному в операнде. В данном случае промежуточные команды с регистрами или стеком меня не устраивают.
Использую дельфийский компилятор, его встроенный ассемблер оказался ближе к реальному, там этой траблы нет.
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 29-05-2012 09:59 » new

блин, час терзал студию и доку... получается  что либо  через _emit
либо через:
Код: (C)
void *qqq;
    __asm mov ebx,  qqq
но при этом надо озаботится чтобы этот qqq был размещен по требуемому адресу. тогда получается "8b 1d" но сам адрес будет только при линковке подставлен видимо... после компилятора адрес там нулями забит получается.
по другому не получилось пока А черт его знает...
« Последнее редактирование: 29-05-2012 10:01 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines