Форум: "Основная";
Текущий архив: 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