이모지만으로 유용한 DOS 실행 파일을 만들 수 있을까
요약
UTF-8 이모지의 바이트열을 8088 어셈블리 명령어로 해석하여 DOS 실행 파일을 만드는 기술적 가능성을 탐색합니다. 이모지 바이트의 제약 사항을 극복하며 MOV, STOSB 등의 명령어를 추출하고 메모리 주소에 접근하는 방식을 제안합니다.
핵심 포인트
- UTF-8 이모지 바이트를 8088 명령어(LOCK, LAHF 등)로 직접 해석 가능
- 개구리 이모지의 특정 바이트를 활용해 MOV AX, immediate 명령어 구현
- DOS 스택의 0을 활용한 AX 초기화 및 CGA 비디오 메모리 접근 구상
- 이모지 기반 LLVM 백엔드 구축 가능성 시사
UTF-8 이모지의 바이트열을 8088 명령어 로 직접 해석해, 이모지만으로 작동하는 DOS 실행 파일을 만들 가능성을 탐색함
여러 이모지가 0xF0 0x9F
로 시작하며, 8088에서는 각각 LOCK
접두사와 LAHF
가 되므로 AH 레지스터가 계속 손상 되는 제약 속에서 나머지 바이트를 활용해야 함
조사 과정에서 FWAIT
, STOSB
, CBW
, SCASB
와 덧셈처럼 쓸 수 있는 뺄셈을 발견했으며, 개구리 이모지의 F0 9F 90 B8
은 마지막 B8
을 MOV AX, immediate
로 해석할 수 있음
DOS가 COM 프로그램 시작 시 스택에 넣는 0을 비공식 POP AX
별칭인 8F F0
으로 꺼내 AX를 0으로 초기화 하고, CGA 비디오 메모리 근처의 주소를 얻어 문자를 쓰는 방식을 구상함
작은 로더와 이모지 인코더 를 결합하면 처음 예상한 32KiB 규모의 복잡한 우회 없이 구현할 수 있으며, 궁극적으로 이모지 기반 LLVM 백엔드까지 상정함
UTF-8 이모지를 8088 코드로 해석하기
여러 UTF-8 이모지 코드 포인트는 0xF0
으로 시작하며, 이는 8088에서 비교적 무해한 LOCK
접두사 로 작동함
예시 바이트열 F0 9F 92 AF
는 다음 명령어로 해석됨
F0 9F
: lock lahf
92
: xchg dx,ax
AF
: scasd
두 번째 바이트 9F
는 LAHF
이므로 실행할 때마다 AH를 덮어씀
이 부작용을 상수처럼 받아들이면 이모지 바이트의 절반가량을 활용할 수 있음
DOS 인터럽트 호출에는 AH가 필요한 경우가 있어 중요한 제약으로 남음
활용 가능한 명령어 찾기
조사 대상 이모지는 3,717개 였지만 F0 9F B0-BF
로 시작하는 항목은 찾지 못함
이 범위가 있었다면 mov reg,imm
명령어를 얻을 수 있었음
많은 다른 이모지는 E2
로 시작해 8088의 LOOP
가 되며, E3
은 JCXZ
가 됨
단독으로는 크게 유용하지 않지만 다른 명령어를 완성하는 바이트로 활용할 가능성이 있음
컬러로 표시되는 키캡 문자 도 이모지 후보에 포함했으며, 일부 바이트 조합은 ALU 연산에 활용할 수 있음
모래시계 이모지의 바이트열은 명령어로 해석하면 FWAIT
가 됨
포인터 이동과 메모리 쓰기
한 이모지 바이트열은 cbw; scasb
가 되어 포인터를 증가 시키는 데 사용할 수 있음
다른 바이트열은 xchg cx,ax; sub di,8FB8h
로 해석됨
xchg
는 불필요한 잡음으로 취급할 수 있음
sub di,8FB8h
는 7048h
를 더하는 것과 같으며, 그중 48h
는 활용 가능한 값임
또 다른 이모지는 stosb
가 되어 DI를 증가시키면서 해당 위치에 바이트를 쓸 수 있음
개구리 이모지가 제공한 MOV
개구리 이모지의 UTF-8 바이트는 F0 9F 90 B8
임
앞의 세 바이트는 사실상 3바이트 NOP처럼 취급할 수 있음
마지막 B8
은 MOV AX, immediate
의 연산 코드임
뒤따르는 이모지 바이트를 즉시값으로 소비하도록 구성하면 AX에 값을 넣을 수 있어 전체 접근법의 핵심 명령어가 됨
"HELLO"
출력을 목표로 +1
과 +48
만으로 문자 값을 계산하는 방법도 검토함
H
의 16진수 ASCII 값이 48h
라는 점을 활용할 수 있음
DOS 초기 상태 활용
CGA 비디오 메모리는 B800
세그먼트에 있으며, 한 이모지 조합으로 DX에 B8EFh
를 얻을 수 있음
정확한 시작점은 아니고 화면 아래쪽 약 3,824바이트 지점이지만, 이모지 어셈블리에서 사용할 만한 주소로 간주함
8F F0
은 문서화되지 않은 POP AX
별칭 임
DOS는 COM 프로그램 시작 시 스택에 0을 넣어두므로 이를 꺼내면 AX를 0으로 초기화할 수 있음
아직 xor ax,ax
를 만드는 이모지 바이트 조합은 찾지 못함
PSP를 이용한 크기 코딩 기법
DOS 데모 크기 코딩에서는 프로그램 시작 시 초기화되는 PSP(Program Segment Prefix) 값을 활용하기도 함
시작 직후 les bx,[bx]
를 실행하면 VGA 비디오 메모리에 사용할 수 있는 포인터를 얻음
PSP 안의 0x9FFF
값을 세그먼트로 사용함
이 주소는 VGA 메모리 시작점에서 16바이트 떨어져 있어 보정할 수 있음
이모지 어셈블리 자체와 직접 관련된 기법은 아니지만, DOS의 초기 상태를 활용한다는 점에서 유사함
로더부터 LLVM 백엔드까지
처음에는 Brainfuck 수준의 우회 때문에 약 32KiB 가 필요할 수 있다고 우려했지만, 발견한 명령어 조합으로 실제 동작 가능성이 높아짐
작은 로더와 이모지 인코더 를 마련한 뒤 계산 가능성을 활용하면 기술적으로 구현할 수 있음
최종적으로 이모지를 기계어로 생성하는 LLVM 백엔드 까지 구상함
댓글과 토론
AI 자동 생성 콘텐츠
본 콘텐츠는 RSS: GeekNews (한국어)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기