![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как использовать строковые константы в asm..end?
Тыщ © (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-коде используется...