Решения задачи #15.
Начертить шахматную доску.
; c15 entry by Beeblebrox / TMA ; 21 bytes .model tiny .code .386 org 100h start: mov ah,0B8h mov es,ax ; video seg =0B800h m0: scasw ; di=0 mov cl,8 m1: xchg ax,bx ; char=0, attr=0B8h|0 stosw stosw loop m1 add di,160-32-2 ; next row xchg ax,bx shl si,1 ; 8 times jnc m0 ret end start |
Комментарий: Это самый короткий из всех присланных кодов.
Идея кода: Используется прямая работа с видеопамятью, заодно старшее слово сегмента видеопамяти используется как атрибут символов "белой" клетки. Процесс рисования клеток по вертикали повторяется 8 раз - и на экране шахматная доска.
;Task #15 ;tasm /m task.asm ;tlink /x /3 /t task.obj ;25 байт ;by G3 .model tiny .386 .code org 100h Start: mov bh,0B8h mov es,bx ;es=0B800h stosw ;di=0 mov al,0DBh ;код символа в ASCII mov cl,8 L1: xor ah,[si] ;установить цвет символа (0h или B7h) L2: stosw ;вывод ax на экран stosw ;вывод ax на экран add bl,32 ;повторить 8 раз (256/32=8) jnc L1 add di,80h ;перейти к следующей строке loop L2 ret end Start |
Комментарий: Идея почти такая же как у Beeblebrx - используется прямая работа с видео памятью, но метод изменения цвета длиннее на 4 байта.
; Assembler Tasks COMPO #15 ; tasm /m task15.asm ; tlink /x /3 /t task15.obj ; task15.com ; by Broken Sword ; size: 26 bytes .model tiny .code .386 org 100h @@start: mov AL,0DBh mov BL,8 @@S0: mov CL,8 @@S1: int 29h int 29h xor AL,0FBh loop @@S1 xor AL,0FBh mov CL,64 @@S2: int 29h loop @@S2 dec BX jnz @@S0 ret end @@start |
Комментарий: Вывод на экран в этом коде осуществляется с помощью int 29h. Сначала выводится закрашенная клетка (0DBh), затем с помощью команды xor al, 0FBh в AL заносится 20h (ASCII-код пробела). С помощью той команды в AL возвращается исходное значение. Минус - вместе с клетками выводятся закрашенные строки.
;by Shur ;26 bytes .model tiny .code .186 org 100h start: push 0b81fh pop es mov al,0dbh mov cl,8 _row: mov bl,8 _cell: stosw stosw xor ah,[si] ;68h - opcode for push dec bx jnz _cell add di,160-8*2*2 xor ah,[si] loop _row ret end start |
Комментарий: Это решение сходно со вторым.
;tasm /m2 prog.asm ;tlink /t prog ;27 байт ;by Alex CSEG segment assume cs:CSEG, ds:CSEG, ss:CSEG, es:CSEG org 100h main: cwd ;dx=0, т.к. при загрузке ax=bx=0 mov ax,02dbh ; ah=2,номер ф-ции для int 10h, в al код символа mov cl,32 ;количество повторов цикла cicl: int 29h ; вывод символа на экран int 29h xchg ax,dx ; большинство команд оптимизировано для ax add al,4 ; увеличение координаты курсора cmp al,16 ; сравнение счётчика с концом строки jl l_cicl ; если меньше, то повтор цикла xor al,10010b ; если al=16, то al:=2, если al=18, то al:=0 inc ah l_cicl: xchg ax,dx int 10h ; изменение позиции курсора loop cicl quit: ret ;выход //1 байт CSEG ends end main |
Комментарий: Без комментариев.
; By Jendos 54 byte ; tasm task15.asm ; tlink /t task15.obj .model tiny .386 .code org 100h start: mov ax,3 int 10h xor dx,dx mov si,8 push 0cccch p1: mov ax,200h int 10h pop ax not ax push ax xor dl,dl inc dh mov cx,16 p: pop ax ror ax,1 push ax jc black mov al,20h jmp next black: mov al,0dbh next: int 29h loop p dec si jnz p1 pop ax int 20h end start |
Комментарий: Самый подробный код, но, к сожалению, и самый большой.