Sedikit perakitan

29 Agustus 2009 oleh prashant · Komentar
Filed under: teknologi

Setelah membaca ini artikel tentang buffer kunci gratis dan melihat penggunaan CAS (bandingkan dan swap), saya merasa seperti posting kode perakitan untuk melakukan hal yang sama. Gunakan kasus di sana adalah untuk menulis sebuah metode asli dan menyebutnya dari Jawa (pada 1,5, saat bersamaan struktur data di Jawa lebih atau kurang non ada). Tanpa basa-basi, saya akan melepaskan kode ke Anda :) . Pertama adalah untuk CAS dan kedua adalah untuk komputasi GCD menggunakan algoritma Euclid (yang satu ini dapat ditemukan di banyak tempat dan tutorial juga).

Kompilasi dan jalankan instruksi gcc file_name.c ; ./a.out

Bandingkan dan Swap

   # Include 
  # Include 
 / / Tukar - newValue, comperand sudah tua / nilai yang diharapkan
 / *
  * Fungsi sebenarnya melakukan hal yang berikut - jika nilai pada * dest sama dengan oldvalue kemudian menggantinya dengan newValue lain meninggalkannya tidak berubah: apakah semua atom
  *
  * Ada dua pilihan untuk nilai kembali
  * Nilai awal dari 1.is * dest dan meninggalkan beban fxn menelepon untuk membandingkannya dengan oldval
  2.  melakukannya di sini dan kembali 0 atau 1, ini harus lebih efisien
  ** /

 / * Kemudian mengubahnya ke makro * /
 int cas (int * dest, int oldvalue, int newValue) {
	 printf ("(% d,% d,% d)", * dest, oldvalue, newValue);
	 / * Int cas (int dest, int oldvalue, int newValue) {* /
	 / * Int cas (int dest, int newValue, int oldvalue) {* /
	 int result = 1 ;/ * 1 menunjukkan bahwa cas berhasil dan 0 menunjukkan bahwa ia gagal * /
	 / * Btw perlu mengatur cc untuk bendera clobbering!  * /
	 __asm__ __ volatile__ (
			 "Movl% 2,%% eax \ n \ t"
			 "Movl% 3,%% ebx \ n \ t"
			 "Movl 0%,%% ecx \ n \ t"
			 "LOCK \ n \ t"
			 "CMPXCHG% ebx%, (%% ecx) \ n \ t" / * harus LOCK berada di baris yang sama * /
			 "JZ DIBUAT \ n \ t"
			 "Movl $ 0,% 1 \ n \ t"
			 "DONE: \ n \ t"
			 : "= M" (dest), "= g" (hasil)
			 : "G" (oldvalue), "g" (newValue), "m" (dest)
			 : "% Eax", "% ebx", "ecx", "cc"
			 );
	 printf ("(% d,% d,% d)", * dest, oldvalue, newValue);
	 kembali hasil;
 }

 / * TODO
  * Menulis lain fxn asm yang menempatkan di atas fxn dalam while loop dan terus mencoba kecuali jika berhasil * /

 int main () {
	 int a = 5, b = 6;
	 int * c = (int *) malloc (sizeof (int));
	 * C = 6;
	 / * Int c = 6; * /
	 printf ("% d \ n", cas (c, b, b));
	 printf ("% d \ n", cas (c, b, a));
	 printf ("% d \ n", cas (c, a, a));
	 printf ("% d \ n", cas (c, b, b));
	 * C = 6;
	 / * C = 5; * /
	 printf ("nilai perubahan * c ke% d \ n", * c);
	 printf ("% d \ n", cas (c, b, b));
	 printf ("% d \ n", cas (c, b, a));
	 printf ("% d \ n", cas (c, a, a));
	 printf ("% d \ n", cas (c, a, b));
	 printf ("% d \ n", cas (c, b, a));
	 kembali 0;
 }

Format catatan - tampaknya seperti stabilo wp sintaks adalah menambahkan pada akhirnya, mengabaikan itu.

GCD

 # Include 
 int FPB (int a, int b) {
     int hasil;
     / * Hitung Pembagi Bersama Terbesar menggunakan Algoritma Euclid 's * /
     __asm__ __ volatile__ ("movl% 1,% eax%;"
                           "Movl% 2,%% ebx;"
                           "Lanjutan: cmpl $ 0,%% ebx;"
                           "Je DIBUAT;"
                           "% Xorl% edx,% edx%;"
                           "%% Idivl ebx;"
                           "% Movl% ebx,% eax%;"
                           "% Movl% edx,% ebx%;"
                           "Jmp lanjutan;"
                           "DONE:%% movl eax,% 0;": "= g" (hasil): "g" (a), "g" (b)
     );

     kembali hasil;
 }

 int main () {
     int pertama, kedua;
     printf ("Masukkan dua bilangan bulat:");
     scanf ("% d% d", & pertama, & kedua);

     printf ("GCD dari% d &% d adalah% d \ n", pertama, kedua, FPB (pertama, kedua));

     kembali 0;
 }