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

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

  Все выпуски  

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


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


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


Выпуск #32.

Добрый день, уважаемые читатели! У нас сегодня очень много хороших новостей: во-первых, я сдал экзамен на "отлично" (из-за подготовки к нему произошла задержка рассылки). Во-вторых, во всю работает сезонный рейтинг. В-третьих, количество подписчиков увеличилось на 15 человек, что не может не радовать - вообще-то, конечно, хотелось бы, чтобы подписчики активнее участвовали в решении задач. В-четвертых рассылка все-таки вышла!

 

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

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

2. Задача #32.

 

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

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

  Участник

По размеру

По скорости выполнения
1 G3 33  A124h
2 Shur 33  8BFEh
3 Beeblebrox 37  -

 

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

Графический фильтр Emboss.

 

Решения.

Оптимизация по размеру.

Решение by G3:

;Task #31 by G3(tgm80@mail.ru), 33 bytes
;tasm /m task.asm
;tlink /x /3 /t task.obj
 .model tiny
 .586
 .code

ImageOffset equ 500h
ImageWidth equ 160
ImageHeight equ 200

 org 100h
Start:
 mov al,128     ;заполнить выходное изображение 
       ;серым цветом
 mov di,ImageOffset+ImageWidth*ImageHeight
 mov cx,ImageWidth*ImageHeight+256-(ImageHeight-2) ;немного больше, чтобы 
       ;после цикла di=-(ImageHeight-2)
 rep stosb     ;ImageOut[x,y] = 128
 mov si,ImageOffset+ImageWidth+1
L10:
 mov cl,ImageWidth-2
L20:
 lodsb
 sub al,[si+ImageWidth]
 rcr al,1
 add [si+ImageWidth*ImageHeight-1],al ;ImageOut[x,y] = ImageOut[x,y]+
       ;+0.5*(ImageIn[x,y]-ImageIn[x+1,y+1])
 loop L20
 lodsw
 inc di
 jnz L10
 ret
end Start

Решение by Shur:

;by Shur
;33 bytes
;fasmw

;DF=0
 mov di,0x8200
 mov al,0x80
 mov cx,0x7d00+256-198
 rep stosb

 mov si,0x500+160+1
_line:
 mov cl,158
_byte:
 lodsb
 sub al,[si+160]
 rcr al,1
 add [si+0x7d00-1],al
 loop _byte
 lodsw
 inc di
 jnz _line
 ret

Решение by Beeblebrox:

; task #31 (size optimization)
; Emboss filter by Beeblebrox / TMA
; 37 bytes
; tasm /m9 entry.asm
; tlink /t/x entry.obj
 
ImageWidth      equ     160
ImageHeight     equ     200
ImageIn         equ     500h
ImageOut        equ     ImageIn+ImageWidth*ImageHeight
 .model tiny
 .386
 .code
        org     100h
Start:  mov     di,ImageOut
        mov     cx,ImageWidth*ImageHeight
        mov     al,128
        rep     stosb
        mov     si,ImageIn+ImageWidth+1
        mov     di,ImageOut+ImageWidth+1
        mov     cl,ImageHeight-2
ver:    push    cx
        mov     cl,ImageWidth-2
hor:    lodsb                           ; ImageIn[x,y]
        sub     al,[si+ImageWidth]      ; ImageIn[x,y]-ImageIn[x+1,y+1]
        cmc
        rcr     al,1                    ; (ImageIn[x,y]-ImageIn[x+1,y+1])/2+128
        stosb                           ; ImageOut[x,y]
        loop    hor
        cmpsw                           ; di+=2, si+=2
        pop     cx
        loop    ver
        ret
        end     Start

Оптимизация по скорости.

Решение by Shur:

;by Shur
;fasmw

D = 200*160
N equ 8
 org 100h

 movq mm5,[_1]
 movq mm7,mm5
 psllq mm7,7
 pcmpeqb mm6,mm6
 pxor mm6,mm5
 mov si,0x500+D/N+32
 lea di,[si+161]
 mov cx,N

_prefetch:
 ;загружаем очередной блок ~4k в L1
 mov bx,-D/N
 nop
_line:
 mov ax,[bx+si]
 mov ax,[bx+si+32]
 add bx,64
 js _line

 ;обработка
 mov bx,-D/N
 nop
 nop
 nop
_load:
 movq [si+bx+D-16],mm3
 movq mm4,[si+bx+161]
 movq mm3,[si+bx]
 movq mm2,mm0
 pandn mm2,mm1
 pand mm2,mm5
 pand mm1,mm6
 psrlq mm1,1
 pand mm0,mm6
 psrlq mm0,1
 psubb mm0,mm2
 psubb mm1,mm7
 psubb mm0,mm1
 movq mm1,[di+bx+8]
 movq [si+bx+D-8],mm0
 movq mm0,[si+bx+8]
 movq mm2,mm3
 pandn mm2,mm4
 pand mm2,mm5
 pand mm4,mm6
 psrlq mm4,1
 pand mm3,mm6
 psrlq mm3,1
 psubb mm3,mm2
 psubb mm4,mm7
 psubb mm3,mm4

 add bx,16
 js _load

 ;рамка слева-справа
 mov bx,-D/N
 mov eax,0x10000000
 mov eax,0x10000000
 mov ax,ax
_lr:
 mov byte [bx+si+D-32],0x80
 mov byte [bx+si+D+160-1-32],0x80
 add bx,160
 js _lr

 ;следующий блок
 add si,D/N
 add di,D/N
 dec cx
 jnz _prefetch

 ;рамка сверху-снизу
 mov si,0x8200+160
 mov bx,-160
_tb:
 movq [bx+si],mm7
 movq [bx+si+D-160],mm7
 add bx,8
 js _tb
 ret
_1: db 1,1,1,1,1,1,1,1

Решение by G3:

;Task #31 by G3(tgm80@mail.ru)
;MMX optimized
;fasm task.asm task.com

ImageOffset     equ     500h
ImageWidth      equ     160
ImageHeight     equ     200

        org 100h
Start:
        mov     ecx,(ImageHeight-2)*ImageWidth/8
        mov     esi,ImageOffset+ImageWidth
        movq    mm4,[a]
        movq    mm3,[b]
        movq    mm5,[c]
L10:
        movq    mm1,[si+1+ImageWidth]
        movq    mm0,[si]
        add     si,8

        movq    mm2,mm0
        psrlq   mm0,1
        pandn   mm2,mm1
        pand    mm2,mm4

        pand    mm0,mm5
        psrlq   mm1,1
        pand    mm1,mm5

        paddb   mm0,mm3
        psubb   mm0,mm2
        psubb   mm0,mm1

        movq    [si+ImageWidth*ImageHeight-8],mm0
        dec     cx
        jnz     L10


        mov     di,ImageOffset+ImageWidth*ImageHeight
        mov     ecx,ImageWidth/8
        mov     eax,8080h
L30:
        movq    [di],mm3
        movq    [di+ImageWidth*(ImageHeight-1)],mm3
        add     di,8
        dec     cx
        jnz     L30


        mov     si,(ImageHeight-2)*ImageWidth
        mov     dx,ImageWidth
L40:
        mov     [si+ImageOffset+(ImageHeight+2)*ImageWidth-1],ax
        sub     si,dx
        jnc     L40
        ret

        times 32-($ mod 32) db 0

a       dq      0101010101010101h
b       dq      8080808080808080h
c       dq      7F7F7F7F7F7F7F7Fh

Задача #32.

 

Задание:

Вашему вниманию предлагается следующая задача:

Допустим, существует алгоритм вычисления CRC для введенной строки:

1. Ввод строки (не более 8 символов).

2. CRC = сумма ASCII-кодов символов в строке.

3. CRC xor Первый_символ_строки.

Алгоритм несложный и реализовать его вполне возможно.

 

Естественно, что одному значению CRC может соответствовать несколько строк.

Вам нужно восстановить любую строку, соответствующую CRC и вывести ее на экран.

Нужно учесть, что:

! CRC - это вполне определенная константа. В начале Вашей программы должна быть строка: CRC EQU XX, где XX - любое число, не больше 32768.

! Строка может состоять только из "печатаемых символов", т.е. символов, лежащих в пределах A-Z, a-z, 0-9 и символы: -=,~!@#$%^&*()_+/";:?\<>.

! Программа не должна "вешать" компьютер, т.е. выполняться не более 5 секунд.

 

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

 

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

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

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

 

(с) CodeClimber - Все права защищены! 
URL: http://codeclimber.com  E-Mail: compo@codeclimber.com


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

В избранное