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.
Peyami Safa: "Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır". 
Can Yücel: "Toprak gibi olmalısın! Ezildikçe sertleşmelisin! Seni ezenler sana muhtaç kalmalı! Hayatı sende bulmalı."
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.
Peyami Safa: "Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır". 
Can Yücel: "Toprak gibi olmalısın! Ezildikçe sertleşmelisin! Seni ezenler sana muhtaç kalmalı! Hayatı sende bulmalı."
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