Отправляет email-рассылки с помощью сервиса Sendsay

Задачи по ассемблеру

  Все выпуски  

Задачи по ассемблеру


Информационный Канал Subscribe.Ru


Задачи по ассемблеру.


Выпуск #18.

Добрый день, уважаемые подписчики! Поступило предложение обсуждать решения в форуме. Давайте, я не против. Форум можно найти у меня на сайте. А у меня праздник: "inc MyAge" - день рождения по-русски. Поздравления на почту. И еще. Приходится возвращаться к тому, с чего начиналась рассылка: будут публиковаться решения для первых трех мест, остальные помещаться в библиотеку (на неделе).

Сегодня в выпуске:

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

2. Задача #18.

3. Команда для COMPO.

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

Таблица рекордов:

  Участник

Размер решения

1. Shur

20 байт

2. G3

20 байт

3. Beeblebrox

20 байт

4. Ungydrid

21 байт

5. Elf

24 байта

6. Edward Samokhvalov

26 байт

7. Eugene

33 байта

8. Alexey_1

34 байта

9. Konstantin Zenchenko

36 байт

10. Torax

39 байт

11. DeMax

42 байта

12. Odin

48 байт

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

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

Решения.

Решение 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

 

У кого есть более короткое решение присылайте указав в теме номер задачи.

Задача #18.

Размер моего решения 63 байта: 

Задание:

Ваша программа должна запустить файл, указанный в параметрах командной строки. Т.е. допустим Ваша программа называется task18.com, то если ее запустить с параметром, например так:

C:\>task18 td.exe

то программа task18 должна запустить файл td.exe.

Следует учесть, что:

1. Если файл не запускается, не находится и т.п., то ничего выводить на экран не надо. Программа должна корректно завершиться.

2. После того, как из Вашей программы запустится другая программа, то по завершении последней должна корректно завершиться первая.

3. Программа не должна давать сбоев, даже если командная строка пуста.

4. Программа-решение может не запускать другую программу, если не указано расширение.

5. Программа может не запускать пакетные файлы (*.bat).

6. Под запускаемой программой подразумеваются файлы с расширением *.exe, *.com.

Отправить решение до 08.02.2003

Команда для COMPO.

Может быть вы слышали, что на сайте hugi.de/compo даются задачи (естественно труднее, чем в данной рассылке). Решить одному человеку данную задачу будет непросто, а иногда даже невозможно. Maverick предлагает создать команду (небольшую - человек 5-10) и решать задачи все вместе.

А вообще кто хочет попасть в команду, напишите письмо по адресу: igoryk@yandex.ru. Только прошу учесть, что в этой команде мы только решаем COMPO. И еще прошу писать предложения о том, как это все лучше организовать.

В заключение...

На главной странице сайта http://www.igoryksoft.narod.ru/ будут даны размеры программ лидеров, как только таковые появятся. И так будет с каждой задачей. Узнав, эту информацию каждый может прислать более оптимизированное решение.

Любые предложения по улучшению рассылки, Ваши задачи, вопросы прошу присылать мне на почту, указанную внизу рассылки. 

(с) IgorykSoft Все права защищены! 
URL: http://www.igoryksoft.narod.ru/  E-Mail: Igoryk@Yandex.Ru


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное