Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
15-1257160759
JohnKorsh
2009-11-02 14:19
2010.01.03
Не посоветует ли кто книгу по работе с сетями из Дельфи?


6-1193385014
Alex_C
2007-10-26 11:50
2010.01.03
Заполнение поля TWebBrowser типа file


15-1257334588
XXL
2009-11-04 14:36
2010.01.03
Сантехники от программирования - нужны ли они ?


15-1256845098
koha!
2009-10-29 22:38
2010.01.03
Упал Linux


2-1258030604
night_light
2009-11-12 15:56
2010.01.03
передача видео по сети





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский