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

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

  Все выпуски  

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


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


       

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

 

Выпуск  

#42

 

 От автора:

  Добрый день! Это Выпуск №42. Вообще-то я хотел в этом выпуске опубликовать другое COMPO, но по не зависящим от меня обстоятельствам, т.е. зависящим не от меня обстоятельствам он будет отложено.

В общем, здравствуйте дорогие подписчики!!! Как же я рад, что мы снова вместе с Вами. Начнем с информации для новых подписчиков:

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

2. Ознакомьтесь с Правилами.

Если возникли какие-либо  вопросы/предложения, то пишите в форум или на почту. Удачи!

В выпуске:

 

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

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

3. Послесловие

Решение задачи:

 

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

Задача: вычислить функцию CRC32 файла.

CRC     является     достаточно   надежным   средством   контроля   за
непредумышленным  искажением  передаваемой  информации  и используется
например, в архиваторах и сетевых протоколах

Вам  предлагается  написать программу, вычисляющую эту самую CRC. Ваша
программа  должна  прочитать  содержимое  входного  файла   из  STDIN,
вычислить  32-х битное значение CRC32, используя стандартный алгоритм,
преобразовать   полученное   значение  в  строковое  шестнадцатеричное
представление,  и  уже  его  вывести  на стандартное устройство вывода
STDOUT. 

Стандартный   алгоритм,   а  также  его  тестовую  реализацию,  можно
посмотреть в архиве. 

! должны быть выведены ровно 8 символов
! шестнадцатеричные цифры используются заглавные
!  для  тех,  кто  под NTVDM: считать, что старшие половинки регистров
(те, что E) при старте равны нулю, нельзя. 
! размер файла не ограничен 64k. и даже 4Gb :)

 

В решении задачи приняло участие 7 человек, но засчитать я смог только 6.

 

Таблица участников.

 

1

 Shur, G3

50 байт

2

 Broken Sword

73 байта

 

Решения.

 Решение by Shur  [50 байт]

;by Shur
;50 bytes
;fasmw

 sub ebx,ebx    ;crc32 here
_read:
 mov dl,0ffh
 mov cl,8       ;
_stz=$-1        ;or ch,ch
 in ax,dx       ;DIRTY: read of port xxffh
                ;may it be harmful ???
 mov ah,06h
 int 21h        ;read or write char
 jz _out        ;if EOF or already output

 xor bl,al
_bit:
 ror ebx,1
 jc _no_xor
 xor ebx,0x6DB88320
_no_xor:
 loop _bit

 jmp _read

_out:
 rol ebx,4
 mov al,bl
 and al,0fh
 cmp al,10      ;
 sbb al,69h     ;
 das            ;std proc
 xchg ax,dx
 dec cx
 jns _stz

 ret

 

Решение by G3  [50 байт]

 
;Task41 by G3 (tgm80@mail.ru), 50 bytes
;tasm /m entry.asm, tlink /t entry.obj
;Алгоритм приведен к такому виду:
; crc32=0;
; while((ch=getchar())!=EOF)
; {
;  crc32=crc32^ch;
;  for(int i=0;i<8;i++)
;  {
;   if(crc32&1)
;    crc32=(crc32>>1)^0x80000000;
;   else
;    crc32=(crc32>>1)^0xEDB88320^0x80000000;
;  }
; }
; printf("%08X",crc32);
 .model tiny
 .code
 .486
 org 100h
start:    ;assume ax=0, bx=0, si=100h, cx=0FFh
 xor bl,al  ;crc32=crc32^ch
L10:
 ror ebx,1  ;crc32=(crc32>>1)^0x80000000
 jc L20  ;if(crc32&1)
 and ebx,06DB88320h ;первый проход - обнуление crc32
L20:
 loop L10
 mov byte ptr [si+9],0F3h ;теперь меняем команду AND на XOR
 mov cl,8  ;счетчик для цикла for и для цикла вывода 
L30:
 mov dl,0FFh
 mov ah,06h
 int 21h  ;ввод с консоли
 jnz start  ;если конец файла, то zf=1
 rol ebx,4
 mov al,bl
 and al,0Fh
 cmp al,10  ;классика жанра - hex2ascii
  sbb al,69h
   das
 mov dl,al
 int 21h  ;вывод на консоль
 loop L30
  ret
end start                  

 

Решение by Broken Sword  [73 байта]

; task41.s by Broken Sword [HI-TECH]
; brokensword@ht-group.net
; fasm task41.s task41.com
; 73 bytes

; EBP holds CRC32

  org 100h

  xor EBP, EBP
  dec EBP
  push EBP  ; CRC32=-1 at startup
_start:
  mov DL, 0FFh
  mov AH, 6
  int 21h  ; get byte from STDIN
  jz _last_byte

  xchg AX, BX  ; BL=byte from STDIN

; *************************************
; Compute CRC32:

  mov CL, 9  ; 2
_next_bit:
  dec CX  ; 1
  jz _start  ; 2
  shr EBP, 1  ; 3
  salc   ; 1
  cbw   ; 1
  shr BL, 1  ; 2
  salc   ; 1
  xor AL, AH  ; 2
  jz _next_bit ; 2
  xor EBP, 0EDB88320h ; 7
  jmp _next_bit ; 2
; ************************************* ___
;      26

_last_byte:
  pop EAX  ; EAX=-1
  xor EBP, EAX ; final xor
  mov CL, 1Ch

; *************************************
; Send CRC32 to STDOUT:

_next_hex:  
  mov EAX, EBP
  shr EAX, CL  
  and AL, 0Fh
  cmp AL, 0Ah
  sbb AL, 69h
  das
  mov DH, 6
  xchg AX, DX
  int 21h
  sub CL, 4
  jns _next_hex
; *************************************

_fin:
  ret                  

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

 

Условие задачи #42:

 

Авторы: Igoryk [CCG] (Реализовал) & FatMoon [HI-TECH] (Придумал)

1. Общая информация.
Название:    Сложение без ADD
Цель  задачи:  Написать модуль, осуществляющий сложение двух чисел, не
используя    операции  сложения,  т.е.  данная  операция  должна  быть
реализована только с помощью сдвигов и логических операций.

2. Правила.
     Согласно п. 3 обработать входные данные и вернуть результат.
   
3. Данные.
     Входные: два байта.
       В  STDIN  Вашей  программы  будет переданы два числа (символы с
       кодом  соответствующим  данном  числу).  Каждый такой символ не
       будет превышать 127 и не будет меньше 0, т.о. при сложении этих
       чисел размер результата не превысит одного байта.
     Выходные: один байт.
       В STDOUT Ваша программа должна будет вернуть результат сложения
       этих двух чисел (символ с соответствующим кодом).

 

Архив с тестирующей программой и правилами можно скачать здесь.

Вопросы по этой задаче обсуждаются здесь.

Решения принимаются до 25 декабря 2004 года.

Решения посылаются с Вашего аккаунта на сайте. 

Если Вы еще не зарегистрировались, то это можно сделать здесь.

 

Послесловие:

 

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

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

 

URL: http://codeclimber.com/  E-Mail: compo@codeclimber.com

[c] CodeClimber - Все права защищены, 2003-2004


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.asmtasks
Отписаться

В избранное