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(만약 BLfalsey이고, 0을 추가하여 떠나 DLASCII '0'으로 변경되지 않고, 경우 BLtruthy이고, DLASCII '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붙은 인수를 전달하면 인수가 중단됩니다. 따라서 거짓으로 취급됩니다. :-)