Правила - Рейтинг участников - Библиотека решений

Решения задачи #15.

1. Условие задачи

2. Beeblebrox - 21 байт.

3. G3 - 25 байт.

4. Broken Sword - 26 байт.

5. Shur - 26 байт.

6. Alexey_1 - 27 байт.

7. Jendos - 54 байта.

 

Условие задачи.

Начертить шахматную доску.

 

Решение by Beeblebrox:

; 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 раз - и на экране шахматная доска.

 

Решение by G3:

;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 байта.

 

Решение by Broken Sword:

; 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:

;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

 

Комментарий: Это решение сходно со вторым.

 

Решение by Alexey_1:

;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:

; 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

 

Комментарий: Самый подробный код, но, к сожалению, и самый большой.

Hosted by uCoz