Автор: G3
Цель задачи: Вывести в STDOUT строку из X символов ′#′. X вводится из STDIN. 0 < X < 256.
Для вывода должна использоваться процедура 6 прерывания 21h ( mov ah,6 / int 21h ).
Можно использовать только команды работы со стеком, безусловные переходы, команды сравнения битов, логические операции и операции сдвига.
Полный список допустимых команд:
AND, BSF, BSR, BT, BTC, BTR, BTS, CALL, CBW, CLC, CMC, CWD, DEC, INT, JMP, LAHF, LEA, MOV, MOVSX, MOVZX, NOT, OR, POP, POPA, POPF, PUSH, PUSHA, PUSHF, RCL, RCR, RET, ROL, ROR, SAHF, SAL, SALC, SAR, SETxx, SHL, SHR, STC, TEST, XCHG, XOR
Решение от G3:
;Task43 by G3 (tgm80@mail.ru) 21 bytes
;fasm.exe entry.asm entry.com
org 100h
start: ;si=0100h, bp=09xxh, di=FFFEh
mov ah,07h ;
mov dl,′#′ ;выводимый символ
int 21h ;первый раз ввод символа, потом вывод
not word[si-100h+$] ;сменить на or [bp+di+3106h],ch; xor al,94h
xor [si],si ;сменить mov ah,07h на mov ah,06h
xchg ax,sp ;sp = 0700h + X
shl sp,1 ;sp = sp * 2
push ax ;sp = sp - 2, идея Shur
shr sp,1 ;sp = sp / 2, в конце цикла sp=06FFh
and si,sp ;в конце цикла si=0 (0100h and 06FFh = 0)
jmp si ;jmp 100h, в конце цикла jmp 0
|