Little Endian | Big Endian - Baskı Önizleme +- Delphi Can (https://www.delphican.com) +-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3) +--- Forum: Access violation (https://www.delphican.com/forumdisplay.php?fid=136) +--- Konu Başlığı: Little Endian | Big Endian (/showthread.php?tid=1481) Sayfalar:
1
2
|
Little Endian | Big Endian - Tuğrul HELVACI - 03-11-2017 Çok basit bir fonksiyon ile bir işlemcinin Little Endian'mı yoksa Big Endian'mı kullandığını tespit edebileceğimiz bir kod yazınız. Not: +20 puan (Pascal), ilave +10 puan inline asm. Little Endian | Big Endian - frmman - 03-11-2017 procedure TForm1.btn1Click(Sender: TObject); var a: Integer; b: Byte; pb: ^Byte; begin a := $12345678; pb := @a; b := pb^; if b = $78 then ShowMessage('little endian'); if b = $12 then ShowMessage('Big endian'); end;İlk cevap benden gelsin Little Endian | Big Endian - masteryoda - 03-11-2017 Bende c'de yazayım int main() { int x = 1; char *p = (char *)&x; if (*p) printf("little endian\n"); else printf("big endian\n"); } Little Endian | Big Endian - frmman - 03-11-2017 Buda pascal ile ikinci yöntem procedure TForm1.btn1Click(Sender: TObject); var a:Integer; b:Byte absolute a; begin a := $12345678; if b = $78 then ShowMessage('little endian'); if b = $12 then ShowMessage('Big endian'); end; Little Endian | Big Endian - masteryoda - 03-11-2017 Buda c ikinci yöntem o zaman [Ars=cpp]int main() { int x = 1; if (*(char *)&x) printf("little endian\n"); else printf("big endian\n"); }[/ars] Cvp: Little Endian | Big Endian - savasabd - 03-11-2017 program Project24; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; function isLittleEndian(): integer; asm {$IFDEF WIN32} mov dword[ebp-4],1 // local değişkenin adresi,buraya 1 sayısını yerleştiriyoruz xor eax,eax mov al,[ebp-4] // ilk baytı alıyoruz eğer little endian ise burada ilk bayta bir var değilse 0 mov @result,eax // @result 'a sonucu yerleştiriyoruz. {$ENDIF} {$IFDEF WIN64} mov dword[rbp+4],1 // local değişkenin adresi,buraya 1 sayısını yerleştiriyoruz xor rax,rax mov al,[rbp+4] // ilk baytı alıyoruz eğer little endian ise burada ilk bayta bir var değilse 0 mov @result,eax // @result 'a sonucu yerleştiriyoruz. {$ENDIF} end; begin if isLittleEndian() =1 then writeln('little endian') else writeln('big endian'); readln; end. Cvp: Little Endian | Big Endian - uparlayan - 03-11-2017 function IsBigEndian: Boolean; var X: Word; begin X := 256; Result := ( hi(X) = 1 ); end; Aşağıdaki cevabımı inceleyin. Cvp: Little Endian | Big Endian - savasabd - 03-11-2017 (03-11-2017, Saat: 19:31)uparlayan Adlı Kullanıcıdan Alıntı: Şöyle bir şey iş görür sanırım; Üstadım bu fonksiyon yanlış sonuç verir.Çünkü 256'nın 16 bitte ikilik sistemde ifadesi şu şekildedir: 0000000100000000 dolayısıyla 1 ikinci byte'dir.Big Endian kontrolü için Result := ( low(X) = 1 ); Yani büyük (big) kısmın başta olması lazım. Cvp: Little Endian | Big Endian - uparlayan - 03-11-2017 Doğru Savaş Bey, karıştırmışım. Big Endian / Little-Endian, İşlemcilerin tamsayı tiplerinde byte’ları saklarken kullandığı sıralamadır. Büyük Sonlu (Big-Endian) ve Küçük Sonlu (Little-Endian) olmak üzere ikiye ayrılır. Little-Endian (Küçük Sonlu): i386 ve devamı olan işlemciler Little-Endian kullanır. Elimizde $34E2561A 4 Byte’lık Integer verimiz olsun. Sağdan itibaren başlanarak $1A $56 $E2 $34 olarak saklanır. Big-Endian (Büyük Sonlu) Sun Sparc, Motorola 68K, PowerPC ve Java Sanal İşlemcisi (Java VM) Big-Endian kullanır. $7654139A verisi soldan itibaren başlanarak $76 $54 $13 $9A olarak saklanır. program Big_Endian; {$APPTYPE CONSOLE} function IsBigEndian: Boolean; begin Result := ( lo ( word (256) ) = 1 ); end; function IsBigEndian_Asm: Byte; asm mov dx, word(256); mov [Result], dl; end; begin if IsBigEndian = TRUE then Writeln( '1) Big Endian' ) else Writeln( '1) Little Endian' ); if IsBigEndian_Asm = 1 then Writeln( '2) Big Endian' ) else Writeln( '2) Little Endian' ); Readln; end. Cvp: Little Endian | Big Endian - Tuğrul HELVACI - 03-11-2017 Bravo arkadaşlar. Tahmin ettiğimden de hızlı ve doğru yanıtlar verdiniz. Herbirinizi kutluyor ve ellerinize sağlık diyorum. |