Bạn không thể làm điều này nói chung, nhưng trong một số giác quan, bạn rất có thể, và đã có một vài trường hợp lịch sử mà bạn thực sự phải làm.
Các Atari 2600 (hoặc Atari Video của hệ thống máy tính) là một trong những hệ thống video gia đình trò chơi sớm nhất và lần đầu tiên được phát hành vào năm 1978. Không giống như các hệ thống sau của thời đại, Atari không thể đủ khả năng để cung cấp cho các thiết bị một bộ đệm khung hình, có nghĩa là CPU có để chạy mã ở mọi đường quét để xác định những gì sẽ tạo ra - nếu mã này mất hơn 17,08 micro giây để chạy (khoảng HBlank), đồ họa sẽ không được đặt đúng trước khi đường quét bắt đầu vẽ chúng. Tồi tệ hơn, nếu lập trình viên muốn vẽ nội dung phức tạp hơn những gì Atari thường cho phép, họ phải đo thời gian chính xác để được hướng dẫn và thay đổi các thanh ghi đồ họa khi chùm tia được vẽ, với nhịp 57,29 micro giây cho toàn bộ đường quét.
Tuy nhiên, Atari 2600, giống như nhiều hệ thống khác dựa trên 6502, có một tính năng rất quan trọng cho phép quản lý thời gian cẩn thận cần thiết cho kịch bản này: CPU, RAM và tín hiệu TV đều chạy đồng hồ dựa trên cùng một bản gốc đồng hồ. Tín hiệu TV đã tắt xung nhịp 3,98 MHz, chia số lần ở trên thành số "đồng hồ màu" số nguyên quản lý tín hiệu TV và một chu kỳ của đồng hồ CPU và RAM chính xác là ba đồng hồ màu, cho phép đồng hồ của CPU được một thước đo chính xác của thời gian liên quan đến tín hiệu TV tiến độ hiện tại. (Để biết thêm thông tin về điều này, hãy xem Hướng dẫn lập trình viên Stella , được viết cho trình giả lập Stella Atari 2600 ).
Ngoài ra, môi trường hoạt động này có nghĩa là mọi lệnh CPU đều có một số chu kỳ xác định mà nó sẽ thực hiện trong mọi trường hợp và nhiều nhà phát triển 6502 đã công bố thông tin này trong các bảng tham chiếu. Ví dụ, hãy xem xét mục này cho hướng dẫn CMP
(So sánh bộ nhớ với bộ tích lũy), được lấy từ bảng này :
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
Sử dụng tất cả các thông tin này, Atari 2600 (và 6502 nhà phát triển khác) có thể xác định chính xác thời gian mã của họ thực hiện và xây dựng các thói quen làm những gì họ cần và vẫn tuân thủ các yêu cầu về thời gian tín hiệu TV của Atari. Và vì thời điểm này rất chính xác (đặc biệt là các hướng dẫn lãng phí thời gian như NOP), họ thậm chí có thể sử dụng nó để sửa đổi đồ họa khi chúng được vẽ.
Tất nhiên, 6502 của Atari là một trường hợp rất cụ thể và tất cả điều này chỉ có thể vì hệ thống có tất cả những điều sau đây:
- Một chiếc đồng hồ chủ chạy mọi thứ, kể cả RAM. Các hệ thống hiện đại có đồng hồ độc lập cho CPU và RAM, với đồng hồ RAM thường chậm hơn và cả hai không nhất thiết phải đồng bộ.
- Không có bộ nhớ đệm dưới bất kỳ hình thức nào - 6502 luôn truy cập DRAM trực tiếp. Các hệ thống hiện đại có bộ đệm SRAM khiến cho việc dự đoán trạng thái khó khăn hơn - trong khi có lẽ vẫn có thể dự đoán hành vi của hệ thống với bộ đệm, điều này chắc chắn khó khăn hơn.
- Không có chương trình nào khác chạy đồng thời - chương trình trên hộp mực có toàn quyền kiểm soát hệ thống. Các hệ thống hiện đại chạy nhiều chương trình cùng một lúc bằng các thuật toán lập lịch không xác định.
- Tốc độ đồng hồ đủ chậm để tín hiệu có thể truyền qua hệ thống kịp thời. Trên một hệ thống hiện đại có tốc độ xung nhịp 4 GHz (chẳng hạn), phải mất một photon ánh sáng 6,67 chu kỳ đồng hồ để đi hết chiều dài của bo mạch chủ nửa mét - bạn không bao giờ có thể mong đợi bộ xử lý hiện đại sẽ tương tác với một thứ khác trên bo mạch chỉ trong một chu kỳ, vì phải mất hơn một chu kỳ để tín hiệu trên bảng thậm chí đến được thiết bị.
- Tốc độ xung nhịp được xác định rõ, hiếm khi thay đổi (1,19 MHz trong trường hợp của Atari) - tốc độ CPU của các hệ thống hiện đại luôn thay đổi, trong khi Atari không thể làm điều này mà không ảnh hưởng đến tín hiệu TV.
- Thời gian chu kỳ được công bố - x86 không xác định thời gian của bất kỳ hướng dẫn nào.
Tất cả những điều này kết hợp với nhau để tạo ra một hệ thống trong đó có thể tạo ra các bộ hướng dẫn mất một khoảng thời gian chính xác - và đối với ứng dụng này, đó chính xác là những gì được yêu cầu. Hầu hết các hệ thống không có mức độ chính xác này đơn giản chỉ vì không cần nó - các tính toán được thực hiện khi chúng hoàn thành hoặc nếu cần một lượng thời gian chính xác, một chiếc đồng hồ độc lập có thể được truy vấn. Nhưng nếu nhu cầu là đúng (chẳng hạn như trên một số hệ thống nhúng), nó vẫn có thể xuất hiện và bạn sẽ có thể xác định chính xác thời gian mã của bạn chạy trong các môi trường này.
Và tôi cũng nên thêm từ chối trách nhiệm lớn rằng tất cả những điều này chỉ áp dụng cho việc xây dựng một bộ hướng dẫn lắp ráp sẽ mất một khoảng thời gian chính xác. Nếu những gì bạn muốn làm là lấy một số phần lắp ráp tùy ý, ngay cả trong các môi trường này và hỏi "Việc này sẽ mất bao lâu để thực thi?", Bạn hoàn toàn không thể làm điều đó - đó là Vấn đề Ngừng , đã được chứng minh là không thể giải quyết được.
EDIT 1: Trong phiên bản trước của câu trả lời này, tôi đã nói rằng Atari 2600 không có cách nào để thông báo cho bộ xử lý biết tín hiệu của TV ở đâu, điều đó buộc nó phải giữ cho toàn bộ chương trình được tính và đồng bộ hóa ngay từ đầu. Như tôi đã chỉ ra trong các nhận xét, điều này đúng với một số hệ thống như ZX Spectrum, nhưng không đúng với Atari 2600, vì nó chứa một thanh ghi phần cứng tạm dừng CPU cho đến khi xảy ra khoảng trống ngang tiếp theo, cũng như một chức năng để bắt đầu khoảng trống dọc theo ý muốn. Do đó, vấn đề đếm chu kỳ được giới hạn ở mỗi đường quét và chỉ trở nên chính xác nếu nhà phát triển muốn thay đổi nội dung khi đường quét đang được vẽ.