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

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

  Все выпуски  

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


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


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


Выпуск #25.

Добрый день, уважаемые подписчики! Задержка рассылки вызвана нехваткой времени - экзамены! Наверное и Вы сдаете их сейчас. Сами знаете готовиться надо... Но не смотря ни на что, наша рассылка продолжает жить! Ура! Следующий выпуск выйдет после моего выпускного, т.е. после 18 июня! Так что времени для решения задачи Вам хватит! Не забудьте, что 22 июня открываем сайт!

 

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

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

2. Задача #25.

 

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

 

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

  Участник

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

1. G3

44 байта

2. Shur 45 байт
3. Abajantsev Yury

67 байт

 4. Alexey_1

102 байта (No optimized)

 

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

Вывести на экран подстановки из N чисел.

 

Решения.

Решение by G3:

;Task #24 by G3, 44 байта
;tasm /m task.asm
;tlink /x /3 /t task.obj
 .model tiny
 .386
 .code
org 100h

N  equ 4

Start:
  mov dx,2420h-(N-1)  ;адрес начала строки
  mov bx,dx  ;адрес текущего символа
RecProc:
  mov cl,N  ;счетчик перебора цифр
MainLoop:
  mov al,cl  ;al=cl
  add al,30h  ;al=al+'0' - тек. цифра
  mov di,dx  ;di = адрес начала строки
  dec di
Search:
  cmp al,[di]  ;если цифра из al уже есть в строке
  jz Next  ;то перейти к следующей цифре
  inc di
  cmp di,bx  ;поиск от начала до тек. символа
  jnz Search
Compare:
  stosb   ;записать цифру из al в строку
  cmp bl,20h  ;если конец строки,
  jz Output  ;то перейти к выводу строки

  pusha
  inc bx  ;переход к следующему символу строки
  call RecProc  ;вызов рекурсивной процедуры
  popa
Next:
  loop MainLoop
  ret   ;выход из процедуры и из программы
Output:
  xchg ax,bx  ;ax=2420h ('$'=24h, ' '=20h)
  stosw   ;добавить ax в строку
  xchg ax,bp  ;ah=09h
  int 21h  ;вывод строки
  ret   ;выход из процедуры
end Start
Решение by Shur:
;by Shur
 ;45 bytes
 ;tasm /m , tlink /t

 .model tiny
 .code
 .286
N=5
 org 100h
start:
 ;генерация строки '12..N $'

 std
 db ' $' ;and [si],ah
 mov di,si
 mov ax,0900h+'0'+N
 mov cl,N
 mov bl,N+1
_store:
 stosb
 dec ax
 loop _store

 ;генерация перестановок.
_gen:
 pusha
 lea dx,[di+bx]
 dec bx
 mov bp,bx
 jnz _loop
 int 21h
 jmp _ret
_loop:
 call _xchg
 call _gen
 dec bp
 jnz _loop
_ret:
 popa
_xchg:
 mov al,[di+bx]
 xchg al,[di+bp]
 xchg al,[di+bx]
 ret

 end start
Решение by Abajantsev Yury:
; Assembler Tasks COMPO #24
; tasm task24.asm
; tlink /x /t task24.obj
; task24.com
; by Ayl
; size: 67 bytes
;

 .Model TINY
 .286

N EQU 5      ; кол-во чисел для пеpестановки

DefNum macro
  db I + 30h, ' '
  I = I + 1
endm

DefString macro
  I = 1
String:
  REPT N
    DefNum
  endm
endm

 .Code
 .StartUp
  lea  dx, String      ; стpока с очеpедной пеpестановкой
  lea  bx, Last        ; последний элемент стpоки
  std                  ; pаботаем со стpокой от конца к началу

Print:
  mov  ah, 9           ; вывести очеpедную стpоку на экpан
  int 21h

  mov  si, bx          ; установить указатели на конец стpоки
  mov  di, bx

FindLess:
  ; найти два последних упоpядоченных элемента по возpастанию
  cmp  si, dx          ; пpовеpить, что достигли начала стpоки
  jl Exit              ; если да - на выход

  lodsw                ; получить число из SI; SI-=2
  cmp  al, [si]        ; сpавнить
  jb FindLess          ; пpодолжить поиск

  ; найти пеpвый с конца элемент, больший найденного
  xchg si, di          ; обменять указатели

FindGreat:
  lodsw                ; получить число из SI; SI-=2
  cmp  al, [di]        ; сpавнить
  jb FindGreat         ; пpодолжить, если меньше

  xchg al, [di]        ; обменять элементы [SI+2] и [DI]
  mov  [si + 2], al

  xchg si, di          ; востановить SI
  mov  di, bx          ; DI указывает на последнее число

Exchange:
  inc  si              ; увеличить указатель SI на 2
  inc  si
  mov  al, [di]        ;
  xchg al, [si]        ; обменять [SI] и [DI]
  stosw                ; DI-=2

  cmp  si, di          ; пpодолжать пока SI < DI
  jb Exchange

  jmp short Print      ; вывести текущую пеpестановку

Exit:
  ret                  ; выйти из пpогpаммы

  DefString            ; сфоpмиpовать стpоку с начальной пеpестановкой

Last EQU $ - 2

  db 10, 13, '$'
end
Юрий прислал также общий алгоритм по решению задач с перестановками:

Алгоритм генерации перестановок в лексикографическом порядке:
1. Просматриваем A1,...,An с конца до тех пор, пока не попадется Ai<Ai+1. Если таковых нет, то генерация закончена.
2. Рассматриваем Ai+1, Ai+2,...,An. Найдем первый с конца Am больший Ai и поменяем их местами.
3. Ai+1,Ai+2,...,An переставим в порядке возрастания (для этого достаточно её переписать с конца).
4. Печатаем найденную перестановку.
5. Возвращаемся к пункту 1.

Первой при этом будет перестановка <1,2,..,n>, последней - <n,..,2,1>.

 

 

Решение by Alexey_1:

;tasm /m2 task24.asm
;tlink /t task24
;102 байта (сильно НЕоптимизированная)
;Генерация n перестановок в антилексикографическом порядке
;by Alex

CSEG segment
assume cs:CSEG, ds:CSEG, ss:CSEG, es:CSEG
org 100h
 .386

main:
n equ 4
mov ch,n
movzx si,ch
mov word ptr bufer[si],0a0dh
mov bufer[si+2],'$'
mov dx,offset bufer

antilex proc

cmp ch,1
jz vivod

xor cl,cl

cicl:
inc cl
push cx
dec ch
call antilex;рекурсия
pop cx

cmp cl,ch
jz antilex_quit

call xchgs;bufer[cl]<=>bufer[ch]
call reverse
jmp cicl

vivod:
mov ah,9
int 21h


antilex_quit:
ret
antilex endp


reverse proc;Перестановка элементов массива в обратном порядке
push cx
dec ch
mov cl,1

cicl1:
cmp cl,ch
jnb reverse_quit
call xchgs
inc cl
dec ch
jmp cicl1

reverse_quit:
pop cx
ret
reverse endp

xchgs proc;bufer[cl]<=>bufer[ch]
movzx si,cl
movzx di,ch
add si,dx;in dx offset bufer
add di,dx
dec si
dec di
mov bl,[si]
mov bh,[di]
mov [si],bh
mov [di],bl
ret
xchgs endp

bufer db 31h,32h,33h,34h,35h,36h,37h,38h,39h
CSEG ends
end main

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

 

Задача #25.

 

Задание:

Расположить символы на экране в обратном порядке. Т.е. первый левый верхний меняется с последним правым нижним, второй левый меняется с предпоследним правым нижним и т.д.

! Разрешение экрана стандартное 80х25!

 

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

 

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

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

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

 

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


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

В избранное