Mengapa kode ini tidak ditulis dengan cara yang lebih sederhana?

8

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?

İlker Demirel
sumber
2
Mungkin hanya didaktik- yang menunjukkan cara menggunakan bit carry sebagai akumulator. Tidak ada keuntungan yang bisa saya lihat dalam kasus khusus ini. Ini terlihat seperti kode perakitan 8.051.
Spehro Pefhany
@SpehroPefhany Tapi sejauh yang saya tahu, register Acc digunakan dalam beberapa kasus karena hanya register yang mendukung beberapa instruksi seperti DA, RR, RL dll. Saya tidak berpikir ini yang terjadi di sini. Apakah aku salah?
İlker Demirel
Carry sedikit lebar. Anda mungkin ingin menggunakannya sebagai akumulator dalam beberapa kasus seperti evaluasi logika tangga.
Spehro Pefhany

Jawaban:

11

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.

Olin Lathrop
sumber
Jadi saya dapat mengatakan bahwa jika sedikit bit-addressable, saya diizinkan untuk menggunakan instruksi bit pada bit apa pun itu, bukan?
İlker Demirel
1
@ İlk: Tidak harus. Mungkin ada batasan seperti instruksi bit hanya bekerja pada register tertentu, memori "dekat" tertentu, dan sejenisnya. Tanpa mengetahui prosesor, kami tidak dapat mengatakan dengan pasti apakah SETB P2.2 akan mungkin. Namun, SETB C diikuti oleh MOV P2.2, C, jelas dimungkinkan.
Olin Lathrop
1
@ OlinLathrop: Prosesor ini hampir pasti merupakan varian 8.051, dan set instruksi untuk mereka akan memungkinkan lokasi yang sama untuk digunakan SETB bitdan untuk CLR bitinstruksi MOV 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.
supercat
9

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,bitdan ANL C,bitinstruksi, tetapi ini tampak seperti contoh aneh untuk menunjukkannya.

supercat
sumber
6

Kode rakitan yang diberikan kemungkinan dihasilkan oleh kompiler. Ini adalah versi pernyataan C berikut yang tidak dioptimalkan, di mana P2_2dan P2_5merupakan objek bit-addressable:

P2_2 |= 1;
P2_5 &= 0;

Ini mungkin tampak setara dengan P2_2 = 1;dan P2_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.

D Krueger
sumber
1
Poin bagus tentang kemungkinan menjadi kompiler-dihasilkan. Namun, kemudian memindahkan pertanyaan ke mengapa seseorang akan menulis P2_2 | = 1 bukan hanya P2_2 = 1.
Olin Lathrop
3

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.

Trevor_G
sumber
0

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.

Guill
sumber