Решения задачи #17.
6. Elf - 24 байта
7. Edward Samokhvalov - 26 байт
8. Eugene - 33 байта
10. Konstantin Zenchenko - 36 байт
13. DeMax - 50 байта
Вывести на экран строку - код Морзе для данной цифры.
|
;by Shur |
Комментарий: Если вы заметили в DL помещается не цифра, а символ. Хотя в условии задачи было сказано, что помещать в DL нужно именно цифру. Но вся "фишка" этого кода и заключается в том, что и цифрами этот код замечательно оперирует.
Идея кода: В общем-то Shur и G3 формируют двоичное число в соответствии с кодом Морзе и совершает вывод на экран как в Задаче №10.
|
; c17 entry by Beeblebrox / TMA |
Комментарий: Вообще Beeblbrox сообщал, что размер его решения 18 байт, но хочу обратить внимание, что если сказано, что DL (или любой другой регистр) чему-то равен, то в программе нужно сделать присваивание (см. Правила).
|
; Task17 |
|
;-task #17------- |
Решение by Edward Samokhvalov:
|
;Exersize #17 |
|
;Написал Eugene |
;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 |
|
;For Fasm |
; 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
|
;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 |