Tüm Platformlar için Hızlı Uygulama Geliştirme --->    Kitabımız...      Delphi

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 3 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Little Endian | Big Endian
#1
Ç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.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#2
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
Cevapla
#3
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");

}

“Do. Or do not. There is no try.”
Cevapla
#4
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;
Cevapla
#5
Buda c ikinci yöntem o zaman Smile
int main()
{
	int x = 1;

	if (*(char *)&x)
		printf("little endian\n");
	else
		printf("big endian\n");

}

“Do. Or do not. There is no try.”
Cevapla
#6
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.
Bizi Toprağa Gömdüler Fakat Tohum Olduğumuzu Bilmiyorlardı.
Cevapla
#7
Şö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.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol,Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol,Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol,Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol / Neyi bilmediğimiz hakkında hiçbir fikrimiz yok (EM)
Cevapla
#8
(03-11-2017, Saat: 19:31)uparlayan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlŞö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.
Bizi Toprağa Gömdüler Fakat Tohum Olduğumuzu Bilmiyorlardı.
Cevapla
#9
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.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol,Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol,Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol,Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol / Neyi bilmediğimiz hakkında hiçbir fikrimiz yok (EM)
Cevapla
#10
Bravo arkadaşlar. Tahmin ettiğimden de hızlı ve doğru yanıtlar verdiniz. Herbirinizi kutluyor ve ellerinize sağlık diyorum.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter





Konuyu Okuyanlar: 1 Ziyaretçi