x86-16 머신 코드 (DOS), 16 바이트
B4 02 mov ah, 2
B2 30 mov dl, '0'
B9 1F 00 mov cx, 31
PrintZeros:
CD 21 int 0x21
E2 FC loop PrintZeros
00 CA add dl, bl
CD 21 int 0x21
C3 ret
위 함수는 BL
레지스터 (하위 바이트 )에서 부울 값 (0 == falsey, 1 == truthy)을 수신하고 BX
"중복 부울"문자열을 표준 출력으로 인쇄합니다.
인터럽트 (0x21)를 호출 AH
하여 단일 문자 (in DL
)를 표준 출력으로 인쇄하는 DOS 함수 호출 ( 2 로 설정 하여 선택 )을 수행합니다.
먼저 ASCII 문자 '0' 이로 로드되고 DL
카운터 ( CX
)가 31로 설정되고 "중복"바이트를 인쇄하기 위해 반복됩니다. 그리고, 입력 부울 값에 추가된다 DL
(만약 BL
falsey이고, 0을 추가하여 떠나 DL
ASCII '0'으로 변경되지 않고, 경우 BL
truthy이고, DL
ASCII '1'로 하나씩 증가한다), 최종 바이트가 인쇄된다.
이 함수는 값을 반환하지 않습니다.
실제로 문자열을 수행하지 않는 언어에 적합합니다.
풀 프로그램, 21 바이트
전체 프로그램으로 만들려면 5 바이트 만 더 필요합니다. 레지스터에서 입력을 전달하는 대신 응용 프로그램을 호출 할 때 명령 줄에 전달 된 인수에서 입력을 읽습니다. 인수 0은 인수가 완전히없는 것처럼 거짓으로 해석됩니다. 0보다 큰 인수는 진실한 것으로 해석됩니다.
다음 코드를 COM 프로그램으로 조립 한 다음 명령 줄에서 실행하면됩니다.
B4 02 mov ah, 2
B2 30 mov dl, '0'
B9 1F 00 mov cx, 31
PrintZeros:
CD 21 int 0x21
E2 FC loop PrintZeros
3A 16 82 00 cmp dl, BYTE PTR [0x82] ; compare to 2nd arg, at offset 0x82 in PSP
D6 salc ; equivalent to sbb al, al
28 C2 sub dl, al
CD 21 int 0x21
C3 ret ; you can simply 'ret' to end a COM program
샘플 출력 :
C:\>bool.com
00000000000000000000000000000000
C:\>bool.com 0
00000000000000000000000000000000
C:\>bool.com 1
00000000000000000000000000000001
C:\>bool.com 2
00000000000000000000000000000001
C:\>bool.com 7
00000000000000000000000000000001
어떻게 작동합니까? 글쎄, 그것은 CMP
지시에 도달 할 때까지 기본적으로 같은 것 입니다. 이것은 명령 행 인수와 DL
레지스터 값 (ASCII '0'을 포함 함)을 비교합니다. COM 프로그램에서 코드 바이트는 오프셋 0x100에로드됩니다. 그 앞에는 DOS 프로그램의 상태에 대한 정보가 들어있는 PSP (프로그램 세그먼트 접 두부) 가 있습니다. 특히 오프셋 0x82에서 프로그램을 호출 할 때 명령 줄에 지정된 첫 번째 (실제로 두 번째는 공백이므로) 인수를 찾습니다. 따라서이 바이트를 ASCII '0'과 비교합니다.
비교는 플래그를 설정 한 다음 두 값이 같으면 SALC
명령어 (Pentium 이전에 문서화되지 않은 opcode sbb al, al
, 2 대신 1 바이트 만) AL
를 0으로 설정 하고, 값이 다르면 -1로 설정합니다. 그것은 우리가 뺄 때 다음 명백한 AL
에서 DL
적절한이 중 ASCII '0'의 결과 또는 '1'.
(어떤 아이러니하게도, 첫 문자 만 보이므로 명령 행에서 앞에 0이 01
붙은 인수를 전달하면 인수가 중단됩니다. 따라서 거짓으로 취급됩니다. :-)