Dalam bab ini, kita membahas instruksi aritmetika dan logika. Instruksi aritmetika mencakup penjumlahan, pengurangan, perkalian, pembagian, perbandingan, negasi, penambahan (increment), dan pengurangan (decrement). Instruksi logika mencakup AND, OR, Exclusive-OR, NOT, pergeseran (shift), rotasi (rotate), serta perbandingan logis (TEST).
Bab ini juga membahas instruksi mulai dari prosesor 80386 hingga Core2, seperti XADD, SHRD, SHLD, pengujian bit (bit test), dan pemindaian bit (bit scan). Bab ini ditutup dengan pembahasan mengenai instruksi perbandingan string, yang digunakan untuk memindai data dalam bentuk tabel maupun membandingkan bagian-bagian data di memori. Kedua tugas perbandingan ini dapat dilakukan secara efisien dengan instruksi string scan (SCAS) dan string compare (CMPS).
Jika Anda terbiasa dengan mikroprosesor 8-bit, Anda akan menyadari bahwa set instruksi pada 8086 hingga Core2 lebih unggul dibandingkan sebagian besar mikroprosesor 8-bit, karena sebagian besar instruksinya memiliki dua operand, bukan hanya satu. Bahkan jika ini adalah pengalaman pertama Anda dengan mikroprosesor, Anda akan dengan cepat memahami bahwa mikroprosesor ini memiliki kumpulan instruksi aritmetika dan logika yang sangat kuat sekaligus mudah digunakan.
- Menggunakan instruksi aritmetika dan logika untuk menyelesaikan operasi aritmetika biner, BCD, dan ASCII sederhana.
- Menggunakan AND, OR, dan Exclusive-OR untuk melakukan manipulasi bit biner.
- Menggunakan instruksi shift dan rotate.
- Menjelaskan cara kerja instruksi mulai dari 80386 hingga Core2, seperti exchange and add, compare and exchange, double-precision shift, bit test, dan bit scan.
- Memeriksa isi suatu tabel untuk menemukan kecocokan dengan menggunakan instruksi string.
3. ADDITION, SUBTRACTION, AND COMPARISON[Kembali]
- Addition
Tabel 5–1 menunjukkan mode pengalamatan yang tersedia untuk instruksi ADD (mode pengalamatan ini mencakup hampir semua yang telah dijelaskan pada Bab 3). Namun, karena terdapat lebih dari 32.000 variasi instruksi ADD dalam set instruksi, tidak mungkin untuk mencantumkannya semua dalam tabel tersebut. Satu-satunya bentuk penjumlahan yang tidak diizinkan adalah memory-to-memory dan penggunaan segment register. Segment register hanya dapat dipindahkan (moved), dimasukkan ke stack (pushed), atau diambil dari stack (popped).
Perlu dicatat bahwa, seperti pada semua instruksi lainnya, register 32-bit hanya tersedia mulai dari prosesor 80386 hingga Core2. Pada mode 64-bit di prosesor Pentium 4 dan Core2, register 64-bit juga digunakan untuk operasi penjumlahan.
Penjumlahan Register.
Contoh 5–1 menunjukkan urutan instruksi sederhana yang menggunakan penjumlahan register untuk menjumlahkan isi dari beberapa register. Pada contoh ini, isi dari AX, BX, CX, dan DX dijumlahkan untuk membentuk hasil 16-bit yang disimpan di dalam register AX.
Setiap kali instruksi aritmetika dan logika dijalankan, isi dari flag register akan berubah. Perlu diperhatikan bahwa isi dari interrupt flag, trap flag, dan flag lainnya tidak berubah akibat instruksi aritmetika maupun logika. Hanya flag yang terletak pada 8 bit paling kanan dari flag register serta overflow flag yang mengalami perubahan. Flag-flag pada bagian kanan ini menunjukkan hasil dari operasi aritmetika atau logika.
Instruksi ADD, misalnya, akan mengubah isi dari sign flag, zero flag, carry flag, auxiliary carry flag, parity flag, dan overflow flag. Sementara itu, bit-bit flag tidak mengalami perubahan pada sebagian besar instruksi pemindahan data yang telah dibahas pada Bab 4.
Penjumlahan Immediate.
Penjumlahan immediate digunakan ketika data konstan atau data yang sudah diketahui ditambahkan. Contoh penjumlahan immediate 8-bit ditunjukkan pada Contoh 5–2. Pada contoh ini, register DL terlebih dahulu diisi dengan nilai 12H menggunakan instruksi immediate move. Selanjutnya, nilai 33H ditambahkan ke 12H di dalam register DL melalui instruksi immediate addition. Setelah penjumlahan, hasilnya (45H) masuk ke dalam register DL dan flag mengalami perubahan sebagai berikut:
Z = 0 1result not zero2P = 0
C = 0 1no carry2
A = 0 1no half-carry2
S = 0 1result positive2
P = 0 1odd parity2
O = 0 1no overflow2
Contoh 5–2
0000 B2 12 MOV DL,12H
0002 80 C2 33 ADD DL,33H
Penjumlahan Memory-ke-Register. Misalkan suatu aplikasi membutuhkan data dari memori untuk ditambahkan ke dalam register AL. Contoh 5–3 menunjukkan contoh yang menambahkan dua byte data berurutan, yang disimpan pada lokasi offset segmen data NUMB dan (lokasi berikutnya), ke dalam register AL.
EXAMPLE 5–3
0000 BF 0000 R MOV DI,OFFSET NUMB ;address NUMB
0003 B0 00 MOV AL,0 ;clear sum
0005 02 05 ADD AL,[DI] ;add NUMB
0007 02 45 01 ADD AL,[DI+1] ;add NUMB+1
Instruksi pertama memuat register destination index (DI) dengan alamat offset NUMB. Register DI, yang digunakan pada contoh ini, berfungsi untuk mengakses data di segmen data yang dimulai dari lokasi memori NUMB. Setelah nilai penjumlahan dihapus (diinisialisasi menjadi nol), instruksi ADD AL,[DI] akan menambahkan isi dari lokasi memori NUMB ke dalam register AL.
Selanjutnya, instruksi ADD AL,[ ] menambahkan isi dari lokasi memori NUMB ditambah 1 byte ke dalam register AL. Setelah kedua instruksi ADD dijalankan, hasil akhirnya akan muncul di dalam register AL sebagai jumlah dari isi NUMB ditambah isi dari lokasi berikutnya.
Penjumlahan Array.
Array memori adalah daftar data yang tersusun secara berurutan. Misalkan sebuah array data (ARRAY) berisi 10 byte, dengan penomoran elemen dari 0 hingga 9. Contoh 5–4 menunjukkan bagaimana cara menjumlahkan isi dari elemen array ke-3, ke-5, dan ke-7.
Pada contoh ini, register AL terlebih dahulu dihapus (diisi dengan 0), sehingga dapat digunakan untuk menampung hasil penjumlahan. Selanjutnya, register SI diisi dengan nilai 3 untuk pertama kali mengakses elemen array ke-3. Instruksi ADD AL,ARRAY[SI] kemudian menambahkan isi dari elemen array ke-3 ke dalam jumlah yang tersimpan di AL.
Instruksi berikutnya menambahkan elemen array ke-5 dan ke-7 ke dalam jumlah di AL, dengan menggunakan nilai 3 pada SI ditambah displacement 2 untuk mengakses elemen ke-5, serta displacement 4 untuk mengakses elemen ke-7.
EXAMPLE 5–4
0000 B0 00 MOV AL,0 ;clear sum
0002 BE 0003 MOV SI,3 ;address element 3
0005 02 84 0000 R ADD AL,ARRAY[SI] ;add element 3
0009 02 84 0002 R ADD AL,ARRAY[SI+2] ;add element 5
000D 02 84 0004 R ADD AL,ARRAY[SI+4] ;add element 7
Misalkan sebuah array data berisi bilangan 16-bit yang akan dijumlahkan untuk membentuk hasil penjumlahan 16-bit di dalam register AX. Contoh 5–5 menunjukkan urutan instruksi yang ditulis untuk prosesor 80386 dan yang lebih baru, dengan menggunakan bentuk pengalamatan scaled-index untuk menjumlahkan elemen ke-3, ke-5, dan ke-7 dari suatu area memori bernama ARRAY.
Pada contoh ini, EBX diisi dengan alamat ARRAY, sedangkan ECX berfungsi menyimpan nomor elemen array. Perhatikan bagaimana faktor skala (scaling factor) digunakan untuk mengalikan isi register ECX dengan 2 agar dapat mengakses data berupa word. (Ingat bahwa word terdiri dari 2 byte.)
Penjumlahan Increment.
Instruksi increment (INC) digunakan untuk menambahkan nilai 1 ke sebuah register atau lokasi memori. Instruksi INC dapat menambahkan 1 ke semua register atau lokasi memori, kecuali pada segment register. Tabel 5–2 menggambarkan beberapa bentuk instruksi increment yang tersedia pada prosesor 8086 hingga Core2. Sama seperti instruksi lain yang telah dibahas sebelumnya, tidak mungkin untuk menampilkan semua variasi instruksi INC, karena jumlahnya sangat banyak.
Pada increment memori tidak langsung (indirect memory increment), ukuran data harus dijelaskan dengan menggunakan direktif BYTE PTR, WORD PTR, DWORD PTR, atau QWORD PTR.
Assembler tidak dapat menentukan apakah, misalnya, instruksi INC [DI] merupakan increment dengan ukuran byte, word, atau doubleword. Instruksi INC BYTE PTR [DI] secara jelas menunjukkan bahwa data memori berukuran byte; instruksi INC WORD PTR [DI] menunjukkan bahwa data memori berukuran word; sedangkan instruksi INC DWORD PTR [DI] menunjukkan bahwa data memori berukuran doubleword. Pada operasi mode 64-bit pada prosesor Pentium 4 dan Core2, instruksi INC QWORD PTR [RSI] menunjukkan bahwa data memori berukuran quadword.
Contoh 5–6 menunjukkan bagaimana memodifikasi Contoh 5–3 untuk menggunakan instruksi increment dalam pengalamatan NUMB dan lokasi setelahnya. Pada contoh ini, instruksi INC DI mengubah isi dari register DI dari alamat offset NUMB ke alamat offset berikutnya. Kedua urutan program yang ditunjukkan pada Contoh 5–3 dan Contoh 5–6 sama-sama menjumlahkan isi dari NUMB dan lokasi berikutnya. Perbedaannya terletak pada cara pembentukan alamat melalui isi register DI dengan menggunakan instruksi increment.
EXAMPLE 5–6
0000 BF 0000 R MOV DI,OFFSET NUMB ;address NUMB
0003 B0 00 MOV AL,0 ;clear sum
0005 02 05 ADD AL,[DI] ;add NUMB
0007 47 INC DI ;increment DI
0008 02 05 ADD AL,[DI] ;add NUMB+1
1. Analisa pengaruh tegangan input terhadap tegangan dan arus pada rangkaian forward bias
Jawab :
Download Video Percobaan [disini]
Download Video Penjelasan [disini]
Tidak ada komentar:
Posting Komentar