Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Встроенный Ассемблер, Строковая константа 
:(
    Опции темы
Dimannn
Дата 27.8.2006, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 14.4.2005
Где: Владимир

Репутация: нет
Всего: 1



Как работать со строковыми константами?
нужно что-то вроде mov eax, Space , но чтобы в eax записалось на первые четыре байта спейса, а адрес. Space  - константа.


--------------------
Хотите быстро и без проблем опубликовать вашу программу в сети за 5 минут?
Тогда потратьте пару минут чтобы посмотреть, что предлагает OpenProject.org.ru
PM MAIL ICQ   Вверх
BUGOR
Дата 27.8.2006, 07:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 12.3.2006

Репутация: 5
Всего: 16



По-моему только через доп. переменную - указатель.
Код

const Space = '123456';
var
lpSpace: pChar;
begin
lpSpace := pChar(Space);
asm
  mov eax, lpSpace
end;


Это сообщение отредактировал(а) BUGOR - 27.8.2006, 10:58


--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
RideX
Дата 27.8.2006, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

Репутация: 4
Всего: 7



Код

mov eax, dword ptr[szString]

PM   Вверх
Romikgy
Дата 27.8.2006, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



а не через lea?????


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
BUGOR
Дата 27.8.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 12.3.2006

Репутация: 5
Всего: 16



Romikgy, в случае с константой нет. Если бы это была переменная типа string, тогда бы lea подошла.

Код

var
str: string;
begin
str := '11';
asm
  lea eax,str
end;



--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
RideX
Дата 27.8.2006, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

Репутация: 4
Всего: 7



Цитата(Romikgy @  27.8.2006,  15:40 Найти цитируемый пост)
а не через lea?????

Можно по разному, вот пример:
Код

implementation

{$R *.dfm}

const
  szString: PChar = 'Hello, World!';

procedure TForm1.Button1Click(Sender: TObject);
var
  buff: PChar;
begin
  GetMem(buff, 256);
  asm
    push esi
    push edi
    lea esi,szString         // mov esi, offset szString
    mov esi,[esi]
    mov edi,buff             // lea edi,buff
                             // mov edi,[edi]
    mov ecx,5
    rep movsb
    mov byte ptr[edi],'!'
    pop edi
    pop esi
  end;
  Form1.Caption := buff;
  FreeMem(buff);
end;

end.


Здесь соответствующую строку можно заменить той, которая в комментарии.
PM   Вверх
Alexeis
Дата 27.8.2006, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



С константами дело гиблое! Они хранятся в специальной области памяти. Попытка обратится к данным по адресу константы приводит к ошибке! Обратитесь к Петровичу он в этом деле большой специалист (по крайней мере написал оч. хорошую статью описывающую все типы строк и их отображение в памяти)


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
BUGOR
Дата 28.8.2006, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 12.3.2006

Репутация: 5
Всего: 16



alexeis1, дай пожалуйста ссылку на статью.


--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 28.8.2006, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459





--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RideX
Дата 28.8.2006, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

Репутация: 4
Всего: 7



Цитата(alexeis1 @  28.8.2006,  01:03 Найти цитируемый пост)
Попытка обратится к данным по адресу константы приводит к ошибке!

Вы не правы, это заблуждение, на самом деле никаких ошибок не будет!  smile 
PM   Вверх
Alexeis
Дата 28.8.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



RideX, кажись я понял, проблемы возникают не при чтении а при записи по адресу, константы. 
Цитата

Вот, теперь, зная как выполняются те или иные преобразования, Вы сможете всегда выбрать подходящий способ. Для тех, кто ещё не "проникся" до конца этой проблемой, приведу пример. В нем, преобразование, рекомендуемое разработчиками, приводит к "странному" поведению программы:
Код

procedure X1;
var
  s :AnsiString;
  p :PChar;
begin
  s := 'abcd';
  p  := PChar(s);
  p^ := 'X'; // <- 
  ShowMessage(s);
end;


вызывает ошибку доступа к памяти при выполнении строки, помеченной <=



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RideX
Дата 28.8.2006, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

Репутация: 4
Всего: 7



Цитата(alexeis1 @  28.8.2006,  19:57 Найти цитируемый пост)
кажись я понял, проблемы возникают не при чтении а при записи по адресу, константы.

Ага, типа того.. smile Но если нужно, то можно легко изменить и константу. Вот пример, как это сделать:
Код

implementation

{$R *.dfm}

const
  szString: PChar = 'Мама мыла раму?';

procedure TForm1.Button1Click(Sender: TObject);
var
  lpProtect, nLen: DWORD;
  szOverlay: PChar;
begin
  if MessageBox(Handle, szString, 'const', MB_YESNO or MB_ICONQUESTION) = mrNo then Exit;

  szOverlay := 'Папа пил пиво...';
  nLen := Length(szString);
  asm
    lea eax, lpProtect
    push eax
    push PAGE_READWRITE
    push nLen
    push szString
    call VirtualProtect
    test eax,eax
    jz @err

    mov esi, szOverlay
    mov edi, offset szString
    mov edi,[edi]
    mov ecx,nLen
    rep movsb

    lea eax, lpProtect
    push eax
    mov eax,[eax]
    push eax
    push nLen
    push szString
    call VirtualProtect

    @err:
  end;

  MessageBox(Handle, szString, 'overlay', MB_ICONINFORMATION);
end;

end.


Это сообщение отредактировал(а) RideX - 28.8.2006, 17:21
PM   Вверх
Dimannn
Дата 6.9.2006, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 14.4.2005
Где: Владимир

Репутация: нет
Всего: 1



Извиняюсь за задержку, технические сложности.


Но суть проблемы в том, чтобы минимальными усилиями заставить включить строковую константу в конечный файл, но надо учесть, что после операций над ним, операция на памятью под адресом константы может вызвать ошибку.
Константа должна быть локальной и нетипизированной!

mov eax, Space и mov eax, dword ptr(Space) компилируются одинаково,
и при этом они счетают константу DWORDом(при SPACE = #10#13#15#14 получаю mov eax, 10131415)

Собственно, задача моя заключается в том, чтобы заставить компилятор сделать несколько постого места после retn процедуры, а строковые константы именно туда и пишутся.

Добавлено @ 19:10 
RideX, Собственно говоря, это можно сделать и без ассемблера.
Код

    VirtualProtect(Pointer(szString), nLen, PAGE_READWRITE, lpProtect);
    CopyMemory(Pointer(szString),Pointer(szOverlay),nLen);
    VirtualProtect(Pointer(szString), nLen, lpProtect, lpProtect);



--------------------
Хотите быстро и без проблем опубликовать вашу программу в сети за 5 минут?
Тогда потратьте пару минут чтобы посмотреть, что предлагает OpenProject.org.ru
PM MAIL ICQ   Вверх
RideX
Дата 6.9.2006, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

Репутация: 4
Всего: 7



Цитата(Dimannn @  6.9.2006,  22:03 Найти цитируемый пост)
Собственно говоря, это можно сделать и без ассемблера.
Я очень рад, думаю теперь ты с асмом на ты!


Цитата(Dimannn @  6.9.2006,  22:03 Найти цитируемый пост)
mov eax, Space и mov eax, dword ptr(Space) компилируются одинаково,
и при этом они счетают константу DWORDом(при SPACE = #10#13#15#14 получаю mov eax, 10131415)

Не может быть, только что проверил
Код

00401EB0  |. 8B45 FC           MOV EAX,DWORD PTR SS:[EBP-4]

eax = 00401F10, и по этому адресу лежит:
Код

00401F10  0A 0D 0F 0E 00 00 00 00                          ......

...что тебе и нужно.

Это сообщение отредактировал(а) RideX - 6.9.2006, 21:57
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2139 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.