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

Вниз

Delphi&Assembler   Найти похожие ветки 

 
Miroslav   (2004-04-12 11:35) [0]

Я состряпал функцию:
function SqrMan(x:integer):integer; assembler;
begin
 asm
   mov eax,x
   mov ebx,x
   mul ebx
   mov @Result,eax
 end;
end;
Почему она не работает?


 
Smithson ©   (2004-04-12 11:41) [1]

А в чем это проявляется?


 
MBo ©   (2004-04-12 11:47) [2]

function SqrMan(x:integer):integer;
asm
 imul eax
end;


 
default ©   (2004-04-12 11:50) [3]


function Sqr_(X: Integer): Integer;
asm
     IMUL  EAX, EAX
end;


 
clickmaker ©   (2004-04-12 11:51) [4]

> Miroslav   (12.04.04 11:35)  

Для возвращаемых значений ординальных типов компилятор не резервирует память под Result, поэтому обращение к ней вызывает AV


 
VMcL ©   (2004-04-12 12:43) [5]

>>clickmaker ©  (12.04.04 11:51) [4]

Если написать так, как в [0], то зарезервирует (в стеке).
Будет вот такой код (даже при вкл. оптимизации):
//mov @Result, eax
mov   [ebp - $04], eax
mov   eax, [ebp - $04]


 
VMcL ©   (2004-04-12 12:44) [6]

>>Miroslav  (12.04.04 11:35)

Это кто же тебе разрешил регистр EBX изменять и не восстанавливать?
Inline assembler code + F1 {читать до полного понимания}.


 
icWasya ©   (2004-04-12 12:48) [7]

>[4]
точнее при соглашении о вызовах по умолчанию первые три параметра передаются через регистры -eax,edx,ecx

то есть либо так - через стек
function SqrMan(x:integer):integer; assembler;stdcall;
begin
asm
  mov eax,x
  imul eax
  mov Result,eax
end;
end;


либо так - через регистры
function SqrMan(x:integer):integer; assembler;stdcall;
asm
  imul eax
end;


 
hexone ©   (2004-04-12 12:52) [8]


> либо так - через регистры
> function SqrMan(x:integer):integer; assembler;stdcall;
> asm
>   imul eax
> end;

Так тоже через стек. STDCALL стоит.


 
VMcL ©   (2004-04-12 12:57) [9]

>>icWasya ©  (12.04.04 12:48) [7]

mov Result, eax  // Error
Это раз. Во-вторых, см. [5]. В-третьих, см. [8].
Ну не умеешь, зачем советы давать?


 
hexone ©   (2004-04-12 13:01) [10]


> mov Result, eax  // Error
> Это раз.

Ну вот это Вы зря.... ни какой не Error


 
Anatoly Podgoretsky ©   (2004-04-12 13:20) [11]

Это не ошибка, а просто лишнее


 
VMcL ©   (2004-04-12 13:34) [12]

>>hexone ©  (12.04.04 13:01) [10]

Ты компилировал? Я - да. Error.

>>Anatoly Podgoretsky ©  (12.04.04 13:20) [11]

Ошибка, потому что
mov @Result, eax

А про лишнее я писал в [5].


 
hexone ©   (2004-04-12 13:41) [13]


function SqrMan(x:integer):integer; stdcall;
begin
asm
 mov eax,x
 imul eax
 lea ecx, Result
 mov [ecx],eax
end;
end;
Однако заблуждаетесь.
Если STDCALL, то result тоже идет как стековый параметр.


 
VMcL ©   (2004-04-12 13:41) [14]

>>hexone ©  (12.04.04 13:01) [10]
>>Anatoly Podgoretsky ©  (12.04.04 13:20) [11]

I"m very sorry. Можно Result и без собаки писать. Oops, наезд не удался.


 
default ©   (2004-04-12 13:42) [15]

VMcL ©   (12.04.04 13:34) [12]
в его коде ошибка лишь в том, что он юзает регистр ebx
не восстанавливая
замените его на edx и всё будет работать
вполне рабочий код
function SqrMan(x:integer):integer; assembler;
begin
asm
  mov eax,x
  mov edx,x
  mul edx
  mov @Result,eax
end;
end;


 
hexone ©   (2004-04-12 13:42) [16]


> А про лишнее я писал в [5].

Извиняйте


 
VMcL ©   (2004-04-12 13:45) [17]

>>hexone ©  (12.04.04 13:41) [13]

Result идет как стековый параметр, потому что его явно указали и/или если выключена оптимизация. Не нужно в BASM писать Result. Смотрим: тип результата Integer. Значит результат должен быть в EAX.


 
VMcL ©   (2004-04-12 13:48) [18]

>>default ©  (12.04.04 13:42) [15]

[6] читал?


 
hexone ©   (2004-04-12 13:49) [19]


> Result идет как стековый параметр, потому что его явно указали

Ну так указано же stdcall
Дело в данном случае не в оптимизации. При STDCALL ни один параметр не идет через регистры.


 
default ©   (2004-04-12 13:51) [20]

VMcL ©   (12.04.04 13:48) [18]
да
ещё читал [12] где написано
"Ошибка, потому что mov @Result, eax"


 
Anatoly Podgoretsky ©   (2004-04-12 13:58) [21]

VMcL ©   (12.04.04 13:41) [14]
В лучшем случае выкинет строку, в худщих
1. mov eax, eax
2. mov result, eax и не будет использоваться

Правильный вариант указан в [3] без лишнего ровно столько сколько требуется для функции, ради интереса можно посмотреть код A := x*x;


 
default ©   (2004-04-12 14:03) [22]

Anatoly Podgoretsky ©   (12.04.04 13:58) [21]
в [2] код короче на байт


 
VMcL ©   (2004-04-12 14:07) [23]

>>default ©  (12.04.04 13:51) [20]

А [14] читал?

>>Anatoly Podgoretsky ©  (12.04.04 13:58) [21]

Sqr() - оптимизированный способ возведения в квадрат.


 
default ©   (2004-04-12 14:09) [24]

VMcL ©   (12.04.04 14:07) [23]
когда писал не видел этого сообщения


 
default ©   (2004-04-12 14:12) [25]

VMcL ©   (12.04.04 14:07) [23]
"Sqr() - оптимизированный способ возведения в квадрат."
аналогичен [2]


 
default ©   (2004-04-12 14:14) [26]

+ещё что это макрос)


 
Miroslav   (2004-04-12 20:32) [27]

Спасибо за ответы.



Страницы: 1 вся ветка

Текущий архив: 2004.05.02;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.031 c
14-1081789585
тихий вовочка
2004-04-12 21:06
2004.05.02
Свой логгер


3-1081395619
ksa2002
2004-04-08 07:40
2004.05.02
Уникальня выборка с помощью SQL


14-1081418280
Она
2004-04-08 13:58
2004.05.02
сабж


3-1080896476
kat
2004-04-02 13:01
2004.05.02
создание TADOConnection


14-1081854360
Alex_x
2004-04-13 15:06
2004.05.02
может кто знает полный алгоритм такой защиты????