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

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

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

2. Shur - 20 байт

3. G3 - 20 байт 

4. Beeblebrox - 20 байт

5. Ungydrid - 21 байт

6. Elf - 24 байта

7. Edward Samokhvalov - 26 байт

8. Eugene - 33 байта

9. Alexey_1 - 34 байта

10. Konstantin Zenchenko - 36 байт

11. Torax - 39 байт

12. Odin - 48 байт

13. DeMax - 50 байта

 

 

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

Вывести на экран строку - код Морзе для данной цифры.

 

Решение by Shur, G3:

;by Shur
        ;20 bytes
        ;tasm task17.asm
        ;tlink /t task17.obj
        .model tiny
        .code

        org 100h

start:
        mov dl,'7'
        mov cl,dl
        mov bl,11111b
        ror bx, cl
        mov cl,5
_out:
        shl bx,1
        adc al,'-'
        int 29h
        db 0d6h       ;salc
        loop _out
        ret
        end start

 

Комментарий: Если вы заметили в DL помещается не цифра, а символ. Хотя в условии задачи было сказано, что помещать в DL нужно именно цифру. Но вся "фишка" этого кода и заключается в том, что и цифрами этот код замечательно оперирует.

Идея кода: В общем-то Shur и G3 формируют двоичное число в соответствии с кодом Морзе и совершает вывод на экран как в Задаче №10.

 

Решение by Beeblebrox:

; c17 entry by Beeblebrox / TMA
; 20 bytes
.model tiny
.code
.386
; '-'=2Dh, '.'=2Eh
org 100h
start:
mov dl,7                            ; test: 7 => --...
mov          al,00011111B ; ax=0000000000011111B
mov          cl,dl
ror            ax,cl                  ; 7 => 0011111000000000
mov          cl,5                   ; ~~~~~
shift_loop: mov al,'-' SHR 1
rol             ax,1                  ; CF==0 => 2Ch , CF==1 => 2Dh
inc             ax                     ; '-' '.'
int             29h
loop          shift_loop
retn
end           start

 

Комментарий: Вообще Beeblbrox сообщал, что размер его решения 18 байт, но хочу обратить внимание, что если сказано, что DL (или любой другой регистр) чему-то равен, то в программе нужно сделать присваивание (см. Правила). 

Решение by Ungydrid:

; Task17
; Описание: Цифирь Морзе
; Размер: 21 байт
; Рецепт: tasm, tlink /t /x
; Автор: UNGYDRID

.model tiny
.code 
org 100h

start:
mov     dl, 7                    ; инициализация
mov     cl, dl                    ; заносим в счетчик для сдвига

mov     bh, 11111000b ; шаблон для цифр в формате *.morz :)
                                       ; (с учетом нижеследующего сдвига bx, любые 5 идущих подряд 
                                       ; бит образуют все 10 цифр)
                                       ; 1='.' 0='-'
rol       bx, cl                   ; смещаем шаблон в соответствии с нужной цифрой
                                       ; теперь морзянка расположена в bl, начиная с младшего бита
mov    cl, 5                     ; количество символов для loop
Go:
mov    al, '-'                   ; исходный символ (благо ASCII код "точки" идет следующим)
shr      bl, 1                    ; сдвигаем биты по порядку, младший скидывается в CF
adc      al, 0                    ; соответственно в случае 1 al увеличивается на 1
                                      ; и превращается в '.'
int       29h                     ; дальше просто
loop    Go

ret
end start

 

Решение by Elf:

;-task #17-------
;  tasm.exe /z/m
;  tlink /t
; size: 24 bytes
;-by elf---------
model tiny
.code
org100h
t:     mov dx, 8    ;по условию любое число e[0,9]
       mov cl, 5     ;число разрядов (символов) в коде
       mov al, 2eh ;al="."
       inc  dx       ;dx+1
w0: dec  dx       ;dx-1
      jz    w1        ;dl=0? (да-> w1; нет-> дальше)
      cmp dl, cl     ;если dl>5, то:
      jle   w2        ;(иначе идем на w2)
      sub dl, cl     ;dx-5
w1: xor al, 3      ;меняем "." на "-" (или наоборот)
w2: int  29h       ;вывод содержимого al
      loopw0        ;cl-1 cl=0? (да-> w0; нет-> дальше)
     ret               ;EXIT
end t

 

Решение by Edward Samokhvalov:

;Exersize #17
;TASM |31| bYt3Zz
;bY Sam0khval0v Edward
.model tiny
.code
.startup
             M0rz3       equ 5  ;то чаво выводить
             MagicNumb3r equ 9  ;это не трогать
             C0d3L3n     equ 5
             MandM       equ MagicNumb3r-M0rz3
;________________________________________________
             lea dx, Shab10n
             add dx, MandM
             mov ah, 40h
             mov cx, C0d3L3n
             mov bx,1
             int 21h
             ret
Shab10n      db     "----.....-----"
;читать 5 байт по offset = [Shabl0n+MagicNumber-Morz3]
end

 

Решение by Eugene:

;Написал Eugene
;способ компиляции:
;fasm 17.asm 17.com
;размер программы 33 байта
        org     100h
        mov     dl, 5     ;наше число, согласно условию

        mov     ax, '.-'  ;знаки, которые мы выводим
        cmp     dl, 5     ;проверим середину числа
        jb      cycle       ;меньше середины - идём на цикл
        sub     dl, 5      ;отнимем лишнее
        ror     ax, 8      ;поменяем местами знаки вывода

cycle:
;bl - счётчик цикла
        cmp     bl, dl    ;проверим, дошли мы до нашего числа?
        jne     not_equal ;
        ror     ax, 8     ;дошли - поменяем местами знаки вывода

not_equal:
        int     29h       ;выводим соответствующий знак
        inc     bl        ;увеличиваем счётчик
        cmp     bl, 5     ;выводим всего 5 знаков
        jne     cycle
        ret

Решение by Alexey_1:

;tasm /m2 task17.asm
;tlink /t task17
;34 байта
;by Alex

CSEG segment
assume cs:CSEG, ds:CSEG, ss:CSEG, es:CSEG
org 100h
.386
main:
xor dh,dh 		;очистка dh 				(2)

mov si,dx 		;si=dx 					(2)
vivod:
mov ah,9 		;ф-ция вывода на экран 			(2)
mov dx,offset morze+9 	;адрес строки вывода 			(3)
sub dx,si 		;минус цифра, которую надо вывести 	(2)
mov si,dx 		;					(2)
mov [si+5],byte ptr '$' 	;отмечаю конец строки 			(4)
int 21h 			;и вывожу на экран 			(2)


quit:
ret ;выход (1)
morze db '----.....-----' ;данные 14 байт

;итого 34 байта
CSEG ends
end main

Решение by Konstantin Zenchenko:

;task 17.asm
;tasm /l 17
;tlink /t 17
;size 36 byte
code segment
assume cs:code,ds:code,ss:code
org 100h
kod 	equ 7
begin: 	mov 	al,'.'
	mov 	bl,'-'
	mov 	cx,05
	mov 	dl,kod
	cmp 	dl,05
	jbe 	next
	sub 	dx,05
	xchg 	al,bl
next: 	cmp 	dl,0
	jz 	lab
	dec 	dx
	int 	29h
	loop 	next
ret
lab: 	mov 	dl,05
	mov 	al,bl
	jmp 	short next
code 	ends
end begin

Решение by Torax:

;For Fasm
;fasm ex17.asm ex17.com
;Created by Torax
        mov dx, 0008h
        mov cx, dx
        mov ax, '.-'
        cmp dl, 5
        jbe Spil
Dla5:;-----------------
        mov cl, 5
        sub cl, dl
        xchg ah, al
        neg cl
        mov dl, cl
Spil:;спЁльна частина
        call Vyvid
        mov cl, 5
        sub cl, dl
        xchg ah, al
        call Vyvid

Vyvid:
        or cl, cl
        jz Vyhid
lp:     int 29h
        loop lp
Vyhid:  ret

Решение by Odin:

; Task 17
; fasm task.asm task.com
; by Odin, size 48 bytes
           org   100h
           mov   	dx, 4
           push  	0B800h
           pop   	es
           mov  	bl, 5   	; кол-во символов для вывода на экран
           xor   	di, di  	;
           mov   	al, '.' 	;
           mov   	ah, 07h 	;
           mov   	cl, 5   	;
           rep   	stosw   	; выводим сначала 5 точек
           mov   	al, '-' 	;
           xor   	di, di  	; обнуляем координаты
           cmp   	dx, 6   	; если число >=6, то переходим
           jae   	here    	;
           sub   	bl, dl  	; если нет, то
           add   	dl, dl  	; вычисляем с какой позиции
           mov   	di, dx  	; начинать выводить -
           mov   	cx, bx  	; и сколько их выводить
           rep   	stosw   	;
           jmp   	exit    	;
here:
           sub   	dl, 5   	; сюда
           mov   	cl, dl  	; и выводим нужное число -
           rep   	stosw   	;
exit:
           retn

 

Решение by DeMax:

;task#17,coded by DeMax
;TASM 5.0
;50 bytes
;tasm /m task17.asm
;tlink /t task.obj
.model tiny
.386
.code
org 100h
start:
mov ah,1
int 21h
sub al,30h
mov dl,al
mov cl,dl
cmp dl,5
mov dl,0FFh 	;имею право, MOV на флаги не влияет :)
jg GR5 
shl dl,cl 		;если dl<=5, то сдвигаем биты влево на cl
jmp next
GR5: ;если dl>5, 
mov dl,0E0h 	;обнуляем первые 5 битов
sub cl,5
stc 		;используем CF как 9й разряд
rcl dl,cl 		;двигаем и заполняем единичками
next:
xor cx,cx
mov bl,'-' 
decode:
bt dx,cx 		;проверка первых 5 битов
mov al,'.' 	;пока запишем '.'
db 00Fh 	;cmovc ax,bx - если CF, то запишем в ax '-'
db 042h 	;TASM эту инструкцию
db 0C3h 	;отказывается понимать
cout:
int 29h 		;'fast console out' :)
inc cx 		;а этот участок кода
cmp cx,5 	;мне совсем не нравится,
jl decode 	;но ничего лучше не придумал
ret
end start
Hosted by uCoz