Kontrol perintah transfer. Lompatan bersyarat dan tanpa syarat Operasi lompatan bersyarat

Selain sarana perhitungan aritmatika, sistem instruksi mikroprosesor juga memiliki sarana konversi data logis. Yang kami maksud dengan logis adalah transformasi data yang didasarkan pada aturan logika formal.

Logika formal bekerja pada tataran pernyataan benar dan salah. Untuk mikroprosesor, ini biasanya berarti 1 dan 0. Komputer menggunakan bahasa nol dan satu, tetapi unit data terkecil yang dioperasikan oleh instruksi mesin adalah byte. Namun, pada tingkat sistem, sering kali diperlukan kemampuan untuk beroperasi pada tingkat yang sangat rendah—tingkat bit.

Beras. 29. Alat pengolah data logis


Sarana transformasi data logis mencakup perintah logis dan operasi logis. Operan dari instruksi assembler umumnya dapat berupa ekspresi, yang pada gilirannya merupakan kombinasi operator dan operan. Di antara operator ini mungkin juga ada operator yang mengimplementasikan operasi logika pada objek ekspresi.

Sebelum memeriksa alat-alat ini secara mendetail, mari kita pertimbangkan apa itu data logis dan operasi apa yang dilakukan padanya.

Data logis

Landasan teori pengolahan data logis adalah logika formal. Ada beberapa sistem logika. Salah satu yang paling terkenal adalah kalkulus proposisional. Pernyataan adalah pernyataan apa pun yang dapat diucapkan kepada keduanya BENAR, atau PALSU.

Kalkulus proposisional adalah seperangkat aturan yang digunakan untuk menentukan benar atau salahnya suatu kombinasi pernyataan.

Kalkulus proposisional dipadukan dengan sangat harmonis dengan prinsip pengoperasian komputer dan metode dasar pemrogramannya. Semua komponen perangkat keras komputer dibangun di atas chip logika. Sistem penyajian informasi dalam komputer pada tingkat paling bawah didasarkan pada konsep bit. Sedikit, yang hanya memiliki dua keadaan (0 (salah) dan 1 (benar)), secara alami cocok dengan kalkulus proposisional.

Menurut teori, operasi logika berikut dapat dilakukan pada pernyataan (pada bit).


1. Negasi (logis BUKAN) - operasi logika pada satu operan yang hasilnya merupakan kebalikan dari operan aslinya.

Operasi ini secara unik ditandai dengan tabel kebenaran berikut (Tabel 12).

Tabel 12. Tabel kebenaran negasi logis

2. Penjumlahan logis (logis inklusif ATAU) - operasi logika pada dua operan yang hasilnya benar (1) jika salah satu atau kedua operan benar (1), dan salah (0) jika kedua operan salah (0).

Operasi ini dijelaskan menggunakan tabel kebenaran berikut (Tabel 13).

Tabel 13. Tabel kebenaran logika inklusif OR

3. Perkalian logis (logis DAN) - operasi logis pada dua operan yang bernilai benar (1) hanya jika kedua operan bernilai benar (1). Dalam semua kasus lainnya, nilai operasinya salah (0).

Operasi ini dijelaskan menggunakan tabel kebenaran berikut (Tabel 14).

Tabel 14. Tabel kebenaran logika AND

4. Penjumlahan eksklusif logis (logis eksklusif ATAU) - operasi logika pada dua operan yang hasilnya benar (1) jika hanya satu dari dua operan yang benar (1), dan salah (0) jika kedua operan salah (0) atau " kebenaran" (1). Operasi ini dijelaskan menggunakan tabel kebenaran berikut (Tabel 15).

Tabel 15. Tabel kebenaran logika eksklusif OR

Sistem instruksi mikroprosesor berisi lima instruksi yang mendukung operasi ini. Instruksi ini melakukan operasi logis pada bit operan. Dimensi operan tentu saja harus sama. Misalnya, jika ukuran operan adalah sebuah kata (16 bit), maka operasi logika dilakukan terlebih dahulu pada bit nol operan, dan hasilnya ditulis sebagai pengganti bit 0 hasilnya. Kemudian perintah secara berurutan mengulangi tindakan ini pada semua bit dari bit pertama hingga kelima belas.

Perintah logis

Sistem instruksi mikroprosesor memiliki serangkaian perintah berikut yang mendukung pekerjaan dengan data logis:

1) dan operand_1, operand_2 – operasi perkalian logis. Perintah ini melakukan operasi logika AND (konjungsi) bitwise pada bit operan operand_1 dan operand_2. Hasilnya ditulis ke operand_1;

2) dan operand_1, operand_2 – operasi penjumlahan logis. Perintah ini melakukan operasi OR logika bitwise (disjungsi) pada bit operan operand_1 dan operand_2. Hasilnya ditulis ke operand_1;

3) hog operand_1, operand_2 – operasi penjumlahan eksklusif yang logis. Instruksi melakukan operasi OR eksklusif logis bitwise pada bit operan operand_1 dan operand_2. Hasilnya ditulis sebagai pengganti operan;

4) uji operand_1, operand_2 – operasi “periksa” (menggunakan perkalian logika). Perintah ini melakukan operasi logika AND bitwise pada bit operan operand_1 dan operand_2. Status operan tetap sama, hanya flag zf, sf, dan pf yang berubah, yang memungkinkan untuk menganalisis status masing-masing bit operan tanpa mengubah statusnya;

5) bukan operan – operasi negasi logis. Perintah ini melakukan inversi bitwise (mengganti nilai dengan nilai sebaliknya) dari setiap bit operan. Hasilnya ditulis sebagai pengganti operan.

Untuk memahami peran instruksi logis dalam sistem instruksi mikroprosesor, sangat penting untuk memahami ruang lingkup penerapannya dan teknik umum penggunaannya dalam pemrograman.

Menggunakan perintah logis itu mungkin alokasi bit individu dalam operan untuk tujuan mengatur, mengatur ulang, membalikkan atau sekadar memeriksa nilai tertentu.

Untuk mengatur pekerjaan seperti itu dengan bit, operand_2 biasanya berperan sebagai topeng. Menggunakan bit yang disetel dalam 1 bit topeng ini, bit operand_1 yang diperlukan untuk operasi tertentu ditentukan. Mari kita tunjukkan perintah logika apa yang dapat digunakan untuk tujuan ini:

1) untuk menyetel bit tertentu ke 1, gunakan perintah dan operand_1, operand_2.

Dalam instruksi ini, operand_2, yang bertindak sebagai mask, harus berisi satu bit sebagai ganti bit-bit yang harus disetel ke 1 di operand_1;

2) untuk mereset bit tertentu ke 0, gunakan perintah dan operand_1, operand_2.

Dalam instruksi ini, operand_2, yang bertindak sebagai mask, harus berisi bit nol sebagai pengganti bit yang harus disetel ke 0 di operand_1;

3) perintah hog operand_1, operand_2 diterapkan:

a) untuk mengetahui bit mana pada operand_1 dan operand yang berbeda;

b) untuk membalikkan keadaan bit yang ditentukan di operand_1.

Saat menjalankan perintah hog, bit mask yang kita minati (operand_2) harus satu, sisanya harus nol;

Untuk memeriksa status bit yang ditentukan, gunakan perintah test operand_1, operand_2 (periksa operand_1).

Bit operand_1 yang dicentang di mask (operand_2) harus bernilai satu. Pengoperasian perintah test mirip dengan algoritma perintah dan, tetapi tidak mengubah nilai operand_1. Hasil dari perintahnya adalah menyetel nilai flag nol zf:

1) jika zf = 0, maka perkalian logika menghasilkan hasil nol, yaitu satu satuan bit mask, yang tidak cocok dengan satu bit operan yang bersangkutan;

2) jika zf = 1, maka perkalian logikanya menghasilkan hasil yang bukan nol, yaitu setidaknya satu satu bit mask cocok dengan satu bit operand_1 yang sesuai.

Untuk bereaksi terhadap hasil perintah pengujian, disarankan untuk menggunakan perintah lompat jnz label (Lompat jika Bukan Nol) - lompat jika bendera nol zf bukan nol, atau perintah dengan tindakan sebaliknya - label jz (Lompat jika Nol) - lompat jika bendera nol zf = 0.

Dua perintah berikutnya mencari bit pertama operan yang disetel ke 1. Anda dapat mencari dari awal atau akhir operan:

1) bsf operand_1, operand_2 (Bit Scanning Forward) – memindai bit ke depan. Instruksi memindai bit operand_2 dari yang paling tidak signifikan hingga yang paling signifikan (dari bit 0 hingga bit paling signifikan) untuk mencari bit pertama yang disetel ke 1. Jika ditemukan, jumlah bit ini dimasukkan ke dalam operand_1 sebagai nilai integer. Jika semua bit operand_2 adalah 0, maka flag nol zf disetel ke 1, jika tidak, flag zf disetel ulang ke 0;

2) bsr operand_1, operand_2 (Bit Scanning Reset) – memindai bit dalam urutan terbalik. Instruksi mencari (memindai) bit-bit operand_2 dari yang paling signifikan ke yang paling tidak signifikan (dari bit yang paling signifikan ke bit 0) mencari bit pertama yang disetel ke 1. Jika ditemukan, jumlah bit ini dimasukkan ke dalam operand_1 sebagai nilai bilangan bulat. Penting agar posisi bit pertama di sebelah kiri masih dihitung relatif terhadap bit 0. Jika semua bit operan_2 sama dengan 0, maka flag nol zf disetel ke 1, jika tidak, flag zf disetel ulang ke 0 .

Pada model mikroprosesor Intel terbaru, beberapa perintah lagi telah muncul dalam kelompok perintah logis yang memungkinkan akses ke satu bit operan tertentu. Operan dapat ditempatkan di memori atau di register tujuan umum. Posisi bit ditentukan oleh offset bit relatif terhadap bit paling tidak signifikan dari operan. Nilai offset dapat ditentukan baik sebagai nilai langsung atau terkandung dalam register tujuan umum. Anda dapat menggunakan hasil dari perintah bsr dan bsf sebagai nilai offset. Semua instruksi menetapkan nilai bit yang dipilih ke bendera CE

1) operan bt, bit offset (Bit Test) – periksa bitnya. Perintah mentransfer nilai bit ke flag cf;

2) operan bts, bit offset (Bit Test and Set) – memeriksa dan mengatur bit. Instruksi mentransfer nilai bit ke flag CF dan kemudian menyetel bit yang akan diuji ke 1;

3) btr operasional, bit offset (Bit Test and Reset) – memeriksa dan mereset bit. Instruksi mentransfer nilai bit ke flag CF dan kemudian menyetel bit ini ke 0;

4) operan btc, bit offset (Bit Test and Convert) – periksa dan balikkan bit. Instruksi mentransfer nilai bit ke flag cf dan kemudian membalikkan nilai bit tersebut.

Pergeseran Perintah

Instruksi dalam grup ini juga menyediakan manipulasi bit individual operan, tetapi dengan cara yang berbeda dari instruksi logis yang dibahas di atas.

Semua instruksi shift memindahkan bit dalam bidang operan ke kiri atau kanan tergantung pada opcode. Semua instruksi shift memiliki struktur yang sama - operan polisi, shift_counter.

Jumlah bit yang digeser – shift_counter – terletak di tempat operan kedua dan dapat ditentukan dengan dua cara:

1) secara statis, yang melibatkan penentuan nilai tetap menggunakan operan langsung;

2) secara dinamis, yang berarti menyimpan nilai shift counter pada register cl sebelum mengeksekusi instruksi shift.

Berdasarkan besar kecilnya register cl, terlihat jelas bahwa nilai shift counter dapat berkisar antara 0 hingga 255. Namun nyatanya hal tersebut tidak sepenuhnya benar. Untuk tujuan optimasi, mikroprosesor hanya menerima nilainya lima bit paling tidak signifikan counter, yaitu nilainya berkisar dari 0 hingga 31.

Semua perintah shift mengatur carry flag lih.

Saat bit-bit digeser melampaui operan, bit-bit tersebut terlebih dahulu mengenai carry flag, menyetelnya sama dengan nilai bit berikutnya yang berakhir di luar operan. Ke mana bit ini selanjutnya bergantung pada jenis instruksi shift dan algoritma program.

Berdasarkan prinsip pengoperasiannya, perintah shift dapat dibagi menjadi dua jenis:

1) perintah pergeseran linier;

2) perintah shift siklik.

Perintah pergeseran linier

Perintah jenis ini mencakup perintah yang melakukan shift sesuai dengan algoritma berikut:

1) bit "didorong" berikutnya menyetel bendera CF;

2) bit yang dimasukkan ke dalam operan dari ujung yang lain memiliki nilai 0;

3) ketika bit berikutnya digeser, ia masuk ke flag CF, dan nilai bit yang digeser sebelumnya hilang! Perintah pergeseran linier dibagi menjadi dua subtipe:

1) perintah pergeseran linier logis;

2) perintah pergeseran linier aritmatika.

Perintah pergeseran linier logis meliputi yang berikut:

1) operan shl, shift_counter (Shift Logical Left) – pergeseran logis ke kiri. Isi operan digeser ke kiri dengan jumlah bit yang ditentukan oleh nilai shift_count. Di sebelah kanan (di posisi bit paling tidak signifikan) dimasukkan angka nol;

2) operan shr, shift_counter (Shift Logical Right) – pergeseran logis ke kanan. Isi operan digeser ke kanan dengan jumlah bit yang ditentukan oleh nilai shift_count. Di sebelah kiri (di posisi bit tanda paling signifikan) dimasukkan angka nol.

Gambar 30 menunjukkan cara kerja perintah ini.

Beras. 30. Skema pengoperasian perintah pergeseran logis linier


Instruksi pergeseran linier aritmatika berbeda dari instruksi pergeseran logis karena instruksi tersebut beroperasi dengan cara khusus pada bit tanda operan.

1) operan sal, shift_counter (Shift Arithmetic Left) – pergeseran aritmatika ke kiri. Isi operan digeser ke kiri dengan jumlah bit yang ditentukan oleh nilai shift_count. Di sebelah kanan (di posisi bit paling tidak signifikan) ada angka nol. Perintah sal tidak mempertahankan tanda, tapi menyetel bendera dengan/jika terjadi perubahan tanda bit lain yang bisa ditarik. Jika tidak, perintah sal sepenuhnya mirip dengan perintah shl;

2) operan sar, shift_counter (Shift Arithmetic Right) – pergeseran aritmatika ke kanan. Isi operan digeser ke kanan dengan jumlah bit yang ditentukan nilainya shift_counter. Di sebelah kiri, angka nol dimasukkan ke dalam operan. Perintah sar mempertahankan tanda tersebut, memulihkannya setelah menggeser setiap bit berikutnya.

Gambar 31 menunjukkan cara kerja instruksi pergeseran aritmatika linier.


Beras. 31. Skema pengoperasian perintah pergeseran aritmatika linier

Putar Perintah

Perintah rotasi shift adalah perintah yang menyimpan nilai bit yang digeser. Ada dua jenis perintah rotasi:

1) perintah shift siklik sederhana;

2) perintah shift siklik melalui carry flag lih.

Kepada tim siklus sederhana shift meliputi:

1) operan rol, shift_counter (Putar ke Kiri) – pergeseran siklik ke kiri. Isi operan digeser ke kiri sesuai jumlah bit yang ditentukan oleh operan shift_counter. Bit yang digeser ke kiri ditulis ke operan yang sama di sebelah kanan;

2) operan gog, shift_counter (Putar ke Kanan) – pergeseran siklik ke kanan. Isi operan digeser ke kanan sesuai jumlah bit yang ditentukan oleh operan shift_counter. Bit yang digeser ke kanan ditulis ke operan yang sama di sebelah kiri.

Beras. 32. Skema pengoperasian perintah shift siklik sederhana


Seperti dapat dilihat dari Gambar 32, instruksi pergeseran siklik sederhana melakukan satu tindakan yang berguna selama operasinya, yaitu: bit yang digeser secara siklis tidak hanya didorong ke dalam operan dari ujung yang lain, tetapi pada saat yang sama nilainya menjadi nilai dari bendera CE

Putar Perintah melalui membawa bendera CF berbeda dari perintah pergeseran siklik sederhana di mana bit yang digeser tidak langsung menuju ke operan dari ujung lainnya, tetapi ditulis terlebih dahulu ke flag carry CE Hanya eksekusi selanjutnya dari instruksi shift ini (dengan asumsi dieksekusi dalam satu loop) yang menghasilkan bit yang sebelumnya digeser ditempatkan di ujung operan yang lain.(Gbr. 33).

Untuk perintah pergeseran siklik melalui membawa bendera berikut ini terkait:

1) operan rcl, shift_counter (Putar melalui Carry Left) – pergeseran siklik ke kiri melalui carry.

Isi operan digeser ke kiri sesuai jumlah bit yang ditentukan oleh operan shift_counter. Bit yang digeser secara bergantian menjadi nilai carry flag lih.

2) operan rcg, shift_counter (Putar melalui Carry Right) – pergeseran siklik ke kanan melalui carry.

Isi operan digeser ke kanan sesuai jumlah bit yang ditentukan oleh operan shift_counter. Bit yang digeser secara bergantian menjadi nilai carry flag CF.

Beras. 33. Perintah pergeseran siklik melalui carry flag CF


Dari Gambar 33 jelas bahwa ketika berpindah melalui carry flag, elemen perantara muncul, dengan bantuan yang, khususnya, dimungkinkan untuk mengganti bit yang digeser secara siklis, khususnya, ketidakcocokan urutan bit.

Yang kami maksud dengan ketidakcocokan urutan bit adalah tindakan yang memungkinkan kita melokalisasi dan mengekstrak bagian yang diperlukan dari urutan ini dan menuliskannya ke lokasi lain.

Perintah shift tambahan

Sistem perintah model mikroprosesor Intel terbaru, dimulai dengan i80386, berisi perintah shift tambahan yang memperluas kemampuan yang telah kita bahas sebelumnya. Ini adalah perintah shift presisi ganda: 1) sebaiknya operand_1, operand_2, shift_counter – pergeseran kiri presisi ganda. Perintah shld melakukan penggantian dengan menggeser bit operand_1 ke kiri, mengisi bitnya di sebelah kanan dengan nilai bit yang dipindahkan dari operand_2 sesuai diagram pada Gambar. 34. Jumlah bit yang akan digeser ditentukan oleh nilainya shift_counter, operan_2 tidak berubah.


Beras. 34. Skema perintah shld


2) shrd operand_1, operand_2, shift_counter – pergeseran kanan presisi ganda. Instruksi melakukan penggantian dengan menggeser bit-bit operand_1 ke kanan, mengisi bit-bitnya di sebelah kiri dengan nilai bit-bit yang dipindahkan dari operand_2 sesuai diagram pada Gambar 35. Banyaknya bit yang digeser ditentukan oleh nilainya shift_counter, yang bisa berada di kisaran 0... 31. Nilai ini dapat ditentukan sebagai operan langsung atau terkandung dalam register cl. Arti operan_2 tidak berubah.

Beras. 35. Skema perintah shrd


Seperti yang kami catat, perintah shld dan shrd melakukan pergeseran hingga 32 bit, namun karena kekhasan menentukan operan dan algoritma operasi, perintah ini dapat digunakan untuk bekerja dengan panjang bidang hingga 64 bit.

2. Kontrol Perintah Transfer

Kami bertemu dengan beberapa tim yang membentuk linier bagian dari program. Masing-masing dari mereka umumnya melakukan beberapa tindakan untuk mengkonversi atau mentransfer data, setelah itu mikroprosesor mentransfer kendali ke perintah berikutnya. Namun sangat sedikit program yang berjalan secara konsisten. Biasanya ada titik-titik dalam suatu program di mana keputusan harus dibuat tentang perintah mana yang akan dijalankan selanjutnya. Solusi ini bisa berupa:

1) tanpa syarat - pada titik ini perlu untuk mentransfer kendali bukan ke perintah berikutnya, tetapi ke perintah lain, yang terletak agak jauh dari perintah saat ini;

2) bersyarat – keputusan tentang perintah mana yang akan dijalankan selanjutnya dibuat berdasarkan analisis beberapa kondisi atau data.

Program adalah rangkaian perintah dan data yang menempati sejumlah ruang RAM. Ruang memori ini dapat bersebelahan atau terdiri dari beberapa fragmen.

Mikroprosesor mengetahui instruksi program mana yang harus dieksekusi selanjutnya melalui isi sepasang register cs:(e)ip:

1) cs – register kode segmen, yang berisi alamat fisik (dasar) dari segmen kode saat ini;

2) eip/ip – register penunjuk instruksi, yang berisi nilai yang mewakili offset memori dari instruksi berikutnya yang akan dieksekusi relatif terhadap awal segmen kode saat ini.

Register spesifik mana yang akan digunakan bergantung pada apakah mode pengalamatan diatur ke use16 atau use32. Jika penggunaan 16 ditentukan, maka ip digunakan, jika penggunaan32, maka eip digunakan.

Dengan demikian, instruksi transfer kontrol mengubah isi register cs dan eip/ip, sebagai akibatnya mikroprosesor memilih untuk mengeksekusi bukan perintah program berikutnya secara berurutan, tetapi perintah di beberapa bagian lain dari program. Konveyor di dalam mikroprosesor diatur ulang.

Berdasarkan prinsip operasinya, perintah mikroprosesor yang memastikan pengorganisasian transisi dalam program dapat dibagi menjadi 3 kelompok:

1. Perintah untuk pengalihan kendali tanpa syarat:

1) perintah lompat tanpa syarat;

2) perintah untuk memanggil suatu prosedur dan kembali dari suatu prosedur;

3) perintah untuk memanggil interupsi perangkat lunak dan kembali dari interupsi perangkat lunak.

2. Transfer perintah kontrol bersyarat:

1) perintah lompat berdasarkan hasil perintah perbandingan halaman;

2) perintah peralihan berdasarkan keadaan bendera tertentu;

3) perintah untuk menavigasi isi register ecx/cx.

3. Perintah kontrol siklus:

1) perintah untuk mengatur siklus dengan counter ecx/cx;

2) perintah untuk mengatur siklus dengan penghitung ecx/cx dengan kemungkinan keluar lebih awal dari siklus dalam kondisi tambahan.

Lompatan tanpa syarat

Pembahasan sebelumnya telah mengungkap beberapa rincian mekanisme transisi. Instruksi lompat memodifikasi register penunjuk instruksi eip/ip dan mungkin register segmen kode cs. Apa sebenarnya yang perlu diubah bergantung pada:

1) pada jenis operan pada perintah lompat tanpa syarat (dekat atau jauh);

2) dari indikasi sebelum alamat lompat (dalam perintah lompat) pengubah; dalam hal ini, alamat lompat itu sendiri dapat ditempatkan secara langsung di perintah (lompatan langsung), atau di register atau sel memori (lompatan tidak langsung).

Pengubah dapat mengambil nilai berikut:

1) dekat ptr – transisi langsung ke label dalam segmen kode saat ini. Hanya register eip/ip yang dimodifikasi (tergantung pada jenis segmen kode use16 atau use32 yang ditentukan) berdasarkan alamat (label) yang ditentukan dalam perintah atau ekspresi menggunakan karakter ekstraksi nilai - $;

2) ptr jauh – transisi langsung ke label di segmen kode lain. Alamat lompatan ditentukan sebagai operan atau alamat langsung (label) dan terdiri dari pemilih 16-bit dan offset 16/32-bit, yang masing-masing dimuat ke dalam register cs dan ip/eip;

3) kata ptr – transisi tidak langsung ke label dalam segmen kode saat ini. Hanya eip/ip yang dimodifikasi (dengan nilai offset dari memori pada alamat yang ditentukan dalam perintah, atau dari register). Ukuran offset 16 atau 32 bit;

4) dword ptr – transisi tidak langsung ke label di segmen kode lain. Kedua register – cs dan eip/ip – dimodifikasi (dengan nilai dari memori - dan hanya dari memori, dari register). Kata/kata pertama dari alamat ini mewakili offset dan dimuat ke ip/eip; kata kedua/ketiga dimuat ke cs. jmp perintah lompat tanpa syarat

Sintaks dari perintah lompat tanpa syarat adalah jmp [pengubah] jump_address - lompatan tanpa syarat tanpa menyimpan informasi tentang titik kembali.

Jump_address adalah alamat label atau alamat area memori tempat penunjuk lompat berada.

Secara total, sistem instruksi mikroprosesor berisi beberapa kode instruksi mesin lompat tanpa syarat jmp.

Perbedaannya ditentukan oleh jarak transisi dan metode penentuan alamat target. Jangkauan transisi ditentukan oleh lokasi operan alamat_transisi. Alamat ini mungkin berada di segmen kode saat ini atau di segmen lainnya. Dalam kasus pertama, transisi disebut intrasegmental, atau orang yang dicintai, di detik – intersegmental, atau jauh Lompatan intra-segmen mengasumsikan bahwa hanya isi register eip/ip yang diubah.

Ada tiga opsi untuk penggunaan perintah jmp intra-segmen:

1) lurus pendek;

2) lurus;

3) tidak langsung.


Prosedur

Bahasa rakitan memiliki beberapa alat yang memecahkan masalah duplikasi bagian kode program. Ini termasuk:

1) mekanisme prosedur;

2) perakit makro;

3) mekanisme interupsi.

Prosedurnya, sering disebut subrutin - ini adalah unit fungsional dasar dekomposisi (pembagian menjadi beberapa bagian) dari suatu tugas. Prosedur adalah sekelompok perintah untuk menyelesaikan subtugas tertentu dan memiliki sarana untuk memperoleh kendali dari titik memanggil tugas tingkat yang lebih tinggi dan mengembalikan kendali ke titik ini.

Dalam kasus yang paling sederhana, suatu program dapat terdiri dari satu prosedur. Dengan kata lain, prosedur dapat didefinisikan sebagai sekumpulan perintah yang diformat dengan benar, yang, setelah dijelaskan, dapat dipanggil, jika perlu, di mana saja dalam program.

Untuk menggambarkan urutan perintah sebagai suatu prosedur, bahasa assembly menggunakan dua arahan: PROC dan ENDP.

Sintaks untuk menjelaskan prosedurnya adalah sebagai berikut (Gbr. 36).


Beras. 36. Sintaks untuk mendeskripsikan suatu prosedur dalam suatu program


Dari Gambar 36 terlihat bahwa pada procedure header (PROC directive) hanya nama prosedur saja yang wajib diisi. Di antara sejumlah besar operan direktif PROC, [jarak] layak mendapat perhatian khusus. Atribut ini dapat mengambil nilai dekat atau jauh dan mencirikan kemungkinan memanggil prosedur dari segmen kode lain. Secara default, atribut [jarak] diatur ke dekat.

Prosedur dapat ditempatkan di mana saja dalam program, tetapi sedemikian rupa sehingga kendali tidak jatuh ke dalamnya secara tidak sengaja. Jika suatu prosedur dimasukkan ke dalam aliran perintah umum, maka mikroprosesor akan menganggap perintah prosedur sebagai bagian dari aliran ini dan, karenanya, akan menjalankan perintah prosedur.

Lompatan bersyarat

Mikroprosesor memiliki 18 instruksi lompatan bersyarat. Perintah ini memungkinkan Anda untuk memeriksa:

1) hubungan antara operan yang ditandatangani (“lebih – lebih sedikit”);

2) hubungan antara operan yang tidak ditandatangani (“di atas – di bawah”);

3) status bendera aritmatika ZF, SF, CF, OF, PF (tetapi bukan AF).

Perintah lompat bersyarat memiliki sintaks yang sama:

jcc transisi_label

Seperti yang Anda lihat, kode mnemonik semua perintah dimulai dengan "j" - dari kata melompat(melambung), dia - mendefinisikan kondisi spesifik yang dianalisis oleh perintah.

Mengenai operan label_transisi, maka label ini hanya dapat ditempatkan dalam segmen kode saat ini; transfer kendali antarsegmen dalam transisi bersyarat tidak diperbolehkan. Dalam hal ini, pertanyaan tentang pengubah, yang ada dalam sintaks perintah lompat tanpa syarat, menghilang. Pada model mikroprosesor awal (i8086, i80186 dan i80286), instruksi lompat bersyarat hanya dapat melakukan lompatan pendek - jarak -128 hingga +127 byte dari instruksi yang mengikuti instruksi lompat bersyarat. Dimulai dengan model mikroprosesor 80386, batasan ini dihilangkan, tetapi seperti yang Anda lihat, hanya dalam segmen kode saat ini.

Untuk membuat keputusan tentang ke mana kendali akan ditransfer dengan perintah lompat bersyarat, pertama-tama harus dibuat suatu kondisi yang menjadi dasar pengambilan keputusan untuk mentransfer kendali.

Sumber dari kondisi ini mungkin:

1) perintah apa pun yang mengubah status bendera aritmatika;

2) halaman perintah bandingkan, yang membandingkan nilai dua operan;

3) status register ecx/cx.


perintah bandingkan cmp

Perintah bandingkan halaman memiliki prinsip operasi yang menarik. Ini benar-benar sama dengan perintah pengurangan - sub operan, operan_2.

Perintah halaman, seperti perintah sub, mengurangi operan dan menyetel flag. Satu-satunya hal yang tidak dilakukan adalah menuliskan hasil pengurangan sebagai pengganti operan pertama.

Sintaks perintah halaman adalah halaman operand_1, operand_2 (bandingkan) – membandingkan dua operan dan menyetel flag berdasarkan hasil perbandingan.

Bendera yang disetel oleh perintah halaman dapat dianalisis menggunakan perintah cabang bersyarat khusus. Sebelum kita melihatnya, mari kita perhatikan sedikit mnemonik dari perintah lompat bersyarat ini (Tabel 16). Memahami notasi saat membentuk nama perintah lompat bersyarat (elemen dalam nama perintah jcc, yang kami tunjuk) akan memudahkan untuk menghafalnya dan penggunaan praktis lebih lanjut.

Tabel 16. Arti singkatan pada nama perintah jcc
Tabel 17. Daftar perintah lompat bersyarat untuk halaman perintah operand_1, operand_2

Jangan kaget dengan fakta bahwa nilai bendera yang sama berhubungan dengan beberapa kode mnemonik perintah lompat bersyarat yang berbeda (dipisahkan satu sama lain dengan garis miring pada Tabel 17). Perbedaan nama ini disebabkan oleh keinginan para perancang mikroprosesor untuk mempermudah penggunaan instruksi lompat bersyarat dalam kombinasi dengan kelompok instruksi tertentu. Oleh karena itu, nama yang berbeda mencerminkan orientasi fungsional yang berbeda. Namun, fakta bahwa perintah-perintah ini merespons tanda yang sama menjadikannya benar-benar setara dan setara dalam program. Oleh karena itu, pada Tabel 17 mereka dikelompokkan bukan berdasarkan nama, tetapi berdasarkan nilai bendera (kondisi) yang menjadi reaksinya.


Petunjuk Cabang Bersyarat dan Bendera

Notasi mnemonik untuk beberapa perintah lompat bersyarat mencerminkan nama bendera tempat perintah tersebut dioperasikan, dan memiliki struktur berikut: karakter "j" muncul lebih dulu. (Melompat, transisi), yang kedua adalah sebutan bendera atau simbol negasi “n”, diikuti dengan nama bendera. Struktur tim ini mencerminkan tujuannya. Jika tidak ada karakter “n”, maka status bendera dicentang; jika sama dengan 1, transisi dilakukan ke label lompat. Jika karakter “n” ada, maka status bendera diperiksa kesetaraannya 0, dan jika berhasil, lompatan dilakukan ke label lompatan.

Kode mnemonik perintah, nama flag dan kondisi transisi diberikan pada Tabel 18. Perintah ini dapat digunakan setelah perintah apa pun yang mengubah flag yang ditentukan.

Tabel 18. Perintah dan bendera lompat bersyarat

Jika Anda melihat lebih dekat pada Tabel 17 dan 18, Anda dapat melihat bahwa banyak perintah lompat bersyarat di dalamnya setara, karena keduanya didasarkan pada analisis flag yang sama.


Instruksi lompat bersyarat dan register ecx/cx

Arsitektur mikroprosesor melibatkan penggunaan spesifik dari banyak register. Misalnya, register EAX/AX/AL digunakan sebagai akumulator, dan register BP dan SP digunakan untuk bekerja dengan tumpukan. Register ESH/CX juga memiliki tujuan fungsional tertentu: ia menjalankan peran tersebut menangkal dalam perintah kontrol loop dan saat bekerja dengan string karakter. Ada kemungkinan bahwa secara fungsional perintah lompat bersyarat yang terkait dengan register ecx/cx akan lebih tepat diklasifikasikan sebagai kelompok perintah ini.

Sintaks untuk perintah cabang bersyarat ini adalah:

1) jcxz jump_label (Lompat jika ex adalah Nol) – lompat jika cx adalah nol;

2) jecxz jump_label (Lompat Sama dengan exx Nol) – lompat jika exx adalah nol.

Perintah-perintah ini sangat nyaman digunakan saat mengatur loop dan saat bekerja dengan string karakter.

Perlu dicatat bahwa ada batasan yang melekat pada perintah jcxz/jecxz. Tidak seperti instruksi transfer kontrol bersyarat lainnya, instruksi jcxz/jecxz hanya dapat mengatasi lompatan pendek - pada -128 byte atau +127 byte dari instruksi berikutnya.

Siklus pengorganisasian

Siklus, seperti yang Anda ketahui, adalah struktur algoritmik yang penting, yang tanpanya, mungkin, tidak ada satu program pun yang dapat melakukannya. Anda dapat mengatur eksekusi siklik dari bagian tertentu dari program, misalnya, menggunakan perintah transfer bersyarat atau perintah lompat tanpa syarat jmp. Dengan organisasi siklus jenis ini, semua operasi yang terkait dengan organisasinya dilakukan secara manual. Namun, mengingat pentingnya elemen algoritmik seperti siklus, pengembang mikroprosesor memperkenalkan sekelompok tiga perintah ke dalam sistem perintah untuk memfasilitasi pemrograman siklus. Perintah ini juga menggunakan register ecx/cx sebagai penghitung siklus.

Mari kita berikan penjelasan singkat tentang perintah ini: 1) loop jump_label (Loop) – ulangi siklusnya. Perintah ini memungkinkan Anda untuk mengatur loop yang mirip dengan loop for dalam bahasa tingkat tinggi dengan pengurangan penghitung loop secara otomatis. Tugas tim adalah melakukan hal berikut:

b) membandingkan register ESX/CX dengan nol: jika (ECX/CX) = 0, maka kontrol ditransfer ke perintah berikutnya setelah loop;

2) loope/loopz label_transisi

Perintah loope dan loopz adalah sinonim mutlak. Tugas perintahnya adalah melakukan tindakan berikut:

a) penurunan register ESH/CX;

c) analisis keadaan flag nol ZF jika (ECX/CX) = 0 atau XF = 0, kontrol ditransfer ke perintah berikutnya setelah loop.

3) loopne/loopnz transisi_label

Perintah loopne dan loopnz juga merupakan sinonim mutlak. Tugas perintahnya adalah melakukan tindakan berikut:

a) penurunan register ESH/CX;

b) membandingkan register ESX/CX dengan nol;

c) analisis keadaan bendera nol ZF: jika (ECX/CX) = 0 atau ZF = 1, kontrol ditransfer ke perintah berikutnya setelah loop.

Perintah loope/loopz dan loopne/loopnz memiliki prinsip pengoperasian yang terbalik. Mereka memperluas tindakan perintah loop dengan menganalisis tambahan flag zf, yang memungkinkan untuk mengatur jalan keluar awal dari loop, menggunakan flag ini sebagai indikator.

Kerugian dari perintah loop, loope/loopz dan loopne/loopnz adalah mereka hanya mengimplementasikan lompatan pendek (dari -128 hingga +127 byte). Untuk bekerja dengan loop panjang, Anda perlu menggunakan perintah cabang bersyarat dan perintah jmp, jadi cobalah untuk menguasai kedua metode pengorganisasian loop.

Dalam kelompok perintah transfer kendali, ada empat jenis perintah: cabang tak bersyarat, cabang bersyarat, loop dan interupsi .

Perintah lompat tanpa syarat. Termasuk tiga kode mnemonik: JMP (lompatan tanpa syarat), CALL (panggilan subrutin) dan RET (kembali dari subrutin).

Perintah JMP memungkinkan Anda untuk melompat ke titik mana pun dalam program, yang terletak di segmen program saat ini dan di segmen lain. Saat melompat ke dalam segmen program saat ini, tiga format instruksi JMP pertama digunakan.

Format pertama menyediakan transisi ke titik sembarang dalam program dalam segmen program saat ini, yang mana offset 16-bit ditambahkan ke konten IP dalam kode komplemen dua, bit paling signifikan yang ditandatangani. Format kedua yang dipersingkat memungkinkan Anda untuk melompat ke suatu titik dalam program tidak lebih dari -128-f-127 alamat dari instruksi JMP. Terakhir, format ketiga memuat penunjuk instruksi dengan nomor 16-bit, yang terletak di alamat eksekutif EA, ditentukan oleh postbyte. Transisi ini disebut tidak langsung karena digunakan pengalamatan tidak langsung.

Untuk mengimplementasikan lompatan tanpa syarat ke titik program yang terletak di luar segmen program saat ini, ketika register segmen CS perlu diisi ulang, format instruksi JMP keempat dan kelima digunakan.

Format keempat mendefinisikan transisi antarsegmen langsung, di mana byte kedua dan ketiga dari format tersebut menunjukkan alamat relatif dari titik transisi, dan byte keempat dan kelima menunjukkan nilai CS yang baru. Format kelima, menggunakan postbyte, memungkinkan Anda menentukan alamat eksekutif EA, di mana alamat relatif titik transisi berada (dalam byte memori dengan alamat EA, EA+1), dan nilai CS baru (dalam byte memori EA+2, EA+3).

Perintah CALL memungkinkan Anda memanggil subrutin yang terletak di segmen program saat ini atau di area memori lain. Ini memiliki format yang sama dengan perintah JMP, hanya saja lebih pendek. Berbeda dengan perintah JMP dengan format serupa, perintah CALL, sebelum mengubah nilai IP atau IP dan CS, secara otomatis menulis nilai saat ini dari register ini ke tumpukan, yang memastikan bahwa titik kembali dari subrutin diingat.

Untuk kembali dari subrutin, gunakan perintah RET, yang mentransfer kontrol ke alamat pengirim yang dimasukkan ke tumpukan saat menjalankan perintah CALL sebelumnya. Ketika kembali dari subrutin yang terletak di segmen program saat ini, dua format pertama dari instruksi RET digunakan, dan format kedua berbeda dari yang pertama karena konstanta yang ditulis dalam byte ke-2 dan ke-3 dari instruksi ditambahkan ke konten. penunjuk tumpukan. Hal ini memungkinkan, bersamaan dengan kembalinya dari subrutin, untuk mengatur ulang parameter yang ditulis ke tumpukan selama eksekusi subrutin ini dan tidak digunakan di masa mendatang.

Untuk pengembalian antarsegmen, format RET ketiga dan keempat digunakan, yang menyediakan pemulihan konten penunjuk instruksi dan segmen program.

Perintah lompat bersyarat. Kontrol transfer tergantung pada hasil operasi sebelumnya. Ada tiga jenis lompatan bersyarat yang digunakan untuk membangun hubungan antara bilangan bertanda, bilangan tak bertanda, dan bilangan arbitrer. Dalam dua jenis pertama, kode mnemonik perintah yang berbeda dipilih untuk hubungan yang sama antar angka, karena nilai bendera yang berbeda sesuai dengan hubungan yang sama antara angka yang ditandatangani dan tidak ditandatangani.

Dalam kode mnemonik perintah lompat bersyarat, ketika membandingkan angka bertanda, huruf tersebut digunakan untuk menunjukkan kondisi “lebih besar dari” G (Lebih Besar- lebih), dan untuk menunjuk - huruf "kurang". L (Kurang- lebih sedikit). Untuk kondisi serupa, saat membandingkan angka yang tidak ditandatangani, huruf digunakan masing-masing A (Di atas- di atas) dan Di bawah- di bawah). Kondisi kesetaraan dilambangkan dengan huruf E (Setara- sama), dan kegagalan untuk memenuhi beberapa kondisi - secara tertulis T(Tidak- Bukan). Perlu dicatat bahwa diperbolehkan menggunakan dua kode mnemonik yang berbeda untuk setiap perintah; misalnya, kode mnemonik JL dan JNGF adalah ekuivalen, karena kondisi “kurang dari” dan “tidak lebih besar dari atau sama dengan” adalah identik.

Daftar lengkap kode mnemonik perintah, kondisi yang diperiksa, serta kombinasi flag Boolean yang sesuai dan nilainya diberikan dalam Tabel. 1.4.

Tabel 1.4

Kode mnemonik perintah Kondisi Arti dari bendera
Untuk nomor yang ditandatangani
JL/JNGE Kurang/tidak lebih dari atau sama dengan SF + DARI = aku
JNL/JGE Tidak kurang dari/lebih besar dari atau sama dengan SF + DARI = 0
JG/JNLE Lebih dari/tidak kurang dari atau sama dengan (SF + OF) V ZF = 0
JNG/JLE Tidak lebih besar dari/kurang dari atau sama dengan Untuk nomor yang tidak bertanda tangan (SF + OF) V ZF = aku
JB/JNAE Kurang/tidak lebih dari atau sama dengan CF=1
JNB/JAE Tidak kurang dari/lebih besar dari atau sama dengan CF=0
JA/JNBE Lagi CF V ZF = 0
JNA/JBE Tidak ada lagi Untuk data lainnya CF V ZF = 1
JE/JZ Sama/nol ZF = 1
JNE/JNZ Tidak sama/nol ZF = 0
JS Secara minus SF = 1
JNS Di sisi positifnya SF = 0
JO Meluap DARI = aku
JNO Dengan tidak adanya overflow DARI = 0
JP/JPE Bahkan dengan paritas PF = 1
JNP/JPO Dengan paritas ganjil PF = 0

Semua instruksi lompatan bersyarat memiliki format dua byte yang sama, byte pertama yang menentukan kode operasi (OPC), dan yang kedua adalah offset 8-bit, yang diperlakukan sebagai nomor yang ditandatangani dan oleh karena itu memungkinkan perubahan alamat dalam rentang tersebut. dari -128 hingga + 127. Jika transisi yang lebih jauh (“jauh”) diperlukan ketika suatu kondisi terpenuhi, perintah transisi tanpa syarat tambahan digunakan.

Waktu eksekusi setiap instruksi lompat bersyarat ditunjukkan untuk dua kasus: 1) kondisi terpenuhi dan kontrol benar-benar ditransfer sesuai dengan offset, 2) kondisi tidak terpenuhi, sehingga kontrol ditransfer ke instruksi berikutnya.

Tim untuk mengatur siklus. Diperkenalkan ke dalam CPU untuk kenyamanan melakukan siklus komputasi. Ini termasuk kode mnemonik berikut: LOOP (loop sampai (CX) tidak sama dengan 0), LOOPNZ/LOOPNE (loop sampai nol/tidak sama dengan), LOOPZ/LOOPE (loop sampai nol/sama dengan) dan JCXZ (melompat pada nol di SH). Masing-masing perintah ini memiliki format dua byte, byte kedua yang menentukan offset 8-bit yang digunakan untuk mengatur lompatan. Offset ini diperlakukan sebagai nomor yang ditandatangani dan diperpanjang hingga 16 bit sebelum alamat lompatan dihitung.

Dengan menggunakan perintah loop bersama dengan perintah untuk memanipulasi elemen string, Anda dapat membuat program konversi string yang cukup rumit. Mari kita perhatikan contoh pembuatan program untuk mengubah string data yang ditulis dalam sistem bilangan heksadesimal menjadi beberapa kode yang tabel konversinya terletak di memori dari alamat awal yang ditentukan dalam BX, seperti yang diperlukan untuk menggunakan perintah konversi tabel untuk XLAT kode. Mari kita asumsikan lebih lanjut bahwa string sumber berisi 80 elemen dan terletak di memori dari alamat awal relatif 100, dan string hasil harus ditempatkan dari alamat relatif 200. Program yang mengubah string sumber menjadi string hasil, dengan nilai bendera arah DF=0, akan berbentuk :

MOVSI ,100
MOV DI ,200
MOV CX, 80

Perintah konversi tabel XLAT yang dijelaskan pada 1.2 digunakan di sini.

Perintah interupsi. Termasuk tiga mnemonik: INT (interrupt), INTO (interrupt on overflow), dan IRET (interrupt return).

Interupsi perintah INT pada v=1 memiliki format dua byte, byte kedua berisi angka 8-bit yang menentukan tipenya (jenis) atau tingkat interupsi. Dengan perintah INT jenis Prosesor melanjutkan untuk mengeksekusi program layanan interupsi pada tingkat yang ditentukan, dan tindakan yang diperlukan untuk memastikan kembali ke titik interupsi dilakukan secara otomatis. Tindakan ini adalah sebagai berikut: isi register flag F ditulis ke stack (PUSHF), flag IF dan TF direset, nilai register CS saat ini dan penunjuk instruksi IP ditulis ke stack.

Untuk menentukan alamat awal program layanan sesuai dengan nilainya jenis Tabel tingkat interupsi digunakan. Untuk masing-masing dari 256 level interupsi dalam tabel ini, empat byte dialokasikan: dua byte pertama menentukan nilai penunjuk instruksi IP, yang kedua - nilai register segmen CS. Empat byte ini menentukan alamat awal program layanan (pasangan CS, nilai IP), yang pertama-tama harus ditulis ke sel memori pada alamat absolut 0-3FFH. Alamat tabel sesuai dengan yang ditentukan dalam perintah INT jenis tingkat interupsi ditentukan dalam CPU sebagai berikut. Setelah menyimpan nilai CS dan GR saat ini di tumpukan, dilakukan pemuatan: CS = jenis X 4 + 2 dan IP = jenis X 4. Nilai CS dan IP baru masing-masing diambil dari sel alamat jenis X 4 + 2 Dan jenis X 4, menentukan alamat awal program pemeliharaan yang diperlukan.

Perintah interupsi INT dibahas di atas ketika nilai bidangnya v=0 memiliki format byte tunggal, yaitu tidak memerlukan indikasi khusus tingkat interupsi. Perintah ini secara otomatis dianggap oleh prosesor sebagai interupsi level 3. (tipe=3) dan biasanya digunakan dalam program sebagai pos pemeriksaan.

Perintah interupsi luapan INTO menyebabkan transisi ke layanan interupsi tingkat keempat (tipe = 4) dalam kasus ketika nilai bendera overflow DARI = 1. Perintah INTO biasanya digunakan setelah perintah aritmatika yang ditandatangani. Biasanya, beberapa level interupsi pertama (hingga 32) dicadangkan untuk memproses sejumlah situasi tertentu, seperti upaya membagi dengan nol, overflow, dan sejenisnya.

Keunikan pemrosesan interupsi pada tingkat yang dicadangkan adalah bahwa prosesor melanjutkan untuk melayaninya terlepas dari nilai tanda pengaktifan interupsi IF.

Instruksi IRET satu byte ditempatkan di akhir setiap rutinitas layanan interupsi dan menyediakan pengembalian interupsi. Dengan perintah ini, prosesor mengambil nilai penunjuk instruksi IP dan segmen program CS dari tumpukan, dan juga memulihkan konten register flag F sebelumnya (seperti pada perintah POPF). Jika perlu, konten register CPU yang tersisa terkait dengan program yang terputus dapat disimpan di tumpukan saat berpindah ke program layanan dan kemudian dipulihkan saat kembali dari program tersebut menggunakan instruksi akses tumpukan.

logis OR, penambahan modulo 2 (Eksklusif OR);
  • pergeseran logis, aritmatika dan siklik;
  • memeriksa bit dan operan;
  • mengatur dan membersihkan bit (bendera) daftar status prosesor ( P.S.W.).
  • Instruksi operasi logika memungkinkan Anda mengevaluasi fungsi logika dasar sedikit demi sedikit dari dua operan masukan. Selain itu, operasi AND digunakan untuk memaksa pembersihan bit tertentu (sebagai salah satu operan, kode mask digunakan di mana bit yang memerlukan pembersihan disetel ke nol). Operasi OR digunakan untuk memaksa bit tertentu disetel (kode topeng digunakan sebagai salah satu operan, di mana bit yang memerlukan pengaturan ke satu sama dengan satu). Operasi Exclusive OR (XOR) digunakan untuk membalikkan bit tertentu (kode topeng digunakan sebagai salah satu operan, di mana bit yang akan dibalik diatur ke satu). Instruksinya memerlukan dua operan masukan dan menghasilkan satu operan keluaran.

    Instruksi shift memungkinkan Anda menggeser kode operan sedikit demi sedikit ke kanan (ke arah bit yang paling tidak signifikan) atau ke kiri (ke arah bit yang paling signifikan). Jenis pergeseran (logis, aritmatika, atau siklik) menentukan nilai baru dari bit tinggi (untuk pergeseran kanan) atau bit rendah (untuk pergeseran kiri), dan juga menentukan apakah nilai lama dari bit tinggi (untuk shift ke kiri) akan disimpan di suatu tempat atau bit yang paling tidak signifikan (bila digeser ke kanan). Misalnya, dengan pergeseran logis ke kanan, bit paling signifikan dari kode operan disetel ke nol, dan bit paling tidak signifikan ditulis sebagai tanda pembawa ke register status prosesor. Dan dengan pergeseran aritmatika ke kanan, nilai bit paling signifikan tetap sama (nol atau satu), bit paling tidak signifikan juga ditulis sebagai carry flag.

    Pergeseran melingkar memungkinkan Anda menggeser bit kode operan secara melingkar (searah jarum jam untuk pergeseran kanan, atau berlawanan arah jarum jam untuk pergeseran kiri). Dalam hal ini, shift ring mungkin menyertakan atau tidak menyertakan bendera carry. Bit carry flag (jika digunakan) menyimpan nilai bit paling signifikan saat diputar ke kiri dan bit paling tidak signifikan saat diputar ke kanan. Oleh karena itu, nilai bit carry flag akan ditulis ulang ke bit paling tidak signifikan selama pergeseran siklik ke kiri dan ke bit paling signifikan selama pergeseran siklik ke kanan.

    Misalnya pada Gambar. Gambar 3.12 menunjukkan tindakan yang dilakukan oleh perintah shift kanan.

    Instruksi pengujian bit dan operan digunakan untuk mengatur atau menghapus bit daftar status prosesor tergantung pada nilai bit yang dipilih atau keseluruhan operan secara keseluruhan. Perintah tidak menghasilkan operan keluaran. Perintah tes operan ( TST) memeriksa seluruh kode operan secara keseluruhan untuk kesetaraan dengan nol dan untuk tanda (nilai bit paling signifikan), hanya memerlukan satu operan input. Instruksi bit test (BIT) hanya menguji bit individual, yang dipilih menggunakan kode mask sebagai operan kedua. Dalam kode mask, bit yang dicentang dari operan utama harus sesuai dengan digit satuan.


    Beras. 3.12.

    Terakhir, set bit dan perintah yang jelas daftar status prosesor (yaitu, flag) memungkinkan Anda menyetel atau menghapus flag apa pun, yang bisa sangat memudahkan. Setiap bendera biasanya berhubungan dengan dua perintah, yang satu menyetelnya ke satu, dan yang lainnya menyetel ulang ke nol. Misalnya, flag carry C (dari Carry) akan sesuai dengan perintah CLC (clear) dan SEC atau STC (set).

    3.3.4. Perintah transisi

    Perintah transisi dirancang untuk mengatur semua jenis loop, cabang, panggilan subrutin, dll., yaitu mengganggu aliran berurutan eksekusi program. Instruksi ini menulis nilai baru ke register penghitung program dan dengan demikian menyebabkan prosesor melompat bukan ke instruksi berikutnya secara berurutan, tetapi ke instruksi lain dalam memori program. Beberapa perintah transisi memberikan pengembalian di masa depan ke titik awal transisi dilakukan, sementara yang lain tidak menyediakan hal ini. Jika pengembalian diberikan, maka parameter prosesor saat ini disimpan di tumpukan. Jika pengembalian tidak diberikan, maka parameter prosesor saat ini tidak disimpan.

    Perintah transisi tidak dapat dikembalikan dibagi menjadi dua kelompok:

    • tim lompatan tanpa syarat;
    • tim lompatan bersyarat.

    Perintah ini menggunakan kata-kata Cabang(bercabang) dan Melompat(melambung).

    Tim lompatan tanpa syarat menyebabkan transisi ke alamat baru terlepas dari apa pun. Mereka dapat menyebabkan lompatan ke jumlah offset tertentu (maju atau mundur) atau ke alamat memori tertentu. Nilai offset atau nilai alamat baru ditentukan sebagai operan masukan.

    Tim lompatan bersyarat tidak selalu menyebabkan transisi, tetapi hanya jika kondisi tertentu terpenuhi. Kondisi seperti ini biasanya merupakan nilai flag pada register status prosesor ( P.S.W.). Artinya, kondisi transisi merupakan hasil operasi sebelumnya yang mengubah nilai flag. Secara total, kondisi transisi seperti itu bisa terdiri dari 4 hingga 16. Beberapa contoh perintah lompatan bersyarat:

    • lompat jika sama dengan nol;
    • lompat jika bukan nol;
    • lompat jika ada luapan;
    • lompat jika tidak ada luapan;
    • lompat jika lebih besar dari nol;
    • melompat jika kurang dari atau sama dengan nol.
    arti baru. Jika kondisi transisi tidak terpenuhi, penghitung program akan bertambah, dan prosesor memilih dan mengeksekusi instruksi berikutnya secara berurutan.

    Perintah perbandingan ( CMP), sebelum perintah lompatan bersyarat(atau bahkan beberapa tim lompatan bersyarat). Tapi flag bisa diatur dengan perintah lain, misalnya perintah ke depan data, aritmatika atau perintah logis. Perhatikan bahwa kita sendiri perintah transisi benderanya tidak berubah, yang memungkinkan Anda menyetel beberapa perintah transisi satu setelah lainnya.

    Berbagi beberapa perintah bersyarat dan lompatan tanpa syarat memungkinkan prosesor untuk mengeksekusi algoritma bercabang dengan kompleksitas apa pun. Misalnya pada Gambar. Gambar 3.13 menunjukkan percabangan program menjadi dua cabang diikuti dengan koneksi, dan Gambar. 3.14 - bercabang menjadi tiga cabang dengan koneksi selanjutnya.

    Perintah transisi dengan kembalinya lebih jauh ke titik asal transisi, digunakan untuk menjalankan subrutin, yaitu program tambahan. Perintah ini juga disebut perintah panggilan subrutin (nama umumnya adalah CALL). Penggunaan subrutin memungkinkan Anda menyederhanakan struktur program utama, membuatnya lebih logis, fleksibel, dan lebih mudah untuk ditulis dan di-debug. Pada saat yang sama, harus diingat bahwa meluasnya penggunaan subrutin, sebagai suatu peraturan, meningkatkan waktu eksekusi program.


    Beras. 3.13.


    Beras. 3.14.

    Semua perintah transisi dengan return mengasumsikan cabang tanpa syarat (mereka tidak mencentang tanda apa pun). Namun, mereka memerlukan satu operan masukan, yang dapat menunjukkan nilai absolut dari alamat baru dan offset yang ditambahkan ke nilai alamat saat ini. Nilai saat ini dari penghitung program (alamat saat ini) disimpan sebelum pencabangan dilakukan pada stack.

    Untuk kembali ke titik panggilan

    Melalui alamat tidak langsung

    PCHL – alamat lompat disimpan dalam pasangan register HL. Kapan dijalankan (HL) → PC.

    Perintah lompat bersyarat

    Jcon @, dimana con adalah mnemonik kondisi dari kata bahasa Inggris condition.

    Telah disebutkan sebelumnya bahwa keadaan bit (flag) RgP (F) digunakan sebagai kondisi transisi. Mnemonik yang sesuai dengan keadaan ini disajikan pada Gambar. 6.18.

    Misalnya: JC 8BFE – ketika C=1 pergi ke alamat 8BFE, ketika C=0 perintah selanjutnya di alamat tersebut dijalankan.

    Perintah untuk memanggil PP dan kembali

    Telah dicatat sebelumnya bahwa alamat pengirim secara otomatis disimpan di tumpukan, mis. (PC) ® tumpukan.

    Perintah tanpa syarat

    PANGGILAN @ – panggilan subrutin;

    RET – kembali dari subrutin.

    Perintah bersyarat

    Ccon @ – panggilan subrutin;

    Rcon – kembali dari subrutin.

    Tindakan perintah ini mirip dengan tindakan perintah lompat bersyarat, yaitu. jika kondisinya benar, maka telepon atau kembalikan. Jika tidak, maka perintah berikut dijalankan.

    Perintah kontrol lainnya

    RST n, dimana n = 0.1,...,7 – restart sesuai vektor interupsi n.

    Ketika perintah ini dijalankan, kendali ditransfer ke subrutin yang melayani interupsi ini. Selama eksekusi instruksi RST, isi penghitung program PC disimpan di stack, dan alamat vektor interupsi yang sesuai ditulis ke PC.

    Alamat ini ditetapkan sebagai berikut. Perintah RST memiliki struktur 11NN N111, yaitu. satu byte. Kombinasi NNN tiga bit ditentukan oleh nilai n (n = 0...7). Nilai 0000 0000 00NN N000 dimasukkan ke dalam penghitung perintah PC, yang berfungsi sebagai alamat vektor interupsi yang sesuai.

    Jadi, dengan menetapkan nilai n tertentu, Anda dapat menghasilkan alamat salah satu dari 8 vektor interupsi. Alamat-alamat ini terletak di zona dari 0000H hingga 0038H ruang alamat dan melewati 8 byte, mis. 64 sel memori pertama dicadangkan untuk mereka (masing-masing dari 8 vektor dialokasikan 8 byte). Di zona ini (masing-masing 8 byte) hanya perintah untuk melompat ke subrutin (penangan) yang sesuai, yang terletak di area memori lain, yang ditulis.

    Subrutin yang menginterupsi (seperti subrutin normal) harus diakhiri dengan perintah RET. Selama eksekusi perintah ini, alamat perintah program utama sebelum terjadinya interupsi dipilih dari tumpukan dan ditransfer ke register alamat PA, dan nilai yang ditambah 1 dimasukkan ke dalam penghitung program.

    EI – pengaktifan interupsi. Perintah ini ditempatkan di awal bagian program di mana interupsi diaktifkan. Dengan perintah ini, pemicu pengaktifan interupsi di unit kontrol MP diatur ke status 1.

    DI – penonaktifan interupsi. Perintah ini ditempatkan di akhir bagian program di mana interupsi diaktifkan dan menyetel ulang pemicu ke status 0.

    NOP adalah perintah "kosong". Melewati 4 langkah. Hanya PC yang berubah.

    HLT – berhenti. Menyebabkan eksekusi program terhenti dan memasuki keadaan terhenti. MP terputus dari alamat eksternal dan bus data (yaitu, buffernya masuk ke status Z). Output WAIT (menunggu) diatur ke level 1. Keadaan ini dapat diinterupsi oleh sinyal awal MP atau dengan menempatkannya dalam keadaan interupsi.

    PERTANYAAN UJI DIRI

    1. Perangkat apa saja yang dibutuhkan untuk membuat komputer mikro sederhana?

    2. Sebutkan 5 pilihan struktur komputer mikro.

    3. Menggunakan antarmuka perantara.

    4. Apa saja yang termasuk dalam konsep “pengontrol PU”?

    5. Sebutkan ciri-ciri prosesor i8080.

    6. Register data. Tujuan mereka.

    7. Menandatangani register. Atribut apa yang disimpan dalam register ini?

    8. Jelaskan prinsip pertukaran data dua arah antara SD internal dan eksternal.

    9. Register apa yang dapat digunakan seorang programmer?

    10. Berikan diagram blok komputer mikro berbasis MP KR580VM80.

    11. Siklus mesin terdiri dari siklus apa?

    12. Daftar format data MP KR580VM80.

    13. Sebutkan format perintah MP KR580VM80.

    14. Metode pengalamatan apa yang digunakan di MP KR580VM80?

    15. Tim MP KR580VM80 dapat dibagi menjadi kelompok apa?

    16. Transfer byte tunggal. Berikan contoh perintah dari grup ini.

    17. Transfer byte ganda. Berikan contoh perintah dari grup ini.

    18. Pengoperasian baterai apa yang Anda ketahui?

    19. Operasi pada RON dan memori. Operasi apa saja yang termasuk di dalamnya?

    20. Buat daftar perintah kontrol.

    TUGAS KONTROL

    1. Lembar jawaban harus mencantumkan nomor kelompok, nama belakang siswa dan nomor pilihannya.

    2. Nomor soal dipilih oleh siswa sesuai dengan dua angka terakhirnya di buku nilai. Pada Tabel 6.1, n-1 adalah digit kedua dari belakang suatu bilangan, dan n adalah digit terakhir. Sel-sel tabel berisi jumlah pertanyaan yang harus diberikan jawaban tertulis.

    Nomor pertanyaan Tabel 6.1

    dan n-1
    1,5,9, 13,16 2,6,10,14,17 3,7,11,15,18 4,8,12,13,19 1,9,11,14,20 2,10,12,15,18 3,5,8, 13,17 4,6,7, 14,19 1,8,10,13,17 2,5,7, 14,18
    3,6,8, 15,19 4,7,9, 13,16 1,5,12,14,20 2,6,11,15,16 3,7,10,13,17 4,8,9, 14,18 1,7,12,13,18 2,8,10,14,19 3,5,11,15,20 4,6,9, 13,17
    2,7,9, 13,20 1,8,11,15,19 4,5,10,15,17 3,6,12,14,16 1,5,9, 13,16 2,6,10,14,17 3,7,11,15,18 4,8,12,13,19 1,9,11,14,20 2,10,12,15,18
    3,5,8, 13,17 4,6,7, 14,19 1,8,10,13,17 2,5,7, 14,18 3,6,8, 15,19 4,7,9, 13,16 1,5,12,14,20 2,6,11,15,16 3,7,10,13,17 4,8,9, 14,18
    1,7,12,13,18 2,8,10,14,19 3,5,11,15,20 4,6,9, 13,17 2,7,9, 13,20 1,8,11,15,19 4,5,10,15,17 3,6,12,14,16 1,5,9, 13,16 2,6,10,14,17
    3,7,11,15,18 4,8,12,13,19 1,9,11,14,20 2,10,12,15,18 3,5,8, 13,17 4,6,7, 14,19 1,8,10,13,17 2,5,7, 14,18 3,6,8, 15,19 4,7,9, 13,16
    1,5,12,14,20 2,6,11,15,16 3,7,10,13,17 4,8,9, 14,18 1,7,12,13,18 2,8,10,14,19 3,5,11,15,20 4,6,9, 13,17 2,7,9, 13,20 1,8,11,15,19
    4,5,10,15,17 3,6,12,14,16 1,5,9, 13,16 2,6,10,14,17 3,7,11,15,18 4,8,12,13,19 1,9,11,14,20 2,10,12,15,18 3,5,8, 13,17 4,6,7, 14,19
    1,8,10,13,17 2,5,7, 14,18 3,6,8, 15,19 4,7,9, 13,16 1,5,12,14,20 2,6,11,15,16 3,7,10,13,17 4,8,9, 14,18 1,7,12,13,18 2,8,10,14,19
    3,5,11,15,20 4,6,9, 13,17 2,7,9, 13,20 1,8,11,15,19 4,5,10,15,17 3,6,12,14,16 1,5,9, 13,16 2,6,10,14,17 3,7,11,15,18 4,8,12,13,19

    Instruksi aritmatika memperlakukan kode operan sebagai kode biner numerik atau kode BCD. Perintah-perintah ini dapat dibagi menjadi lima kelompok utama:

    Instruksi operasi titik tetap (penjumlahan, pengurangan, perkalian, pembagian);

    Instruksi floating point (penjumlahan, pengurangan, perkalian, pembagian);

    Perintah pembersihan;

    Perintah penambahan dan pengurangan;

    Perintah perbandingan.

    Instruksi titik tetap memperlakukan kode dalam register prosesor atau memori seolah-olah kode biner normal. Instruksi penjumlahan (ADD) menghitung jumlah dua kode. Instruksi pengurangan (SUB) menghitung selisih antara dua kode. Instruksi perkalian (MUL) menghitung perkalian dua kode (lebar hasilnya dua kali lebar faktornya). Instruksi pembagian (DIV) menghitung hasil bagi satu kode dibagi dengan kode lainnya. Selain itu, semua perintah ini dapat bekerja dengan nomor bertanda tangan dan tidak bertanda tangan.

    Instruksi floating point (titik) menggunakan format untuk merepresentasikan angka dengan eksponen dan mantissa (biasanya angka-angka ini menempati dua sel memori yang berurutan). Dalam prosesor modern yang kuat, kumpulan instruksi floating point tidak terbatas hanya pada empat operasi aritmatika, tetapi juga berisi banyak instruksi lain yang lebih kompleks, misalnya perhitungan fungsi trigonometri, fungsi logaritma, serta fungsi kompleks yang diperlukan untuk audio dan pengolahan citra.

    Instruksi yang jelas (CLR) dirancang untuk menulis kode nol ke register atau lokasi memori. Perintah ini dapat diganti dengan perintah forward zero code, namun perintah clear khusus biasanya lebih cepat daripada perintah forward. Perintah pembersihan terkadang diklasifikasikan sebagai perintah logis, tetapi hal ini tidak mengubah esensinya.

    Perintah kenaikan (kenaikan satu, INC) dan penurunan (penurunan satu, DEC) juga sangat mudah digunakan. Pada prinsipnya instruksi tersebut dapat digantikan dengan instruksi tambah satu atau kurang satu, namun penambahan dan pengurangan lebih cepat dibandingkan penambahan dan pengurangan. Instruksi ini memerlukan satu operan masukan, yang juga merupakan operan keluaran.

    Terakhir, instruksi perbandingan (dilambangkan CMP) dirancang untuk membandingkan dua operan masukan. Intinya menghitung selisih kedua operan ini, namun tidak membentuk operan keluaran, melainkan hanya mengubah bit-bit pada register status prosesor (PSW) berdasarkan hasil pengurangan tersebut. Instruksi yang mengikuti instruksi perbandingan (biasanya instruksi lompat) akan memeriksa bit-bit dalam register status prosesor dan melakukan tindakan berdasarkan nilainya. Beberapa prosesor memberikan instruksi perbandingan berantai untuk dua rangkaian operan yang terletak di memori (misalnya, prosesor 8086 dan yang kompatibel).

    Perintah logis

    Instruksi logis melakukan operasi logis (bitwise) pada operannya, yaitu, instruksi tersebut memperlakukan kode operan bukan sebagai angka tunggal, tetapi sebagai kumpulan bit individual. Inilah perbedaannya dengan instruksi aritmatika. Perintah logis melakukan operasi dasar berikut:

    Logis AND, logis OR, penambahan modulo 2 (Eksklusif OR);

    Pergeseran logis, aritmatika dan siklik;

    Memeriksa bit dan operan;

    Menetapkan dan menghapus bit (bendera) dari Processor Status Register (PSW).

    Instruksi operasi logika memungkinkan Anda mengevaluasi fungsi logika dasar sedikit demi sedikit dari dua operan masukan. Selain itu, operasi AND digunakan untuk memaksa pembersihan bit tertentu (sebagai salah satu operan, kode mask digunakan di mana bit yang memerlukan pembersihan disetel ke nol). Operasi OR digunakan untuk memaksa bit tertentu disetel (sebagai salah satu operan, kode topeng digunakan di mana bit yang memerlukan pengaturan ke satu sama dengan satu). Operasi Exclusive OR (XOR) digunakan untuk membalikkan bit tertentu (kode topeng digunakan sebagai salah satu operan, di mana bit yang akan dibalik diatur ke satu). Instruksinya memerlukan dua operan masukan dan menghasilkan satu operan keluaran.

    Instruksi shift memungkinkan Anda menggeser kode operan sedikit demi sedikit ke kanan (ke arah bit yang paling tidak signifikan) atau ke kiri (ke arah bit yang paling signifikan). Jenis pergeseran (logis, aritmatika, atau siklik) menentukan nilai baru dari bit tinggi (untuk pergeseran kanan) atau bit rendah (untuk pergeseran kiri), dan juga menentukan apakah nilai lama dari bit tinggi (untuk shift ke kiri) akan disimpan di suatu tempat atau bit yang paling tidak signifikan (bila digeser ke kanan). Misalnya, dengan pergeseran logis ke kanan, bit paling signifikan dari kode operan disetel ke nol, dan bit paling tidak signifikan ditulis sebagai tanda pembawa ke register status prosesor. Dan dengan pergeseran aritmatika ke kanan, nilai bit paling signifikan tetap sama (nol atau satu), bit paling tidak signifikan juga ditulis sebagai carry flag.

    Pergeseran melingkar memungkinkan Anda menggeser bit kode operan secara melingkar (searah jarum jam untuk pergeseran kanan, atau berlawanan arah jarum jam untuk pergeseran kiri). Dalam hal ini, shift ring mungkin menyertakan atau tidak menyertakan bendera carry. Bit carry flag (jika digunakan) menyimpan nilai bit paling signifikan saat diputar ke kiri dan bit paling tidak signifikan saat diputar ke kanan. Oleh karena itu, nilai bit carry flag akan ditulis ulang ke bit paling tidak signifikan selama pergeseran siklik ke kiri dan ke bit paling signifikan selama pergeseran siklik ke kanan.

    Misalnya pada Gambar. Gambar 2.3 menunjukkan tindakan yang dilakukan oleh perintah shift kanan.

    Instruksi pemeriksaan bit dan operan dirancang untuk mengatur atau menghapus bit register status prosesor tergantung pada nilai bit yang dipilih atau keseluruhan operan secara keseluruhan. Perintah tidak menghasilkan operan keluaran. Instruksi test operand (TST) memeriksa seluruh kode operan secara keseluruhan untuk nol dan tanda (nilai bit paling signifikan), hanya memerlukan satu operan masukan. Instruksi bit test (BIT) hanya menguji bit individual, yang dipilih menggunakan kode mask sebagai operan kedua. Dalam kode mask, bit yang dicentang dari operan utama harus sesuai dengan digit satuan.

    Beras. 2.3.Perintah Geser Kanan.

    Terakhir, instruksi untuk menyetel dan menghapus bit register status prosesor (yaitu, flag) memungkinkan Anda menyetel atau menghapus flag apa pun, yang bisa sangat memudahkan. Setiap bendera biasanya berhubungan dengan dua perintah, yang satu menyetelnya ke satu, dan yang lainnya menyetel ulang ke nol. Misalnya, flag carry C (untuk Carry) akan sesuai dengan perintah CLC (clear) dan SEC atau STC (set).

    Perintah transisi

    Perintah lompat dirancang untuk mengatur semua jenis loop, cabang, panggilan subrutin, dll., yaitu mengganggu aliran berurutan eksekusi program. Instruksi ini menulis nilai baru ke register penghitung program dan dengan demikian menyebabkan prosesor berpindah bukan ke instruksi berikutnya secara berurutan, tetapi ke instruksi lain dalam memori program. Beberapa perintah transisi mengatur pengembalian berikutnya ke titik asal transisi dilakukan, yang lain tidak menyediakannya. Jika pengembalian diberikan, maka parameter prosesor saat ini disimpan di tumpukan. Jika pengembalian tidak diberikan, maka parameter prosesor saat ini tidak disimpan.

    Perintah lompat tanpa kembali dibagi menjadi dua kelompok:

    Perintah lompat tanpa syarat;

    Perintah lompat bersyarat.

    Perintah-perintah ini diwakili oleh kata Cabang dan Lompat.

    Perintah lompat tanpa syarat menyebabkan lompatan ke alamat baru apa pun yang terjadi. Mereka dapat menyebabkan lompatan ke jumlah offset tertentu (maju atau mundur) atau ke alamat memori tertentu. Nilai offset atau nilai alamat baru ditentukan sebagai operan masukan.

    Perintah lompat bersyarat tidak selalu menyebabkan lompat, tetapi hanya bila kondisi tertentu terpenuhi. Kondisi seperti ini biasanya merupakan nilai flag pada processor status register (PSW). Artinya, kondisi transisi merupakan hasil operasi sebelumnya yang mengubah nilai flag. Secara total, kondisi transisi seperti itu bisa berjumlah 4 hingga 16. Beberapa contoh perintah transisi bersyarat:

    Lompat jika sama dengan nol;

    Lompat jika bukan nol;

    Lompat jika ada luapan;

    Lompat jika tidak ada luapan;

    Lompat jika lebih besar dari nol;

    Lompat jika kurang dari atau sama dengan nol.

    Jika kondisi transisi terpenuhi, nilai baru dimuat ke dalam register penghitung perintah. Jika kondisi transisi tidak terpenuhi, penghitung program akan bertambah, dan prosesor memilih dan mengeksekusi instruksi berikutnya secara berurutan.

    Secara khusus, untuk memeriksa kondisi lompat, digunakan instruksi perbandingan (CMP) yang mendahului instruksi lompat bersyarat (atau bahkan beberapa instruksi lompat bersyarat). Namun tanda juga dapat disetel dengan perintah lain, misalnya perintah transfer data, atau perintah aritmatika atau logika apa pun. Perhatikan bahwa perintah lompat itu sendiri tidak mengubah tandanya, itulah yang memungkinkan Anda menempatkan beberapa perintah lompat satu demi satu.

    Kombinasi penggunaan beberapa instruksi lompatan bersyarat dan tidak bersyarat memungkinkan prosesor untuk mengeksekusi algoritma bercabang dengan kompleksitas apa pun. Misalnya pada Gambar. 2.4 menunjukkan percabangan program menjadi dua cabang dengan koneksi selanjutnya, dan pada Gambar. 2.5 - bercabang menjadi tiga cabang dengan koneksi selanjutnya.

    Perintah transisi dengan pengembalian lebih lanjut ke titik asal transisi digunakan untuk menjalankan subrutin, yaitu program tambahan. Perintah ini juga disebut perintah panggilan subrutin (umumnya dikenal sebagai CALL). Penggunaan subrutin memungkinkan Anda menyederhanakan struktur program utama, membuatnya lebih logis, fleksibel, dan lebih mudah untuk ditulis dan di-debug. Pada saat yang sama, harus diingat bahwa meluasnya penggunaan subrutin, sebagai suatu peraturan, meningkatkan waktu eksekusi program.

    Beras. 2.4.Implementasi percabangan menjadi dua cabang.

    Beras. 2.5.Implementasi percabangan menjadi tiga cabang.

    Semua instruksi lompat mundur mengasumsikan lompatan tanpa syarat (tidak mencentang tanda apa pun). Namun, mereka memerlukan satu operan masukan, yang dapat menunjukkan nilai absolut dari alamat baru dan offset yang ditambahkan ke nilai alamat saat ini. Nilai saat ini dari penghitung program (alamat saat ini) disimpan sebelum pencabangan dilakukan pada stack.

    Untuk kembali ke titik panggilan subrutin (titik lompat), digunakan instruksi pengembalian khusus (RET atau RTS). Instruksi ini mengeluarkan nilai alamat instruksi lompat dari tumpukan dan menuliskannya ke register penghitung program.

    Tempat khusus di antara instruksi lompat-kembali ditempati oleh instruksi interupsi (nama umum - INT). Instruksi ini memerlukan nomor interupsi (alamat vektor) sebagai operan masukan. Transisi tersebut dilayani dengan cara yang sama seperti interupsi perangkat keras. Artinya, untuk melakukan transisi ini, prosesor mengakses tabel vektor interupsi dan menerima darinya, berdasarkan nomor interupsi, alamat memori yang harus dituju. Alamat panggilan interupsi dan isi register status prosesor (PSW) disimpan di tumpukan. Menyimpan PSW adalah perbedaan penting antara instruksi interupsi dan instruksi lompat kembali.

    Dalam banyak kasus, perintah interupsi lebih nyaman daripada perintah lompat dan kembali biasa. Anda dapat membuat tabel vektor interupsi satu kali, lalu mengaksesnya sesuai kebutuhan. Nomor interupsi sesuai dengan nomor subrutin, yaitu nomor fungsi yang dilakukan oleh subrutin. Oleh karena itu, instruksi interupsi lebih sering disertakan dalam sistem instruksi prosesor daripada instruksi lompat-kembali biasa.

    Untuk kembali dari subrutin yang dipanggil oleh instruksi interupsi, gunakan instruksi kembali dari interupsi (IRET atau RTI). Perintah ini mengeluarkan nilai penghitung program dan register status prosesor (PSW) yang disimpan di sana dari tumpukan.

    Perhatikan bahwa beberapa prosesor juga menyediakan instruksi interupsi bersyarat, misalnya instruksi interupsi overflow.

    Tentu saja, di bagian ini kami hanya memeriksa perintah dasar yang paling sering ditemukan di prosesor. Prosesor tertentu mungkin memiliki banyak instruksi lain yang tidak termasuk dalam kelompok instruksi yang terdaftar. Tapi mereka harus dipelajari setelah jenis prosesor yang sesuai untuk masalah yang diselesaikan oleh sistem mikroprosesor tertentu telah dipilih.


    
    Atas