x86 어셈블리, 512 바이트
NASM으로 컴파일되고 QEMU로 테스트되었습니다. 부팅하려면 부트 섹터의 끝에 2 바이트 부트 서명 (파일에 510 바이트)을 넣어야하므로 컴파일 된 코드를 0으로 채우는 317 바이트를 잃어 버렸습니다. 이것은 내 첫 골프이므로 거대한 오류에 대해 사과해야합니다.
[org 7c00h] ;So NASM can change the labels into memory locations correctly.
cld ;Tells lodsb to look forward in memory
mov bh, 65 ;Moves the ASCII value of A into the BH register
mov si, NATO ;Moves the first byte of NATO into the si register
call print ;Call the 'print' subroutine
jmp $ ;Loops forever
print:
mov ah, 0eh ;Moves the hex value 0E into the AH register. Tells interrupt 10h that we want subfucntion 0E
lodsb ;Load a byte of SI into AL and increments a register (DL i think) that tells it the offset to look at
cmp al, 3 ;Compares the AL register that now has a byte from our string to ASCII value 3 (Enf Of Text)
je R ;If AL == 3 then jump to R
cmp al, 0 ;Comapre AL to ASCII 0 (NULL)
je newWord ;If AL == 0 hump to newWord
int 10h ;Execute interrupt 10h Subfunction 0Eh (stored in AH register) which prints character value in AL
jmp print ;Jump to print
newWord:
mov al, 10 ;Move ASCII 10 (New Line) into AL
int 10h ;Print character
mov al, 13 ;Move ASCII 13 (Carriage Return) into AL
int 10h ;Print character
mov al, bh ;Move BH (which has our starting letter) into AL
int 10h ;Print Character
mov al, 58 ;Move ASCII 58 (:) into AL
int 10h ;Print Character
mov al, 32 ;Move ASCII 32 (Space) into AL
int 10h ;Print Character
mov al, bh ;Move BH into AL
int 10h ;Print Character
inc bh ;Increments BH by one (BH++)
jmp print ;Jump to print
R:
ret ;Returns from a subroutine
;Below defines bytes (db) of our string to print. I used 0 as word seperators and 3 to end the string.
NATO: db 0,"lfa",0,"ravo",0,"harlie",0,"elta",0,"cho",0,"oxtrot",0,"olf",0,"otel",0,"ndia",0,"uliet",0,"ilo",0,"ima",0,"ike",0,"ovember",0,"scar",0,"apa",0,"uebec",0,"omeo",0,"ierra",0,"ango",0,"niform",0,"ictor",0,"hiskey",0,"ray",0,"ankee",0,"ulu",3
times 0200h - 2 - ($ - $$) db 0 ;Zerofill the file with upto 510 bytes (This is where all my bytes are)
dw 0AA55H ;Write the bootsignature
산출
위의 코드가 출력하는 것입니다. 보시다시피 A : Alfa 가 누락되었으며 프롬프트의 키가 25 줄이기 때문에 ...
내가 A를 인쇄했음을 증명하기 위해 : Zulu가 Yankee와 같은 줄에 있도록 알파 로 교체 0,"ulu"
했습니다 32,"Z: Zulu"
.
누군가 내 코드에서 317 바이트의 zerofill을 빼면 195 바이트가 될 것이라고 말하면 감사하겠습니다. 또한 출력이 화면에 맞지 않기 때문에 이것이 유효한 경우.