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

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

  Все выпуски  

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


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


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


Выпуск #36.

Добрый день, уважаемые читатели! Сегодня, в день своего рождения (поздравления принимаются :)), выбрал все-таки время и выпустил эту рассылку. Решил что сегодня задачка должна быть несложной. Получилось ли - судить Вам. И еще. Если у кого-то есть проблемы с запуском тестовой программы - пишите. Кстати, Вы можете присылать свои задачи в рассылку!

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

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

2. Голосование.

 

Решение задачи #35*.

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

  Участник

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

1. G3 134 байт

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

Выровнять по ширине текст.

Сложность: очень сложная.

Решения.

Решение by G3:

;Task35 by G3 (tgm80@mail.ru), 134 bytes
;tasm /m entry.asm, tlink /t entry.obj

 .model tiny
 .code
 .486
 org 100h

MaxLen equ 500h ;максимальная длина выровненного текста (1021 не хватает)

start:
 mov bx,Len
 mov di,offset Buffer
 mov byte ptr [di+bx],'$'
L10:
 mov si,di
 xor bx,bx
 movzx cx,Border
L20:
 lodsb 
 cmp al,'$'
 je Exit  ;выход
 cmp al,' '
 jne L40
 cmp [di],al
 jne L30
 pusha   ;вырезать пробелы в начале строки
 mov cx,offset Buffer+MaxLen
 sub cx,si
 rep movsb
 popa
 jmp L10
L30:
 cmp [si],al
 je L40
 inc bx  ;подсчет пробелов в строке
L40:
 cmp al,0Dh
 loopnz L20
 push offset L10 ;чтобы команда ret возвращалась на L10
 jz L50
 mov di,si  ;обрезать строку по границе Border  
 mov al,0Dh
 cmp [si],al
 je Exit
 call Insert
 mov al,0Ah
Insert:    ;вставить символ из al в ds:di
 pusha
 mov si,offset Buffer+MaxLen
Ins10: 
 lodsb 
 mov [si],al
 dec si
 dec si
 cmp si,di  ;сдвигать строку пока di>=si
 jnc Ins10
 popa
 stosb
 ret
L50: 
 dec bx
 jns L60
 lea di,[si+1] ;пропустить строку, если в ней одно слово
 ret
L60: 
 mov si,bx  ;расставить пробелы (bx=кол-во пробелов в строке)
 cwd
 inc cx  ;cx = кол-во недостающих пробелов
L70:
 pusha
 mov al,' '
 mov cx,di  ;сx = любое число больше Border
L80:
 repe scasb  ;пропустить все пробелы
 repne scasb  ;поиск следующего пробела
 dec dx
 jns L80
 call Insert  ;вставить пробел
 popa
 lea ax,[bx+si]
 test al,1
 jz L90
 sub dx,bx  ;следующий пробел слева
 jmp L100
L90:
 add dx,bx  ;следующий пробел справа
L100:
 dec bx
 jns L110
 mov bx,si
 cwd
L110:
 loop L70
Exit:
 ret

 org 200h
 
Border db ?
Len dw ?
Buffer db ? 

 end start 

Задача #35.

 

Задание:

Написать программу, которая бы выводила на экран в текстовом режиме данные из файла согласно условию (см. ниже).

! В предлагаемом текстовом файле содержится информация, которая должна быть выведена на экран (в левом верхнем углу).
! Выводить на экран нужно следующим образом: считываете один байт, если переход строки, то совершить переход строки. Иначе: вывести на экран пробел с атрибутом, равным по значению ASCII_код_символа-'!'.

 

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

 

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

 

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

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

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

 

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


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

В избранное