Majelis - Register

Operasi prosesor sebagian besar melibatkan pemrosesan data. Data ini dapat disimpan dalam memori dan diakses dari sana. Namun, membaca data dari dan menyimpan data ke dalam memori memperlambat prosesor, karena ini melibatkan proses pengiriman permintaan data yang rumit melalui bus kontrol dan ke dalam unit penyimpanan memori dan mendapatkan data melalui saluran yang sama.

Untuk mempercepat operasi prosesor, prosesor menyertakan beberapa lokasi penyimpanan memori internal yang disebut registers.

Register menyimpan elemen data untuk diproses tanpa harus mengakses memori. Sejumlah register dibangun ke dalam chip prosesor.

Register Prosesor

Ada sepuluh register prosesor 32-bit dan enam 16-bit dalam arsitektur IA-32. Register dikelompokkan menjadi tiga kategori -

  • Register umum,
  • Kontrol register, dan
  • Segmen register.

Register umum selanjutnya dibagi menjadi beberapa kelompok berikut -

  • Register data,
  • Pointer mendaftar, dan
  • Register indeks.

Register Data

Empat register data 32-bit digunakan untuk aritmatika, logika, dan operasi lainnya. Register 32-bit ini dapat digunakan dengan tiga cara -

  • Sebagai register data 32-bit lengkap: EAX, EBX, ECX, EDX.

  • Bagian bawah dari register 32-bit dapat digunakan sebagai empat register data 16-bit: AX, BX, CX dan DX.

  • Bagian yang lebih rendah dan lebih tinggi dari empat register 16-bit yang disebutkan di atas dapat digunakan sebagai delapan register data 8-bit: AH, AL, BH, BL, CH, CL, DH, dan DL.

Beberapa dari register data ini memiliki kegunaan khusus dalam operasi aritmatika.

AX is the primary accumulator; digunakan dalam input / output dan sebagian besar instruksi aritmatika. Misalnya, dalam operasi perkalian, satu operan disimpan di register EAX atau AX atau AL sesuai dengan ukuran operan.

BX is known as the base register, karena dapat digunakan dalam pengalamatan yang diindeks.

CX is known as the count register, sebagai ECX, register CX menyimpan hitungan loop dalam operasi iteratif.

DX is known as the data register. Ini juga digunakan dalam operasi input / output. Ini juga digunakan dengan register AX bersama DX untuk operasi perkalian dan pembagian yang melibatkan nilai besar.

Pointer Register

Register penunjuk adalah register EIP, ESP, dan EBP 32-bit dan bagian kanan 16-bit yang sesuai IP, SP, dan BP. Ada tiga kategori register penunjuk -

  • Instruction Pointer (IP)- Register IP 16-bit menyimpan alamat offset dari instruksi berikutnya yang akan dieksekusi. IP yang terkait dengan register CS (seperti CS: IP) memberikan alamat lengkap dari instruksi saat ini di segmen kode.

  • Stack Pointer (SP)- Register SP 16-bit memberikan nilai offset dalam tumpukan program. SP dalam kaitannya dengan register SS (SS: SP) mengacu pada posisi data atau alamat saat ini dalam tumpukan program.

  • Base Pointer (BP)- Register BP 16-bit terutama membantu dalam mereferensikan variabel parameter yang diteruskan ke subrutin. Alamat di register SS digabungkan dengan offset di BP untuk mendapatkan lokasi parameter. BP juga dapat digabungkan dengan DI dan SI sebagai register dasar untuk pengalamatan khusus.

Register Indeks

Register indeks 32-bit, ESI dan EDI, dan bagian paling kanan 16-bitnya. SI dan DI, digunakan untuk pengalamatan diindeks dan terkadang digunakan sebagai penjumlahan dan pengurangan. Ada dua set penunjuk indeks -

  • Source Index (SI) - Ini digunakan sebagai indeks sumber untuk operasi string.

  • Destination Index (DI) - Ini digunakan sebagai indeks tujuan untuk operasi string.

Kontrol Register

Register penunjuk instruksi 32-bit dan register flag 32-bit digabungkan dianggap sebagai register kontrol.

Banyak instruksi yang melibatkan perbandingan dan kalkulasi matematis dan mengubah status bendera dan beberapa instruksi bersyarat lainnya menguji nilai dari bendera status ini untuk membawa aliran kendali ke lokasi lain.

Bit bendera yang umum adalah:

  • Overflow Flag (OF) - Ini menunjukkan limpahan bit orde tinggi (bit paling kiri) data setelah operasi aritmatika yang ditandatangani.

  • Direction Flag (DF)- Ini menentukan arah kiri atau kanan untuk memindahkan atau membandingkan data string. Ketika nilai DF adalah 0, operasi string mengambil arah kiri-ke-kanan dan ketika nilai disetel ke 1, operasi string mengambil arah kanan-ke-kiri.

  • Interrupt Flag (IF)- Ini menentukan apakah interupsi eksternal seperti entri keyboard, dll., Akan diabaikan atau diproses. Ini menonaktifkan interupsi eksternal ketika nilainya 0 dan mengaktifkan interupsi ketika diatur ke 1.

  • Trap Flag (TF)- Ini memungkinkan pengaturan operasi prosesor dalam mode satu langkah. Program DEBUG yang kami gunakan menetapkan tanda perangkap, sehingga kami dapat menjalankan instruksi satu per satu melalui eksekusi.

  • Sign Flag (SF)- Ini menunjukkan tanda hasil operasi aritmatika. Bendera ini disetel sesuai dengan tanda item data setelah operasi aritmatika. Tandanya ditunjukkan dengan urutan tertinggi dari bit paling kiri. Hasil positif membersihkan nilai SF menjadi 0 dan hasil negatif menetapkannya menjadi 1.

  • Zero Flag (ZF)- Ini menunjukkan hasil operasi aritmatika atau perbandingan. Hasil bukan nol menghapus tanda nol menjadi 0, dan hasil nol menyetelnya ke 1.

  • Auxiliary Carry Flag (AF)- Berisi carry dari bit 3 ke bit 4 setelah operasi aritmatika; digunakan untuk aritmatika khusus. AF diatur ketika operasi aritmatika 1-byte menyebabkan carry dari bit 3 ke bit 4.

  • Parity Flag (PF)- Ini menunjukkan jumlah total 1-bit dalam hasil yang diperoleh dari operasi aritmatika. Bilangan genap 1-bit menghapus tanda paritas menjadi 0 dan jumlah ganjil 1-bit menetapkan tanda paritas ke 1.

  • Carry Flag (CF)- Berisi carry 0 atau 1 dari bit orde tinggi (paling kiri) setelah operasi aritmatika. Ini juga menyimpan isi dari bit terakhir dari operasi shift atau rotasi .

Tabel berikut menunjukkan posisi bit bendera dalam register Bendera 16-bit:

Bendera: HAI D saya T S Z SEBUAH P. C
Sedikit tidak: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Segmen Register

Segmen adalah area spesifik yang ditentukan dalam program untuk menampung data, kode, dan tumpukan. Ada tiga segmen utama -

  • Code Segment- Berisi semua instruksi yang akan dieksekusi. Register Segmen Kode 16-bit atau register CS menyimpan alamat awal dari segmen kode.

  • Data Segment- Berisi data, konstanta, dan area kerja. Register Segmen Data 16-bit atau register DS menyimpan alamat awal dari segmen data.

  • Stack Segment- Berisi data dan alamat pengirim dari prosedur atau subrutin. Ini diimplementasikan sebagai struktur data 'tumpukan'. Register Stack Segment atau SS register menyimpan alamat awal stack.

Selain register DS, CS dan SS, ada register segmen tambahan lainnya - ES (segmen ekstra), FS dan GS, yang menyediakan segmen tambahan untuk menyimpan data.

Dalam pemrograman perakitan, program perlu mengakses lokasi memori. Semua lokasi memori dalam suatu segmen relatif terhadap alamat awal segmen tersebut. Sebuah segmen dimulai dalam sebuah alamat yang dapat dibagi secara merata dengan 16 atau heksadesimal 10. Jadi, digit heksadesimal paling kanan di semua alamat memori tersebut adalah 0, yang umumnya tidak disimpan dalam register segmen.

Register segmen menyimpan alamat awal segmen. Untuk mendapatkan lokasi yang tepat dari data atau instruksi dalam suatu segmen, diperlukan nilai offset (atau perpindahan). Untuk mereferensikan lokasi memori apa pun dalam sebuah segmen, prosesor menggabungkan alamat segmen dalam register segmen dengan nilai offset lokasi tersebut.

Contoh

Lihatlah program sederhana berikut untuk memahami penggunaan register dalam pemrograman perakitan. Program ini menampilkan 9 bintang di layar bersama dengan pesan sederhana -

section	.text
   global _start	 ;must be declared for linker (gcc)
	
_start:	         ;tell linker entry point
   mov	edx,len  ;message length
   mov	ecx,msg  ;message to write
   mov	ebx,1    ;file descriptor (stdout)
   mov	eax,4    ;system call number (sys_write)
   int	0x80     ;call kernel
	
   mov	edx,9    ;message length
   mov	ecx,s2   ;message to write
   mov	ebx,1    ;file descriptor (stdout)
   mov	eax,4    ;system call number (sys_write)
   int	0x80     ;call kernel
	
   mov	eax,1    ;system call number (sys_exit)
   int	0x80     ;call kernel
	
section	.data
msg db 'Displaying 9 stars',0xa ;a message
len equ $ - msg  ;length of message
s2 times 9 db '*'

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

Displaying 9 stars
*********