Z80 기계 코드, 8 6 바이트 *
<8ww8>
* 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
BASIC에서 입력하면 처음에는 0입니다. A
n 번 증가한 다음 동일한 메모리 위치 (기본적으로 약간 임의의 위치로 설정 됨)에 n 번 씁니다 ! JR
이후 점프 상대 작업은 아무것도하지 않을 C
플래그는 항상 해제 그래서 다음 바이트 "주석"을 사용! 이 버전은 특정 입력 조건, 즉 A
항상 0 인 BASIC 보장에서 입력한다고 가정하여 약간의 부정 행위를 합니다. 위치는 (HL)
안전하지 않을 수 있으며 실제로 위험한 위치 일 수 있습니다. 아래 코드는 훨씬 강력하기 때문에 훨씬 길다.
Z80 기계 코드, 30 바이트
ASCII로 :
o!.ww.!>A=o>{))((}<o=A<!.ww.!o
기본적으로 전반부는 0 값 생성을 보장하고 후반은이를 증가시켜 메모리에 씁니다. 아래의 확장 된 버전 ##
에서 미러의 절반에 목적이없는 코드를 나타냅니다.
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
허용 된 지침의 분류 :
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
허용 된 39 개의 명령어 중 28 개는로드 작업입니다 (0x40에서 0x7F까지의 블록은 모두 단일 바이트 LD
명령어 임). 대부분 여기서는 도움이되지 않습니다! 여전히 허용되는 메모리로드 명령 LD (HL), A
은 값을에 저장해야한다는 것입니다 A
. 이후 A
유일하게 허용 된 왼쪽 레지스터 INC
명령이 실제로 매우 편리합니다!
A
ASCII 0x00은 허용되는 문자가 아니므로 0x00으로 로드 할 수 없습니다 ! 사용 가능한 모든 값이 0과 거리가 멀고 모든 수학 및 논리 명령이 허용되지 않습니다! 빼고 ... 난 여전히 할 수있어 ADD HL, HL
16 비트 HL
를 추가 할 수 있습니다 ! 별도로 직접 (아무 소용이 여기에!) 값을로드 이상 증가 A
및 감소시키는 A
, L
또는HL
이것이 내가 레지스터의 값을 변경의있는 유일한 방법입니다! 실제로 상반기에 도움이 될 수있는 하나의 전문적인 지시가 있지만 하반기에 해결해야 할 고통과 여기에 거의 쓸모가없고 공간을 차지할 수있는 보충 지시가 있습니다.
그래서 0에 가장 가까운 값을 찾았습니다 .0x41. 어떻게 0에 가깝습니까? 이진수로 0x01000001입니다. 나는 그것을 감소 그래서,에로드 L
하고 할 ADD HL, HL
두 배! L
이제 0입니다.A
. 불행히도의 ASCII 코드 ADD HL, HL
는 )
이제 (
두 번 사용해야 합니다. 다행히 (
되고 JR Z, e
, 여기서 e
다음 바이트입니다. 그래서 그것은 두 번째 바이트를 혼란스럽게 만들고 Z
플래그 에주의를 기울여 아무것도하지 않도록해야합니다 ! Z
플래그에 영향을 미치는 마지막 명령 은 DEC A
(반 직관적으로, ADD HL, HL
변경하지 않습니다) A
그 시점에서 그것이 0x40 이라는 것을 알고 있기 때문에 Z
설정되지 않았다는 것이 보장 됩니다.
JR Z, #28
A가 255에서 0으로 오버플로 된 경우에만 Z 플래그를 설정할 수 있기 때문에 후반의 첫 번째 명령 은 처음 255 회 아무 것도 수행하지 않습니다. 그러나 출력은 잘못됩니다. 그러나 어쨌든 8 비트 값만 저장하므로 중요하지 않습니다. 코드를 255 번 이상 확장하면 안됩니다.
깨끗하게 반환하는 모든 가능한 방법이 허용되지 않았으므로 코드는 스 니펫으로 실행되어야합니다. 모든 RETurn 명령어는 0x80보다 높으며, 8 비트 음수 값도 모두 허용되지 않았기 때문에 허용되는 소수의 점프 연산은 양의 오프셋으로 만 점프 할 수 있습니다!
#
자체 반사도 있지만 콘솔 라가 아니라 맞습니다.