Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.033 c
1-1082041888
Avreliy
2004-04-15 19:11
2004.05.02
Массив объектов класса TEdit


14-1081261783
Soft
2004-04-06 18:29
2004.05.02
Есть ли Бог на Марсе?


1-1081760952
Alexey Chekmezov
2004-04-12 13:09
2004.05.02
Компоненты Delphi


1-1082035946
siriusP
2004-04-15 17:32
2004.05.02
Масштабирование Canvas при печати.


1-1082026825
К.С.
2004-04-15 15:00
2004.05.02
Как узнать если в ресурсах bitmap?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский