Phân tích kỹ thuật: Chỉ với 16 byte code x86 để tạo hiệu ứng mưa Matrix và âm thanh

Công nghệ17 tháng 5, 2026·6 phút đọc

Bài viết khám phá sức mạnh của lập trình assembly trong giới hạn cực hạn: một đoạn code chỉ dài 16 byte trên nền tảng x86 DOS có thể vẽ hình ảnh phân hình Sierpinski tương tự "mưa Matrix" và đồng thời phát ra âm thanh phức tạp qua loa máy tính.

Phân tích kỹ thuật: Chỉ với 16 byte code x86 để tạo hiệu ứng mưa Matrix và âm thanh

Trong thế giới của demoscene – nơi các nghệ sĩ kỹ thuật số thi nhau sáng tạo dưới những ràng buộc phần cứng khắt khe nhất – việc tối ưu hóa code không chỉ là nhu cầu, mà là một nghệ thuật. Gần đây, một bài viết kỹ thuật đã gây chú ý khi phân tích sâu về cách chỉ với vỏn vẹn 16 byte code assembly x86, người lập trình có thể tạo ra một hiệu ứng hình ảnh kỳ ảo tương tự như "mưa Matrix" và biến nó thành dữ liệu âm thanh.

Màn hình hiển thị hiệu ứng phân hình trên hệ thống DOSMàn hình hiển thị hiệu ứng phân hình trên hệ thống DOS

Màn trình diễn của 16 byte

Đoạn code này được thiết kế để chạy trên chế độ thực (real-mode) của DOS. Khi thực thi, nó sử dụng bộ nhớ video (video memory) của máy tính như một không gian tính toán để vẽ một phân hình Sierpinski (Sierpinski fractal) vô hạn. Điều đáng kinh ngạc là cùng lúc đó, dữ liệu hình học này cũng được chuyển đổi thành dữ liệu âm thanh và phát ra qua loa nội bộ (PC speaker).

Quá trình bắt đầu bằng một ngắt BIOS tiêu chuẩn int 10h, khởi tạo Chế độ Video 0 với lưới văn bản 40x25. Sau đó, đoạn code trỏ thanh ghi đoạn dữ liệu (DS) đến địa chỉ 0xB800 – địa chỉ bộ nhớ vật lý của bộ đệm văn bản VGA/CGA.

Tuy nhiên, điểm mấu chốt nằm ở cách BIOS xử lý bộ nhớ này. Khi xóa màn hình, BIOS không ghi giá trị 0 tuyệt đối vào bộ nhớ. Trong chế độ văn bản, mỗi ký tự chiếm 2 byte: byte ký tự ASCII và byte thuộc tính màu. BIOS khởi tạo 2.000 ô ký tự với ASCII là 0x20 (dấu cách) và màu là 0x07 (văn bản màu xám nhạt trên nền đen). Mặc dù màn hình trống rỗng về mặt thị giác, nhưng thực tế nó đã được "sơn" sẵn một mẫu dữ liệu đồng nhất.

Toán học đằng sau hình ảnh và âm thanh

Để hiểu rõ cơ chế hoạt động, ta cần nhìn vào thuật toán chạy trên bộ nhớ này. Code sử dụng một vòng lặp để di chuyển qua bộ nhớ, thực hiện các phép tính toán học trên từng ô.

Về mặt toán học, nếu tách biệt các biến số và giả sử một trạng thái zero hoàn hảo, vòng lặp này thực hiện phép cộng giá trị tích lũy vào ô nhớ. Do độ dài phân đoạn (segment) của chế độ thực DOS là 65.536 byte, và việc di chuyển qua bộ nhớ được tính toán sao cho phù hợp với độ dài của thanh ghi 8-bit, các giá trị sẽ tạo thành một chuỗi hệ số nhị thức (binomial coefficient sequence).

Sơ đồ mô phỏng các bit và sóng âm thanh được tạo raSơ đồ mô phỏng các bit và sóng âm thanh được tạo ra

Thay vì sử dụng phép cộng (add), đoạn code thực tế sử dụng phép XOR (phép loại trừ hợp bit) để cô lập các bit-plane. Khi sử dụng XOR với giá trị khởi đầu là 2 (nhị phân 00000010), chỉ Bit 1 bị ảnh hưởng. Điều này tạo ra sự chuyển đổi qua lại giữa 0x000x02, vẽ nên hình ảnh của tam giác Sierpinski. Quá trình này tuân theo Quy tắc 60 (Rule 60) trong lý thuyết về tự động hóa tế bào của Stephen Wolfram.

Từ hình ảnh đến sóng âm

Chi tiết tinh tế nhất nằm ở lệnh: out 61h, al

Cổng 61h là cổng giao tiếp với loa nội bộ của PC. Bit 1 của cổng này điều khiển trực tiếp màng loa: đẩy ra ngoài khi là 1 và thu về khi là 0. Quy trình tính toán fractal bằng XOR vừa cập nhật bộ nhớ hình ảnh, vừa ngay lập tức gửi byte đó tới cổng loa.

Do thuật toán chỉ cô lập và chuyển đổi Bit 1, hình học của tam giác Sierpinski đóng vai trò như một tập hợp các lệnh điều khiển màng loa. Tốc độ xử lý của CPU quyết định tần số lấy mẫu (sample rate) thực tế.

"Các mẫu hình của các bit 1 và 0 được tạo ra bởi fractal cho ra các sóng vuông riêng biệt, thay đổi tự nhiên theo độ rộng xung và tần số."

Khi fractal tạo ra một hàng xen kẽ, nó phát ra sóng vuông tần số cao. Khi cấu trúc tạo ra các khối số 0 lớn (khoảng trống trong tam giác), màng loa đứng yên, tạo ra những khoảng nghỉ nhịp điệu. Kết quả âm thanh là một đại diện âm thanh trực tiếp của cấu trúc toán học.

Sự biến đổi của bước nhảy và âm sắc

Một chi tiết thú vị trong đoạn code thực tế là cách nó di chuyển trong bộ nhớ. Thay vì tiến lên 16 byte như lý thuyết đơn giản, lệnh sub si, byte 57 kết hợp với việc tăng của lodsb tạo ra sự di chuyển ròng -56 byte cho mỗi lần lặp. Điều này khiến quy trình duyệt bộ nhớ theo chiều ngược.

Việc thay đổi bước nhảy này làm thay đổi cả tần số âm thanh và bố cục hình ảnh. Với bước nhảy 56, vòng lặp cần 8.192 lần lặp để đi qua tất cả các địa chỉ, gấp đôi so với bước nhảy 16. Do đó, chu kỳ macro dài hơn, làm giảm tần số cơ bản của hệ thống một nửa octave, tạo ra âm thanh trầm và sâu hơn.

Về mặt thị giác, bước nhảy này làm phân hình không hiển thị thành một khối liền mạch mà bị cắt xén chéo thành 10 cột dọc đứng trên màn hình, tạo nên hiệu ứng các cột ký tự nhấp nháy leo lên – gợi nhớ đến hiệu ứng "mưa số" trong bộ phim The Matrix.

Sự hỗn loạn của máy tính

Điều thú vị là thuật toán ghi trực tiếp vào byte ký tự ASCII, nơi Bit 1 điều khiển loa, trong khi 7 bit còn lại biến đổi thành một thác các ký tự giả ngẫu nhiên (pseudo-random glyphs) tạo nên kết cấu thị giác hỗn loạn.

Điều kỳ diệu là việc gửi toàn bộ byte dữ liệu hỗn hợp này trực tiếp tới cổng hệ thống 61h không gây ra sự cố phần cứng nào. Trong môi trường DOS chuẩn và các trình giả lập hiện đại, việc đẩy các bit dữ liệu thừa này vào cổng là vô hại. Sự trùng hợp ngẫu nhiên này cho phép dữ liệu hình ảnh an toàn kiêm luôn vai trò tín hiệu âm thanh.

Tuy nhiên, tác giả cũng lưu ý rằng đầu ra phụ thuộc phần nào vào trạng thái phần cứng ban đầu. Các cấu hình hệ thống khác nhau, BIOS khác nhau hoặc trình giả lập có thể để lại các dữ liệu khác nhau trong bộ nhớ, dẫn đến sự thay đổi nhỏ về ký tự hiển thị và âm sắc. Đây chính là một phần của sự quyến rũ khi làm việc trong những giới hạn chật hội: chấp nhận sự không thể đoán trước nhẹ của máy tính.

Kết luận

Đoạn code 16 byte này là một ví dụ điển hình cho thấy sự giao thoa giữa toán học, phần cứng cổ điển và nghệ thuật lập trình. Nó cho thấy ngay cả trong những giới hạn nhỏ nhất, người lập trình vẫn có thể tạo ra những tác phẩm phức tạp đa giác quan (thị giác và thính giác).

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗