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

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

  Все выпуски  

Задачи по ассемблеру Выпуск #43. Решения.


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

         
 

Рассылка
«Задачи по ASM»

Выпуск #43. «Решения»

 
     

От автора

Добре, дорогие читатели! После некоторого вынужденного перерыва мы возобновляем наши выпуски. Отныне и навсегда Выпуск будет делиться на две части: "Условие задачи" и "Решения", чтобы у читателей не пропадал интерес к задачам.

Из новостей: сайт обновлен, переведен на движок CCG-Engine 2.0.0. Заходите, тестируйте, пишите отзывы. Также хочется отметить, что теперь незарегистрированные пользователи (Гости) получили возможность участвовать в обсуждениях тем Форума.

А вот кто хочет отправлять решения COMPO, или кто хочет быть уверенным в том, что его Логин никто не займет, тем регистрация все-таки нужна. Кто заинтересовался, посетите страницу: www.codeclimber.com\registration.php. Регистрация очень быстрая!

Решения

Итак, как мы все хорошо помним, наша прошлая задача называлась: "Реализация цикла без условных переходов и арифметических операций". Задача оказалась достаточно интересной, вызвала много споров по поводу её условий... но участники быстро во всём разобрались и теперь мы можем вместе с Вами разобраться в их решениях.

 

Информация о задаче


Автор: G3

Цель задачи: Вывести в STDOUT строку из X символов '#'. X вводится из STDIN. 0 < X < 256.

Для вывода должна использоваться процедура 6 прерывания 21h ( mov ah,6 / int 21h ).

Можно использовать только команды работы со стеком, безусловные переходы, команды сравнения битов, логические операции и операции сдвига.

Полный список допустимых команд:

AND, BSF, BSR, BT, BTC, BTR, BTS, CALL, CBW, CLC, CMC, CWD, DEC, INT, JMP, LAHF, LEA, MOV, MOVSX, MOVZX, NOT, OR, POP, POPA, POPF, PUSH, PUSHA, PUSHF, RCL, RCR, RET, ROL, ROR, SAHF, SAL, SALC, SAR, SETxx, SHL, SHR, STC, TEST, XCHG, XOR

Сохранить правила, тесты, пример решения

 

Рейтинг решений


Было получено 5 решений.

Засчитано: 4 решения + 1 решение засчитано условно.

 

Имя

Сравнительная характеристика

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

G3

21

Shur

21

Beeblebrox

23

Zerro Crash

26

Ренат Шарипов

35

 

Исходные тексты решений


 

Решение от G3:

К рейтингу решений

;Task43 by G3 (tgm80@mail.ru) 21 bytes 
;fasm.exe entry.asm entry.com 
org 100h 
start:               ;si=0100h, bp=09xxh, di=FFFEh 
mov ah,07h           ; 
mov dl,'#'           ;выводимый символ 
int 21h              ;первый раз ввод символа, потом вывод 
not word[si-100h+$]  ;сменить на or [bp+di+3106h],ch; xor al,94h 
xor [si],si          ;сменить mov ah,07h на mov ah,06h 
xchg ax,sp           ;sp = 0700h + X 
shl sp,1             ;sp = sp * 2 
push ax              ;sp = sp - 2, идея Shur 
shr sp,1             ;sp = sp / 2, в конце цикла sp=06FFh 
and si,sp            ;в конце цикла si=0 (0100h and 06FFh = 0) 
jmp si               ;jmp 100h, в конце цикла jmp 0

Комментарии:

Вот яркий пример, когда SMC может помочь в оптимизации!

Настоятельно рекомендую погонять программу под отладчиком! Узнаете много интересного. Кстати умение разбираться в чужих исходниках - ох как иногда бывает важным!

 

 

Решение от Shur:

 ;Shur,task43,21b,fasmw 
 org 100h 
 mov ah,07h 
 int 21h 
 xchg ax,sp 
 shl sp,1 
 mov dl,'#' 
 mov ah,06h 
 a: xor [di+b-4-0x0E00],si 
 mov di,sp 
 int 21h 
 b: jmp a-1 

Комментарии:

Это решение тоже использует SMC. Мне понравилась идея с xor [di+b-4-0x0E00], si. Мозг! :) Тоже советую проследить выполнение программы через отладчик.

Кстати, пользуясь случаем, хочу поздравить G3 и Shur с победой в Hugi.Compo! Это Compo было о проходе коня по полю с заданными границами. Молодцы!

 

 

Решение от Beeblebrox:

; Compo #43 entry by Beeblebrox / TMA
; Size: 23 bytes
; Input: STDIN byte xx=(00..FF)
; Output: xx chars '#' printed to STDOUT
 .model tiny
 .386
 .code
                org     100h
start:
                mov     ah,7
                int     21h     ; al=xx (count)
                xchg    ax,bp   ; bp=07xxh
                shl     bp,1    ; 0E00h+xx*2
                mov     ah,6
                mov     dl,'#'
        ; No condition tested at all. Instead, command "jmp lp_beg"
        ; will be overwritten with "retn" after xx succesful loops
lp_beg:         mov     di,sp
                mov     byte ptr [bp+di-0E00h+offset lp_end],0C3h ; retn opcode
                push    bx      ; sp -= 2, [sp] = 0
                int     21h
lp_end:         jmp     lp_beg

                end     start

Комментарии:

Честно говоря, очень приятно проверять решения, которые НЕ ПОХОЖИ друг на друга. Да, двух байт не хватило до первого места, но решение достойно внимания!

 

 

Решение от Zerro Crash:

; COMPO #43
;  Zerro Crash
;
; 26 байт (fasmw)
;

       org     100h
start:  mov     ah, 07h       ; 2b
        int     21h           ; 2b теперь в al количество_итераций


mov ah,21h ; 2b shl ax,1 ; 2b mov sp,ax ; 2b теперь в sp 4200h + количество_итераций*2 mov ah,06h ; 2b операция "вывод симола" int 21h mov dl,'#' ; 2b собственно символ _loop: push ax ; 1b счетчик-=2 (sp - счетчик) mov bx,sp ; 2b shr bh,1 ; 2b теперь в bh 21h или 20h mov [(si-100h)+($+4)],bh ; 3b пишем в аргумент int 00h int 00h ; 2b вывод символа или выход jmp _loop ; 2b

Комментарии:

Идея решения достаточно интересная, но подбор int 21h/20h добавил байтов в решение...

 

 

Решение от Рената Шарипова:

org 100h 
start:
mov ah,6
mov dl,0ffh
int 21h   ; Ввод символа
mov cl,al  ; Сохранение символа в cl

cheс:
mov bx,adr  ; Теперь BX указывает на jump в цикл
test cl,cl     ; Счетчик цикла обнулился?
pushf
pop ax
shr al,5  ;  al=2 если счетчик = 0 , i.e. работа закончена
    ;  al=0 если нет
or bl,al  ; Теперь BX указывает на выход, если счетчик в нуле
    ; или на джамп обратно в цикл
jmp bx

cont:
dec cl
mov ah,6
mov dl,23h ; Вывод #
int 21h
jmp chec
adr: jmp cont ; Главное, чтобы второй бит adr = 0
      ret

Комментарии:

Это условно-засчитанное решение: использована запрещенная команда dec. Но автор задачи был не против засчитать его. Мы его засчитываем, а Ренат обязуется участвовать в наших соревнованиях :)) ну если желание, конечно, будет. Сразу бросается в глаза, что несколько байт можно было повыбрасывать, используя даже предложенный алгоритм. Вот Вам и домашнее задание: соптимизировать решение Рената. Можете поделиться решениями в форуме :)

 

Послесловие

На главной странице "Задач" [ http://codeclimber.com/сompo.php ] будут даны размеры программ лидеров, как только таковые появятся, а также все официальные дополнения к условию задачи. И так будет с каждой задачей. Узнав, эту информацию каждый может прислать более оптимизированное решение.

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

© CodeClimber.Com - Проект "Покоритель кода", 2003-2005


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.asmtasks
Отписаться
Вспомнить пароль

В избранное