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

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

  Все выпуски  

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


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


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


Выпуск #5.

Добрый день, уважаемые подписчики!

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

1. Более рациональное решение задачи #3.

2. Решение задачи #4.

3. Ответ на вопрос из Выпуска #4.

4. Вопрос-Ответ.

5. Задача #5.

6. Предложение

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

Более рациональное решение задачи #3.

Более рациональное решение было прислано Ungydrid'ом. Вот что он пишет: 

Одна голова - хорошо, а пять - пьянка.
Объединив два решения (первая половина - лучше у AYL, вторая - у Maverick и Ilia D / Broken Sword, приятно видеть знакомые хм... лица:).

И приводит два кода по 12 байт каждый:

.model tiny
.286 
.Code
.StartUp
mov al,38 
aam              ;та же самая операция деления,но  в  2-х  байтах  (второй
                 ;байт - делитель, так что иногда полезно пользоваться при
                 ;оптимизации  для  быстрого  деления  на байт, подставляя 
                 ;db D4,?? (см. Зубков)
call Twice       ;красиво, черт возьми, - to Maverick & Ilia D
Twice:
xchg ah, al
or al,30h 
int 29h 
ret 
end

И второй код:

.model tiny
.286 
.Code
.StartUp
mov al,38 
aam               ;та же самая операция деления, но в 2-х байтах (второй
                  ;байт - делитель, так что иногда полезно пользоваться при
                  ;оптимизации для быстрого деления на байт, подставляя 
                  ;db D4,?? (см. Зубков)
Twice:
xchg ah, al
or al,30h 
int 29h
inc di
jnz Twice 
ret 
end

 

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

Было прислано два решения: от AYL'а и Broken Sword'a. Лидером оказался Broken Sword - 35 байт против 37 байт AYL'a. Вот их решения:

; Assembler Tasks COMPO №4
; tasm entry.asm
; tlink /x /3 /t entry.obj
; entry.com
; by Broken Sword [HI-TECH]
; size: 35 bytes

.model tiny
.386
.code 
org 100h
@@start:
mov AL,03h
int 10h

mov AL,10 ; top
mov BL,8 ; left
mov CL,10 ; width
mov DL,10 ; height

mov DH,AL ; DH <- top
mov AL,DL ; AL <- height
mov DL,BL ; DL <- left
mov BL,55h ; color
@@S1:
mov AH,2
int 10h ; set cursor at DH, DL

mov AH,9
int 10h ; out string

inc DH ; next row
dec AL ; last row?
jnz @@S1

ret 
end @@start

А вот код Ayl'а. Он использует прерывание BIOS для закраски окна:

.Model TINY
.286
 
X     EQU 5    ; начальная позиция стpоки окна
Y     EQU 3    ; начальная позиция колонки окна
W     EQU 54   ; шиpина окна
H     EQU 13   ; высота окна
 
C     EQU 2fh  ; атpибут символов
 
.Code
.Startup
  mov  ax, 3   ; установим pежим (одновpеменно очистка экpана)
  int 10h
 
  ; начальная установка pегистpов согласно задаче
  mov  ax, Y
  mov  bx, X
  mov  cx, W
  mov  dx, H
 
  ; вычислим кооpдинаты пpавого нижнего угла окна
  add  cl, bl  ; кооpдината X (колонка)
  add  dl, al  ; кооpдината Y (стpока)
 
  ; сфоpмиpуем паpаметpы для вызова пpеpывания
  xchg dh, dl  ; стpока пpавого нижнего угла окна
  mov  dl, cl  ; колонка пpавого нижнего угла окна
  mov  cl, bl  ; колонка левого веpхнего угла окна
  mov  ch, al  ; стpока левого вехнего угла окна
 
  mov  bh, C   ; атpибут символов для заполнения
  mov  ax, 0600h ; функция очистки окна
  int 10h
 
  ret          ; все
end

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

Ответ на вопрос из Выпуска #4.

Вопрос звучал так: "Как Вы думаете почему программа заканчивается на int 20h, а ret вызывает сбой?" Речь шла о решении Broken Sword'а (Задача #3). Первым правильный ответ прислал Алексей Волков:

"Вот почему:
     ...
    push AX
     ...
@@M: ...
    pop AX
    inc DI                ; on start: DI=FFFEh
    jnz @@M
Получается, что мы один раз сделали push, и два раза (мы ведь две цифры выводим) pop. Вот и получилось, что мы забрали из стека 0, который предназначался для ret'а, и он теперь не может нормально завершить программу.
"

Совершенно верно. В программе теряется ссылка для ret. А чтобы завершить программу с помощью ret, нужно занести в стек 0: push 0.  

Вопрос-Ответ.

Q: >Дело в том, что при загрузке COM-программы AX=0FFh
А VirtualPC, загруженный с загрузочной дискеты Win95 так не думает ;( Я даже из программы AYLа убирал инициализацию AX - выводится 00 Но даже если так, то тогда:
xchg ax,cx
mov ch,0B8h ; CX == 0B8FFh  - но сегмент видео страницы 0B800h (??)
; И почему мне так и хочется первые две инструкции поменять на
; mov cx, 0B800h? (или 0B8FFh?) Ведь это по размеру одно и тоже.
mov es,cx  ; В ES сегмент видео страницы (да?!)
PS. У меня без этого "xchg ax, cx" все работает ...

A: Я допустил ошибку: CX=0FFh! Поэтому без xchg ax, cx программа работать не может. А код, который ты предложил:

mov cx, 0B800h

mov es, cx 

 

В нем что-то есть :). Если его поставить в решение Broken Sword'а, то его программу можно сократить до 12 байт. Следовательно, появляется новое решение Задачи #2:

 

;Task #2(2)
;Способ компиляции:
;tasm 2.asm
;tlink /t 2.obj
;Автор: Broken Sword & Alexey Volkov
;Размер: 12 байт
model      tiny
.code                
org         100h
start:
          mov cx, 0B800h
          mov es, cx
          mov al, 02
one:                                        
          inc di
          stosb
loop one
ret
end start

Задача #5.

У меня получилась программа на 14 байт. Кто меньше?

Задание:

Создать программу, которая бы занесла в BX количество байт, занимаемое этой программой. Т.е. если программа занимает 14 байт, то BX=14. Учесть, что выход программы будет совершен командой INT 20h, т.е. ваша задача отсчитать байты от начала программы до команды INT 20h. И еще. Желательно, чтобы эта программа работала, если ее исходный текст вписать в COM-программу (с перекомпиляцией естественно), обнаруживала размер данного COM-файла. 

Выход:

BX=размер программы.

Отправить решение

Предложение

Может быть вы слышали, что на сайте hugi.de/compo даются задачи (естественно труднее, чем в данной рассылке). Решить одному человеку данную задачу будет непросто, а иногда даже невозможно. Maverick предлагает создать команду (небольшую - человек 5-10) и решать задачи все вместе. Что Вы можете сказать по этому поводу?

Предложение высылайте сюда: mailto:igoryk@yandex.ru?Subject=Команда для COMPO 

Голосование

1. Что не хватает рассылке?

2. Что лишнее?

3. Как Вы отнесетесь к тому, что в ближайших выпусках появятся задачи типа CrackMe?

4. Какая тема для решения задач Вам ближе всего?

Ответы присылайте по ссылке: mailto:igoryk@yandex.ru?Subject=Голосование

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

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

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

(с) IgorykSoft Все права защищены! 
URL: www.IgorykSoft.Narod.Ru  E-Mail: Igoryk@Yandex.Ru


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

В избранное