Saya telah menemukan pertanyaan saat mengerjakan bahasa assembly. Inilah pertanyaannya:
Asumsikan bahwa bit P2.2 digunakan untuk mengontrol lampu luar dan bit P2.5 lampu di dalam bangunan. Tunjukkan cara menyalakan lampu luar dan mematikan yang di dalam.
Solusi yang diberikan:
SETB C ; CY = 1
ORL C, P2.2 ; CY = P2.2 ORed w/ CY
MOV P2.2, C ; turn it on if not on
CLR C ; CY = 0
ANL C, P2.5 ; CY = P2.5 ANDed w/P2.5
MOV P2.5,C ; turn it off if not off
Saya hanya merasa akan melakukan pekerjaan yang sama dengan kode:
SETB P2.2
CLR P2.5
Apa yang salah dengan itu?
microprocessor
assembly
8051
İlker Demirel
sumber
sumber
Jawaban:
Anda benar karena tampaknya kode yang Anda tampilkan konyol. Mungkin mesin apa pun yang dijalankan tidak dapat melakukan operasi langsung untuk mengatur bit pada port I / O, dan itulah mengapa sesuatu seperti SETB P2.2 tidak mungkin.
Masih mengatur bit CY ke 1, maka ORing apapun ke dalamnya hanya konyol. Hal yang sama berlaku untuk mengatur bit CY ke 0, kemudian ANDing sesuatu ke dalamnya. Jelas bit CY dapat langsung disalin ke bit pin I / O, karena kode melakukan itu. Paling-paling ini harus 4 instruksi, tentu saja bukan 6.
sumber
SETB bit
dan untukCLR bit
instruksiMOV bit,C
. Selanjutnya, saat menggunakan instruksi diskrit untuk membaca port I / O, memperbarui nilainya, dan menulisnya kembali akan menghasilkan semantik yang berbeda dari menggunakan instruksi baca-modifikasi-tulis, semua instruksi bitwise menggunakan semantik baca-modifikasi-tulis yang sama pada I / O port.Kode hampir pasti untuk prosesor menggunakan set instruksi 8051. Pada prosesor itu, variasi kode yang Anda berikan akan memiliki efek yang sama seperti aslinya kecuali bahwa ia akan berjalan lebih cepat. Menjalankan "ORL C, P2.2" ketika carry diatur tidak akan memiliki efek yang dapat diamati kecuali membuang beberapa siklus (dua siklus CPU total 24 siklus clock pada 8.051 jika saya ingat dengan benar; kemungkinan nomor berbeda pada beberapa varian lainnya) . Begitu juga dengan mengeksekusi "ANL C, P2.5" saat carry jelas. Walaupun mungkin ada beberapa jenis prosesor di mana permintaan untuk membaca beberapa lokasi I / O akan memiliki efek yang dapat diamati, saya tidak berpikir prosesor gaya 8051 apa pun pernah memiliki perilaku seperti itu untuk lokasi I / O bit-addressable, banyak kurang untuk bit P2.
Mungkin tujuan dari kode adalah untuk mendemonstrasikan
ORL C,bit
danANL C,bit
instruksi, tetapi ini tampak seperti contoh aneh untuk menunjukkannya.sumber
Kode rakitan yang diberikan kemungkinan dihasilkan oleh kompiler. Ini adalah versi pernyataan C berikut yang tidak dioptimalkan, di mana
P2_2
danP2_5
merupakan objek bit-addressable:Ini mungkin tampak setara dengan
P2_2 = 1;
danP2_5 = 0;
, tetapi tidak jika register bit-addressable adalah objek yang mudah menguap. Operasi baca-modifikasi-tulis pada objek volatil harus melakukan proses baca dan tulis, dalam urutan itu. Ini memastikan bahwa efek samping dari membaca atau menulis register benar-benar terjadi.Meskipun saya tahu tidak ada register 8.051 bit-addressable dengan efek samping, kompiler tidak dapat berasumsi tidak ada atau tidak akan pernah ada.
sumber
Perbedaan nyata antara ini mungkin halus.
Dalam jawaban Anda yang disederhanakan logikanya adalah membaca port, mengatur atau menghapus nilai bit dan kemudian menulisnya kembali ke port. Perhatikan bahwa seluruh port dapat ditulis ulang di sini.
Solusi di sisi lain menggunakan instruksi bit MOV yang dapat beroperasi dengan cara yang agak berbeda.
Tanpa membahas perincian bagian tertentu yang digunakan di sini, sulit untuk menentukan apakah ada perbedaan, atau apakah itu penting.
Atau bisa jadi instruktur memutuskan untuk membuat Anda berpikir .... yang sebenarnya .. pekerjaan sebenarnya.
sumber
Satu-satunya jawaban adalah bahwa prosesor tidak mendukung instruksi 1 bit secara langsung. Namun, ketika carry bit digunakan, ia tahu itu hanya satu bit yang dimanipulasi.
sumber