Решения задачи #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 |