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
A
ban đầ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 JR
Jump Relative không bao giờ thực hiện bất cứ điều gì vì C
cờ 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 A
luô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ì A
là đăng ký duy nhất còn lại với một INC
hướ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 A
vớ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 HL
cho 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 A
và giảm giá A
, L
hoặ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 L
và làm ADD HL, HL
hai lần! L
bâ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, HL
là )
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 e
là 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 Z
cờ! Hướng dẫn cuối cùng ảnh hưởng đến Z
cờ là DEC A
(theo trực giác, ADD HL, HL
không thay đổi nó) và vì tôi biết rằng đó A
là 0x40 tại thời điểm đó, nó được đảm bảo rằng Z
nó không được đặt.
Lệnh đầu tiên trong nửa thứ hai JR Z, #28
sẽ 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.