Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как использовать строковые константы в asm..end?


Страницы:   1 2

Тыщ ©   (2009-01-14 20:26:00) 

Не работает ни так:

const mystring='my string';
asm
  push offset mystring
end.


ни так:

const mystring='my string';
asm
 push offset mystring
end.


Пишет 'String constant too long'.

Что компилятору надо, как дать понять, что я хочу адрес строки push'нуть?

Также не работают mov и lea.

Это в D7 и D10 (2005),
D5 на первый вариант генерирует какое-то случайное число,
а D3 вообще с internal error'ом валится.


oxffff   (2009-01-16 10:33:00) [1]


> Тыщ ©   (16.01.09 06:24) [26]
> Если других вариантов нет, придется попробовать разобрать
> dcc32.exe и "включить" push offset str.


Нескромно очень.


Тыщ   (2009-01-16 06:24:00) [2]

Если других вариантов нет, придется попробовать разобрать dcc32.exe и "включить" push offset str.


oxffff   (2009-01-15 12:49:00) [3]


> Slym ©   (15.01.09 12:19) [23]


А сам указатель Str? Про него речь шла.
Это 3 dword.


oxffff   (2009-01-15 12:49:00) [4]


> Slym ©   (15.01.09 12:19) [23]


А сам указатель Str? Про него речь шла.
Это 3 dword.


Slym   (2009-01-15 12:19:00) [5]

oxffff ©   (15.01.09 9:08) [22]
Не читаешь ветку.

Читаю, но что значит "лишний dword"? RefCount и длинна? и это не dword а два dword


oxffff   (2009-01-15 09:08:00) [6]


> Slym ©   (15.01.09 05:01) [21]
> что я делаю не так?
> program Project2;


Не читаешь ветку.

const Str: string='my string';

см. Тыщ ©   (14.01.09 20:46) [4]


Slym   (2009-01-15 05:01:00) [7]

что я делаю не так?
program Project2;

{$APPTYPE CONSOLE}

uses SysUtils;

procedure StdCallStrProc(const S:string);stdcall;
begin
 Writeln(s);
end;

procedure StdCallPCharProc(const PS:PChar);stdcall;
begin
 Writeln(PS);
end;

const Str:string='my string';
procedure AsmStrProc;
asm
 push Str
 call StdCallStrProc
end;

procedure AsmPCharproc;
asm
 push Str
 call StdCallPCharProc
end;

begin
 AsmStrProc;
 AsmPCharproc;
 readln;
end.


oxffff   (2009-01-14 21:50:00) [8]


> Тыщ ©   (14.01.09 21:34) [19]


ААА!!!!!!!!!!!
ООО!!!!!!!!!!

Sorry, не внимательно смотрел.
Только это возможно удобно(хотя кому как) для через стек (stdcall ..)вызовов.


Тыщ   (2009-01-14 21:34:00) [9]

> oxffff ©   (14.01.09 21:28) [18]

Еще раз: смотри на [12]. Адреса, которые оставляют в стеке call'ы перед строками используются не для возвращения, а для передачи строки.


oxffff   (2009-01-14 21:28:00) [10]


> И в чем прикол? Я что-то понять не могу.


прикол в том, что по выходу из HelloAll ты попадешь на строку после
call @none, т.е. на мусор.

Но!!! Вот здесь проблем нет

procedure HelloAll;
asm
jmp @none;
lea eax,@const;
@const:
DB 'my string';
DB 0;
@none:
end;

Произвольная манипуляции с esp возможна, но только нужно знать, что нет доступов через esp, а где гарантии, что компилятор их не вставит?


Тыщ   (2009-01-14 21:23:00) [11]

> oxffff ©   (14.01.09 21:16) [16]

И в чем прикол? Я что-то понять не могу.
Сейчас код оставляет в стеке адрес кода "lea eax,@const",
возвращается на него вместо выхода из процедуры,
и рушится на исполнении db 'my string' как кода.

Можешь код в [12] в отладчике посмотреть, стек сбалансирован.


oxffff   (2009-01-14 21:16:00) [12]


> Тыщ ©   (14.01.09 21:10) [12]


procedure HelloAll;
asm
call @none;
lea eax,@const;
@const:
DB 'my string';
DB 0;
@none:
end;


Тыщ   (2009-01-14 21:13:00) [13]

> oxffff ©   (14.01.09 21:11) [13]

См. [12]


Тыщ   (2009-01-14 21:12:00) [14]

> oxffff ©   (14.01.09 21:01) [9]
> Но не хочет!!!


Н-да, никак...


oxffff   (2009-01-14 21:11:00) [15]


> Ну дык, а после call'а к WinAPI обратно уедет :)


Ну дык, если стек будет очишаться как
mov esp,ebp, тогда проблем не будет, а если как

add esp,20, тогда привет всем.


Тыщ   (2009-01-14 21:10:00) [16]

> oxffff ©   (14.01.09 21:03) [10]

uses Windows;
asm
 push 0
 call @@next
 db 'hello',0
 @@next:
 call @@next2
 db 'world',0
 @@next2:
 push 0
 call MessageBox
end.


Тыщ   (2009-01-14 21:08:00) [17]

> oxffff ©   (14.01.09 21:03) [10]
> Это не только не проще, но и не правильно!!!
> После call у тебя стек съедет.


Ну дык, а после call'а к WinAPI обратно уедет :)


oxffff   (2009-01-14 21:03:00) [18]


> Я бы делал проще (эквивалент push offset mystring):
>
> asm
>  call @@next
>  db 'my string'
>  @@next:
> end.


Это не только не проще, но и не правильно!!!
После call у тебя стек съедет.


oxffff   (2009-01-14 21:01:00) [19]


> Тыщ ©   (14.01.09 20:49) [6]
> oxffff ©   (14.01.09 20:46) [3]
>
> Этот вариант, конечно, лучше по генерации кода, но не буду
> же я вручную длину всех строк считать.


Ты знаешь я тоже наткнулся на большие грабли при обращении к property.
Имеется ввиду

public
FSomeVar:integer;
property SomeVar:integer read FSomeVar;

На ура!!!
mov eax,eax.TForm1.FSomeVar;

Но не хочет!!!
mov eax,eax.TForm1.SomeVar;


Тыщ   (2009-01-14 20:59:00) [20]

> oxffff ©   (14.01.09 20:54) [7]

Я бы делал проще (эквивалент push offset mystring):

asm
 call @@next
 db 'my string'
 @@next:
end.


Но беда в другом, эта строковая константа еще и в pas-коде используется...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо