kejadian perakitan x86 watak

  • Pengenalan
  • Isu
  • Penyelesaian
  • Penjelasan

Pengenalan

Latihan pemasangan kecil di bawah adalah untuk arkib x86 (Intel dan AMD 32-bit) dan menggunakan sintaks NASM, assembler, tersedia secara percuma dan

yang boleh digunakan pada platform yang berbeza seperti Windows atau Linux.

Ambil perhatian bahawa fungsi luaran yang digunakan berasal dari perpustakaan standard C.

Isu

Bayangkan pelbagai watak (yang tidak semestinya berakhir dengan 0). Ia mempunyai saiz dan kami ingin menguji kehadiran watak yang diberikan

dalam array ini. Matlamatnya adalah untuk menulis fungsi yang mengambil input pelbagai watak, saiz dan watak. Jika watak ini ada dalam

array, ia mengembalikan nilai nonzero, jika tidak, ia akan mengembalikan sifar.

Inilah yang memberi fungsi ini dalam C:

 / fungsi int is_in_array (char * array, int size, char c); / / pelaksanaan: tab tab [] = {'n', 'e', ​​'u', 'e'}; is_in_array (tab, sizeof (tab), 'u'); // Pulangkan nilai selain 0 is_in_array (tab, sizeof (tab), 'a'); // Pulangan nilai 0 Cukup masukkan kod anda di: extern printf section .data array db 'dadedidadedavivoufufifamasibifisaz' yes db 'oui', 10, 0 no db 'non', 10, 0 section .text main global is_in_array:; Masukkan kode anda di sana main: push ebp mov ebp, esp; Test jika m dalam array array dword 'm'; array array (di sini 34) push dword 34; alamat rentetan dalam array push eax; Call is_in_array dengan alamat array, ; saiz, dan nilai yang anda cari panggilan is_in_array test eax, eax jnz is_there; Jika eax! = 0 paparan ya tekan no; Kemudian paparkan tiada jmp screendisplay; screendisplay string dengan printf is_there push yes screendisplay: call printf mov eax, 0 meninggalkan ret 

Sudah tentu ini tidak akan mencukupi .....

Penyelesaian

 is_in_array: Retrieves alamat array (parameter pertama) dalam edi mov edi, [esp + 4]; Mengambil saiz array (parameter kedua) dalam ecx mov ecx, [esp + 8]; Mendapatkan watak untuk mencari (ketiga parameter) dalam eax mov eax, [esp + 12]; Cari watak reps screeb; Jika bendera ZERO (ZF) mempunyai nilai 1 ia bermakna watak ditemui; Dalam kes lain ia tidak dijumpai; nilai ZF dalam eax mov eax, 0; Jika ZF = 1 maka al = 1 (al adalah 8 bit paling ketara eax) setz al ret 

Penjelasan

 ZF = 0 ecx = panjang eax = watak edi = array // Loop yang mentakrifkan "scheb repne" Sedangkan ecx! = 0 ET ZF = 0 Adakah jika al == [edi] Kemudian ZF = 1 FinSi ecx = ecx - = edi + 1 EndWhile eax = 0 // Syarat yang mentakrifkan "setz" Si ZF = 1 Alors eax = 1 EndIf 
Artikel Sebelumnya Artikel Seterusnya

Tip-Tip Utama