Anda tidak dapat melakukan ini secara umum, tetapi dalam beberapa hal, Anda sangat bisa, dan ada beberapa kasus sejarah di mana Anda memang harus melakukannya.
The Atari 2600 (atau Atari Video Computer System) adalah salah satu sistem home video game yang paling awal dan pertama kali dirilis pada tahun 1978. Tidak seperti sistem kemudian jaman, Atari tidak mampu untuk memberikan perangkat frame buffer, yang berarti bahwa CPU telah untuk menjalankan kode di setiap garis pemindaian untuk menentukan apa yang akan dihasilkan - jika kode ini mengambil alih 17,08 mikrodetik untuk dijalankan (interval HBlank), grafik tidak akan ditetapkan dengan benar sebelum garis pemindaian mulai menggambar mereka. Lebih buruk lagi, jika programmer ingin menggambar konten yang lebih kompleks daripada apa yang biasanya diizinkan Atari, mereka harus mengukur waktu yang tepat untuk instruksi dan mengubah register grafik saat balok sedang digambar, dengan rentang 57,29 mikrodetik untuk seluruh garis pindai.
Namun, Atari 2600, seperti banyak sistem lain yang berbasiskan pada 6502, memiliki fitur yang sangat penting yang memungkinkan manajemen waktu yang cermat untuk skenario ini: CPU, RAM, dan sinyal TV semuanya menjalankan jam berdasarkan master yang sama jam. Sinyal TV menjalankan clock 3,98 MHz, membagi waktu di atas menjadi angka integer "jam warna" yang mengatur sinyal TV, dan siklus jam CPU dan RAM adalah tepat tiga jam warna, yang memungkinkan jam CPU menjadi ukuran waktu yang akurat relatif terhadap sinyal TV kemajuan saat ini. (Untuk informasi lebih lanjut tentang ini, lihat Panduan Programmer Stella , ditulis untuk emulator Stella Atari 2600 ).
Lingkungan operasi ini, di samping itu, berarti bahwa setiap instruksi CPU memiliki jumlah siklus yang pasti akan diperlukan dalam setiap kasus, dan banyak 6502 pengembang menerbitkan informasi ini dalam tabel referensi. Misalnya, pertimbangkan entri ini untuk CMP
instruksi (Bandingkan Memori dengan akumulator), yang diambil dari tabel ini :
CMP Compare Memory with Accumulator
A - M N Z C I D V
+ + + - - -
addressing assembler opc bytes cycles
--------------------------------------------
immediate CMP #oper C9 2 2
zeropage CMP oper C5 2 3
zeropage,X CMP oper,X D5 2 4
absolute CMP oper CD 3 4
absolute,X CMP oper,X DD 3 4*
absolute,Y CMP oper,Y D9 3 4*
(indirect,X) CMP (oper,X) C1 2 6
(indirect),Y CMP (oper),Y D1 2 5*
* add 1 to cycles if page boundary is crossed
Dengan menggunakan semua informasi ini, Atari 2600 (dan 6502 pengembang lainnya) dapat menentukan dengan tepat berapa lama kode mereka untuk dieksekusi, dan membangun rutinitas yang melakukan apa yang mereka butuhkan dan masih mematuhi persyaratan waktu sinyal TV Atari. Dan karena pengaturan waktu ini sangat tepat (terutama untuk instruksi yang membuang-buang waktu seperti NOP), mereka bahkan dapat menggunakannya untuk memodifikasi gambar saat gambar tersebut diambil.
Tentu saja, Atari's 6502 adalah kasus yang sangat spesifik, dan semua ini hanya mungkin karena sistem memiliki semua hal berikut:
- Master clock yang menjalankan semuanya, termasuk RAM. Sistem modern memiliki jam independen untuk CPU dan RAM, dengan jam RAM sering lebih lambat dan keduanya tidak selalu sinkron.
- Tanpa caching dalam bentuk apa pun - 6502 selalu mengakses DRAM secara langsung. Sistem modern memiliki cache SRAM yang membuatnya lebih sulit untuk memprediksi keadaan - sementara mungkin masih mungkin untuk memprediksi perilaku sistem dengan cache, itu jelas lebih sulit.
- Tidak ada program lain yang berjalan secara bersamaan - program pada kartrid memiliki kendali penuh atas sistem. Sistem modern menjalankan banyak program sekaligus menggunakan algoritma penjadwalan non-deterministik.
- Kecepatan clock cukup lambat sehingga sinyal dapat melintasi sistem dalam waktu. Pada sistem modern dengan kecepatan clock 4 GHz (misalnya), dibutuhkan foton siklus cahaya 6,67 untuk menempuh panjang motherboard setengah meter - Anda tidak akan pernah bisa mengharapkan prosesor modern untuk berinteraksi dengan sesuatu yang lain di papan tulis hanya dalam satu siklus, karena dibutuhkan lebih dari satu siklus untuk sinyal di papan untuk mencapai perangkat.
- Kecepatan clock yang terdefinisi dengan baik yang jarang berubah (1,19 MHz untuk Atari) - kecepatan CPU dari sistem modern berubah setiap saat, sementara Atari tidak dapat melakukan ini tanpa juga memengaruhi sinyal TV.
- Timing siklus yang dipublikasikan - x86 tidak menentukan berapa lama waktu yang diperlukan untuk instruksinya.
Semua hal ini datang bersama-sama untuk menciptakan suatu sistem di mana dimungkinkan untuk membuat set instruksi yang membutuhkan waktu yang tepat - dan untuk aplikasi ini, itulah yang diminta. Sebagian besar sistem tidak memiliki tingkat ketelitian ini hanya karena tidak diperlukan untuk itu - perhitungan bisa dilakukan ketika mereka selesai, atau jika jumlah waktu yang tepat dibutuhkan, jam independen dapat ditanyakan. Tetapi jika kebutuhannya benar (seperti pada beberapa sistem tertanam), masih dapat muncul, dan Anda akan dapat secara akurat menentukan berapa lama kode Anda diperlukan untuk berjalan di lingkungan ini.
Dan saya juga harus menambahkan penafian besar-besaran bahwa semua ini hanya berlaku untuk membangun satu set instruksi perakitan yang akan memakan waktu yang tepat. Jika yang ingin Anda lakukan adalah mengambil bagian perakitan yang sewenang-wenang, bahkan di lingkungan ini, dan bertanya "Berapa lama waktu yang diperlukan untuk mengeksekusi?", Anda pasti tidak bisa melakukan itu - itu adalah Masalah Pemutusan , yang telah terbukti tidak dapat diselesaikan.
EDIT 1: Dalam versi sebelumnya dari jawaban ini, saya menyatakan bahwa Atari 2600 tidak memiliki cara untuk memberitahu prosesor di mana ia berada di sinyal TV, yang memaksanya untuk menjaga seluruh program dihitung dan disinkronkan dari awal. Seperti yang saya tunjukkan dalam komentar, ini berlaku untuk beberapa sistem seperti ZX Spectrum, tetapi tidak berlaku untuk Atari 2600, karena berisi register perangkat keras yang menghentikan CPU hingga interval pengosongan horizontal berikutnya terjadi, serta sebuah fungsi untuk memulai interval pengosongan vertikal sesuka hati. Oleh karena itu, masalah penghitungan siklus terbatas pada setiap garis pemindaian, dan hanya menjadi tepat jika pengembang ingin mengubah konten saat garis pemindaian sedang dibuat.