Delphi Can
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 Shy

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 Smile

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 Smile
[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

Şöyle bir şey iş görür sanırım;

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;

function IsBigEndian: Boolean;
var
  X: Word;
begin
  X := 256;
  Result := ( hi(X) = 1 );
end;

Ü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.