Форум: "Основная";
Текущий архив: 2010.01.03;
Скачать: [xml.tar.bz2];
ВнизКак использовать строковые константы в asm..end? Найти похожие ветки
← →
Тыщ © (2009-01-14 20:26) [0]Не работает ни так:
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"ом валится.
← →
Тыщ © (2009-01-14 20:27) [1]Опечатка: второй вариант без offset
← →
oxffff © (2009-01-14 20:41) [2]const mystring:string="my string";
asm
mov eax,mystring;
end;
← →
oxffff © (2009-01-14 20:46) [3]const mystring:array[1..9] of char="my string";
asm
lea eax,mystring;
end;
← →
Тыщ © (2009-01-14 20:46) [4]> oxffff © (14.01.09 20:41) [2]
Этот вариант и вариант с pchar пишет в секцию данных лишний dword, криво это...
← →
oxffff © (2009-01-14 20:47) [5]
> Тыщ © (14.01.09 20:46) [4]
Я знаю поэтому [3].
← →
Тыщ © (2009-01-14 20:49) [6]oxffff © (14.01.09 20:46) [3]
Этот вариант, конечно, лучше по генерации кода, но не буду же я вручную длину всех строк считать.
← →
oxffff © (2009-01-14 20:54) [7]Еще вариант
asm
lea eax,@mystring;
mov eax,offset @mystring;
jmp @goout;
@Mystring:DB "my string";
@goout:
end;
← →
Тыщ © (2009-01-14 20:59) [8]> oxffff © (14.01.09 20:54) [7]
Я бы делал проще (эквивалент push offset mystring):asm
call @@next
db "my string"
@@next:
end.
Но беда в другом, эта строковая константа еще и в pas-коде используется...
← →
oxffff © (2009-01-14 21:01) [9]
> Тыщ © (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;
← →
oxffff © (2009-01-14 21:03) [10]
> Я бы делал проще (эквивалент push offset mystring):
>
> asm
> call @@next
> db "my string"
> @@next:
> end.
Это не только не проще, но и не правильно!!!
После call у тебя стек съедет.
← →
Тыщ © (2009-01-14 21:08) [11]> oxffff © (14.01.09 21:03) [10]
> Это не только не проще, но и не правильно!!!
> После call у тебя стек съедет.
Ну дык, а после call"а к WinAPI обратно уедет :)
← →
Тыщ © (2009-01-14 21:10) [12]> 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.
← →
oxffff © (2009-01-14 21:11) [13]
> Ну дык, а после call"а к WinAPI обратно уедет :)
Ну дык, если стек будет очишаться как
mov esp,ebp, тогда проблем не будет, а если как
add esp,20, тогда привет всем.
← →
Тыщ © (2009-01-14 21:12) [14]> oxffff © (14.01.09 21:01) [9]
> Но не хочет!!!
Н-да, никак...
← →
Тыщ © (2009-01-14 21:13) [15]> oxffff © (14.01.09 21:11) [13]
См. [12]
← →
oxffff © (2009-01-14 21:16) [16]
> Тыщ © (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:23) [17]> oxffff © (14.01.09 21:16) [16]
И в чем прикол? Я что-то понять не могу.
Сейчас код оставляет в стеке адрес кода "lea eax,@const",
возвращается на него вместо выхода из процедуры,
и рушится на исполнении db "my string" как кода.
Можешь код в [12] в отладчике посмотреть, стек сбалансирован.
← →
oxffff © (2009-01-14 21:28) [18]
> И в чем прикол? Я что-то понять не могу.
прикол в том, что по выходу из 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:34) [19]> oxffff © (14.01.09 21:28) [18]
Еще раз: смотри на [12]. Адреса, которые оставляют в стеке call"ы перед строками используются не для возвращения, а для передачи строки.
← →
oxffff © (2009-01-14 21:50) [20]
> Тыщ © (14.01.09 21:34) [19]
ААА!!!!!!!!!!!
ООО!!!!!!!!!!
Sorry, не внимательно смотрел.
Только это возможно удобно(хотя кому как) для через стек (stdcall ..)вызовов.
← →
Slym © (2009-01-15 05:01) [21]что я делаю не так?
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-15 09:08) [22]
> Slym © (15.01.09 05:01) [21]
> что я делаю не так?
> program Project2;
Не читаешь ветку.
const Str:string="my string";
см. Тыщ © (14.01.09 20:46) [4]
← →
Slym © (2009-01-15 12:19) [23]oxffff © (15.01.09 9:08) [22]
Не читаешь ветку.
Читаю, но что значит "лишний dword"? RefCount и длинна? и это не dword а два dword
← →
oxffff © (2009-01-15 12:49) [24]
> Slym © (15.01.09 12:19) [23]
А сам указатель Str? Про него речь шла.
Это 3 dword.
← →
oxffff © (2009-01-15 12:49) [25]
> Slym © (15.01.09 12:19) [23]
А сам указатель Str? Про него речь шла.
Это 3 dword.
← →
Тыщ © (2009-01-16 06:24) [26]Если других вариантов нет, придется попробовать разобрать dcc32.exe и "включить" push offset str.
← →
oxffff © (2009-01-16 10:33) [27]
> Тыщ © (16.01.09 06:24) [26]
> Если других вариантов нет, придется попробовать разобрать
> dcc32.exe и "включить" push offset str.
Нескромно очень.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2010.01.03;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.005 c