Вверх ↑
Ответов: 4621
Рейтинг: 746
#1: 2022-05-14 17:30:52 ЛС | профиль | цитата
Ну, я же когда-то тебе давал IC для целых чисел. Вот с примером кода для 8-байтных чисел и применения для Single/Double.

Add(MainForm,14667778,308,133)
{
Position=1
}
Add(Edit,10593851,490,126)
{
Left=20
Top=20
Width=85
Text="AABBCCDD"
}
Add(Button,7642022,434,175)
{
Left=120
Top=20
link(onClick,14795348:doConvert,[])
}
Add(Label,2287541,651,175)
{
Left=185
Top=25
}
Add(Convertor,14795348,490,175)
{
Mode=5
link(onResult,11970995:doBSwap,[])
link(Data,10593851:Text,[])
}
Add(Convertor,9711378,602,175)
{
Mode=6
link(onResult,2287541:doText,[])
}
Add(InlineCode,11970995,546,175)
{
WorkPoints=#7:doBSwap|
EventPoints=#8:onResult|
DataPoints=#6:IntNum|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|23: IntNum: THI_Event;|28: onResult: THI_Event; |54: procedure doBSwap(var _Data: TData; Index: Word);|5: end;|0:|14:implementation|0:|87:function BSwap(X: LongWord): LongWord; assembler; {$ifdef FPC64} nostackframe; {$endif}|3:asm|16: {$ifdef WIN64}|34: mov eax, ecx // ECX = x in 64bit|10: {$endif}|11: bswap eax|4:end;|0:|14:{$ifdef WIN64}|0:|83:function BSwap64(X: Int64): Int64; assembler; {$ifdef FPC64} nostackframe; {$endif}|3:asm|25: mov rax, rcx // RCX = x|11: bswap rax|4:end;|80://Result := (Int64(Endian(LongWord(X))) shl 32) or (Endian(LongWord(X shr 32)));|0:|7:{$else}|0:|40:function BSwap64(const X: Int64): Int64;|4:type|22: Ti64 = packed record|21: Lo, Hi: LongWord;|6: end;|5:begin|39: Ti64(Result).Lo := BSwap(Ti64(X).Hi);|39: Ti64(Result).Hi := BSwap(Ti64(X).Lo);|4:end;|0:|8:{$endif}|0:|0:|0:|59:procedure THiAsmClass.doBSwap(var _Data:TData; index:word);|5:begin|74: _hi_CreateEvent(_Data, @onResult, BSwap(ReadInteger(_Data, IntNum, 0)));|4:end;|0:|0:|0:|19:// Для других типов|15:procedure Test;|4:type|22: PInteger = ^Integer;|18: PInt64 = ^Int64;|3:var|20: MySingle: Single; |91: TmpInt: Integer absolute MySingle; // TmpInt указывает на память, выделенную под MySingle|19: MyDouble: Double;|36: TmpInt64: Int64 absolute MyDouble;|5:begin|0:|61: // Для типов Single/Double берется указатель на переменную,|77: // приводится к целому типу нужного размера и вызывается функция для целого|54: PInteger(@MySingle)^ := BSwap(PInteger(@MySingle)^);|52: PInt64(@MyDouble)^ := BSwap64(PInt64(@MyDouble)^);|5: |45: // Или с использованием директивы absolute.|59: // Работа идёт со значениями перменных MySingle/MyDouble|26: TmpInt := BSwap(TmpInt);|34: TmpInt64 := BSwap64(TmpInt64); |4:end;|0:|4:end.|
link(onResult,9711378:doConvert,[])
}
карма: 26

0