Écrit la sortie pour filtrer le périphérique du R16K1S60 en ASCII. Fonctionne sur le jouet Powder save 2012356
. (Voir le lien dans l'en-tête pour plus d'informations)
La taille en octets du programme est le résultat compilé (cellules utilisées * 2), pas l'assembly.
Vous savez que vous avez bien fait lorsque le logo prend plus de place que votre bytecode.
a:
mov ex, ip
mov ax, .string
mov sp, ip
mov dx, 0x1000
send sp, dx
.loop:
mov bx, [ax]
cmp bx, ip
je .end
cmp bx, ip
je .newline
shr bx, cx, 8
and cx, 0x00FF
.inner:
send sp, cx
sub bx, ex
jnz .inner
.reentry:
add ax, ex
jmp .loop
.newline:
add dx, 0x0020
send sp, dx
jmp .reentry
.string:
dw 0x0120
dw 0x135F
dw 0x000C
dw 0x012F
dw 0x1320
dw 0x015C
dw 0x000C
dw 0x152D
dw 0x000C
dw 0x017C
dw 0x1320
dw 0x017C
dw 0x000C
dw 0x152D
dw 0x000C
dw 0x017C
dw 0x1320
dw 0x017C
dw 0x000C
dw 0x152D
dw 0x000C
dw 0x015C
dw 0x0A5F
dw 0x0420
dw 0x055F
dw 0x012F
dw 0x000C
dw 0x0B20
dw 0x017C
dw 0x0220
dw 0x012F
dw 0x000C
dw 0x0B20
dw 0x017C
dw 0x0120
dw 0x012F
dw 0x000C
dw 0x0B20
dw 0x017C
dw 0x012F
dw 0x0009
.end:
hlt
Explication
Le code d'assembly ci-dessus implémente un algorithme de compression simple, avec les mots 0x000C étant une nouvelle ligne et 0x0009 étant la commande pour arrêter l'exécution.
Les autres mots sont encodés simplement, comme ceci: 0xTTCC
L'ASM utilise tous les registres à sa disposition, y compris certains des moins couramment utilisés:
Le pointeur d'instructions, pour obtenir un rappel rapide de quelques valeurs connues pour enregistrer quelques octets (une valeur constante dans une instuction qui n'est pas seulement un registre utilise un octet supplémentaire pour le stocker)
Le Stack Pointer est utilisé comme 6ème registre à usage général, car aucun code n'utilise la pile.
Seuls AX, BX, CX et DX sont réellement utilisés pour les données importantes. EX et SP sont utilisés pour stocker certaines constantes qui sont fréquemment utilisées.
C'est un peu simple et n'a aucune chance de gagner, mais c'était amusant d'écrire!
Voir l'historique des révisions pour l'ancienne réponse (elle est tout aussi importante en termes d'ASM)
funfact: si cela était mesuré en mots (dans le cas des bits R16K1S60,16), il serait plus petit que la réponse pyth, à 72 octets