Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.01.03;
Скачать: CL | DM;

Вниз

Как использовать строковые константы в 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.022 c
15-1256130971
Кто б сомневался
2009-10-21 17:16
2010.01.03
РАО


1-1232020600
inviz
2009-01-15 14:56
2010.01.03
Проблема с выводом потока в файл


1-1232557117
du_hast
2009-01-21 19:58
2010.01.03
Работа с CommandBar-ом в Outlook-е


15-1256418198
XXL
2009-10-25 01:03
2010.01.03
Давно ли delphimaster рекламирует сомнительные сайты ?


15-1257224234
MonoLife
2009-11-03 07:57
2010.01.03
Читабельность кода