Mã máy Z80, 8 6 byte *
<8ww8> * Giả sử một số điều kiện bằng cách nhập từ Amstrad BASIC
< INC A // A=A+1
8w JR C, #77 ## C is unset unless A has overflowed, does nothing
w LD (HL), A // Saves A to memory location in HL (randomly initialised)
8> JR C, #3E ## C is still unset, does nothing
Aban đầu là 0 khi được nhập từ BASIC. Nó tăng A n lần, sau đó ghi n lần vào cùng một vị trí bộ nhớ (được đặt ở vị trí hơi ngẫu nhiên theo BASIC)! Hoạt động JRJump Relative không bao giờ thực hiện bất cứ điều gì vì Ccờ luôn không được đặt, do đó được sử dụng để "nhận xét" byte sau đây! Phiên bản này hơi gian lận bằng cách giả sử một số điều kiện nhập cảnh, cụ thể là nhập từ BASIC đảm bảo Aluôn là 0. Vị trí của (HL)không được đảm bảo an toàn, và trên thực tế, có lẽ là một vị trí nguy hiểm. Đoạn mã dưới đây mạnh mẽ hơn nhiều, đó là lý do tại sao nó dài hơn nhiều.
Mã máy Z80, 30 byte
Như ASCII:
o!.ww.!>A=o>{))((}<o=A<!.ww.!o
Về cơ bản, nửa đầu đảm bảo tạo ra giá trị 0 và nửa sau tăng nó và ghi vào bộ nhớ. Trong phiên bản mở rộng dưới đây ##biểu thị mã không phục vụ mục đích trong một nửa gương của nó.
o LD L, A ##
!.w LD HL, #772E // Load specific address to not corrupt random memory!
w LD (HL), A ## Save random contents of A to memory
.! LD L, #21 ##
>A LD A, #41 // A=#41
= DEC A // A=#40
o LD L, A // L=#40
>{ LD A, #7B ##
) ADD HL, HL // HL=#EE80
) ADD HL, HL // HL=#DD00. L=#00 at this point
(( JR Z, #28 ##
} LD A, L // A=L
< INC A // A=L+1
o LD L, A // L=L+1
= DEC A // A=L
A LD B, C ##
< INC A // A=L+1
!.w LD HL, #772E // Load address back into HL
w LD (HL), A // Save contents of A to memory
.! LD L, #21 ##
o LD L, A // L=A
Phân tích các hướng dẫn được phép:
n op description
-- ---- -----------
28 LD LoaD 8-bit or 16-bit register
3 DEC DECrement 8-bit or 16-bit register
1 INC INCrement 8-bit or 16-bit register
1 ADD ADD 8-bit or 16-bit register
Available but useless instructions:
3 JR Jump Relative to signed 8-bit offset
1 DAA Decimal Adjust Accumulator (treats the A register as two decimal digits
instead of two hexadecimal digits and adjusts it if necessary)
1 CPL 1s ComPLement A
1 HALT HALT the CPU until an interrupt is received
Trong số 39 hướng dẫn được phép, 28 là các hoạt động tải (khối từ 0x40 đến 0x7F đều là các lệnh đơn byte LD), hầu hết trong số đó không có trợ giúp ở đây! Tải duy nhất vào lệnh bộ nhớ vẫn được phép là LD (HL), Ađiều đó có nghĩa là tôi phải lưu trữ giá trị trong A. Vì Alà đăng ký duy nhất còn lại với một INChướng dẫn được phép, điều này thực sự khá tiện dụng!
Tôi không thể tải Avới 0x00 để bắt đầu vì ASCII 0x00 không phải là ký tự được phép! Tất cả các giá trị khả dụng khác xa 0 và tất cả các hướng dẫn toán học và logic đã không được phép! Ngoại trừ ... tôi vẫn có thể làm ADD HL, HL, thêm 16-bit HLcho chính nó! Ngoài việc tải trực tiếp các giá trị (không sử dụng ở đây!), Tăng Avà giảm giá A, Lhoặc HLđây là cách duy nhất tôi có để thay đổi giá trị của một thanh ghi! Thực sự có một hướng dẫn chuyên biệt có thể hữu ích trong nửa đầu nhưng một nỗi đau phải làm việc trong nửa sau và một hướng dẫn bổ sung gần như vô dụng ở đây và sẽ chỉ chiếm không gian.
Vì vậy, tôi tìm thấy giá trị gần nhất với 0 Tôi có thể: 0x41. Làm thế nào là gần 0? Trong nhị phân, nó là 0x01000001. Vì vậy, tôi giảm nó, tải nó vào Lvà làm ADD HL, HLhai lần! Lbây giờ là số không, mà tôi tải lại vào A! Thật không may, mã ASCII cho ADD HL, HLlà )vì vậy bây giờ tôi cần sử dụng (hai lần. May mắn thay, (được JR Z, e, nơi elà byte tiếp theo. Vì vậy, nó ngấu nghiến byte thứ hai và tôi chỉ cần chắc chắn rằng nó không làm gì bằng cách cẩn thận với Zcờ! Hướng dẫn cuối cùng ảnh hưởng đến Zcờ là DEC A(theo trực giác, ADD HL, HLkhông thay đổi nó) và vì tôi biết rằng đó Alà 0x40 tại thời điểm đó, nó được đảm bảo rằng Znó không được đặt.
Lệnh đầu tiên trong nửa thứ hai JR Z, #28sẽ không làm gì 255 lần đầu tiên vì cờ Z chỉ có thể được đặt nếu A đã tràn từ 255 xuống 0. Sau đó, đầu ra sẽ bị sai, tuy nhiên vì dù sao nó chỉ lưu các giá trị 8 bit không nên quan trọng Mã không nên được mở rộng hơn 255 lần.
Mã phải được thực thi như một đoạn trích vì tất cả các cách có sẵn để trả lại sạch sẽ không được phép. Tất cả các hướng dẫn RETurn đều trên 0x80 và một vài thao tác Jump được phép chỉ có thể chuyển sang phần bù dương, bởi vì tất cả các giá trị âm 8 bit cũng không được phép!
#cũng là mối quan hệ riêng của nó, nhưng, bạn nói đúng, không phải trong consolas.