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

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

  Все выпуски  

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


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


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


Выпуск #11.

Добрый день, уважаемые подписчики! Этот выпуск будет чуть больше обычного. Это связано с тем, что данный выпуск был сделан в Worde: FrontPage отказался – зависал при любых попытках открыть или сохранить файл.

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

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

2. Задача #11.

3. Команда для COMPO.

4. Дискуссия: Спрос на программное обеспечение.

5. Кое-что еще!

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

Задача заключалось в том, что нужно было вывести на экран состояние флагов. Абсолютно все догадались, что их состояние можно узнать через стек: поместить флаги, а затем считать. Итак, рассмотрим пришедшие решения.

 

Таблица рекордов к данной задаче.

1. Барт Симпсон – 14 байт.

2. Broken Sword – 15 байт.

3. [stl] – 15 байт.

4. Alexey Volkov – 16 байт.

5. Edward Samokhvalov – 18 байт.

6. Ayl – 18 байт.

7. Maverick – 20 байт.

8. Lenskiy – 20 байт.

 

Решение by Барт Симпсон (14 байт):

.model tiny
.code
org 100h
begin:
pushf
pop bx
mov cl,16
@@print:
 shr bx,1
 adc al,30h
 int 29h
 db 0d6h ;salc или как обнулить al в 1 байт
loop @@print
retn
end begin

 

Решение by Broken Sword (15 байт):

; Assembler Tasks COMPO #10

; tasm /m entry.asm

; tlink /x /3 /t entry.obj

; entry.com

; by Broken Sword [HI-TECH]

; size: 15 bytes

 

                .model         tiny

                .code

                .186

                org            100h                

@@start:               

                pushf

                pop            BX

                mov            CL,10h

@@L1:

                mov            AL,18h

                rcr            BX,1

                rcl            AX,1

                int            29h

                loop           @@L1

                ret

                end            @@start

 

Решение by [stl] (15 байт):

; task10.asm
; by [stl]
; tasm task10.asm
; tlink /x /3 /t task10.obj
; 15 bytes
.386
IDEAL
MODEL tiny
CODESEG
ORG 100h
start:
pushf
pop dx ;get flags register
mov cl,10h
loop0:
mov al,30h
shr dx,1
adc al,0
int 29h
loop loop0
ret
END start

 

Решение by Aleksey Volkov (16 байт):

;Assembler Tasks COMPO #9

;Способ компиляции:

;tasm 10.asm

;tlink /t 10.obj

;Автор: Alexey Volkov AKA xAL

;Размер: 19 байт

.model tiny

.386

.code

org 100h

start:

    pushf           ;  |

    pop     bx      ; | Теперь BX=FLAGS

 

    mov     cl, 10h ; -- Выводим 16 цифр --

cycle:

    shr     bx, 1   ; Сдвиг BX вправо, в CF выталкивается младший бит

    jc      short ed;   \

    mov     al, '0' ;     | Выбираем, что будем писать

    jmp     short q ;   | (0 или 1)

ed: mov     al, '1' ; /

q:  int     29h     ; Пишем

    loop    cycle   ; -- end of 'Выводим 16 цифр' --

    ret

end start

 

Решение by Edward Samokhvalov (18 байт):

; bY Сам0хвалов Эдвард
; tasm proga.asm
; tlink/t proga.obj
; 18 bytes
.model tiny
.code
org 100h
g00t:
      pushf
      pop bx
      mov cx, 16
      d0:
;F15_F0:   rol bx, 1  ;
выводит F15 -> F0
          mov al, bl
          and al, 00000001b
          add al, 30h
          int 29h
F0_F15:   shr bx, 1 ;
выводит F0 -> F15
      loop d0
ret
end g00t
;OUTPUT:
;0011001000000010  F15_F1
;0100000001001100  F1_F15
;
ОДНУ ИЗ МЕТОК НАДО ЗАКОММЕНТИРОВАТЬ -
;
И МОЖНО С ЛЁГКОСТЬЮ МЕНЯТЬ ПОРЯДОК ВЫВОДА.

 

Решение by Ayl (18 байт):

; Assembler Tasks COMPO #10
; tasm 10.asm
; tlink /x /t 10.obj
; 10.com
; by Ayl
; size: 18 bytes

 

.Model TINY
.286

 

.Code
.StartUp
  pushf
  pop  bx
  mov  cx, 16
r:
  mov  ax, bx
  shr  bx, 1
  and  al, 1
  or   al, 30h
  int 29h
  loop r
  ret
end

 

Решение by Maverick (20 байт):

;Task #10(вывод регистра флагов с пмощью 32битных регистров)
;Способ компиляции:
;tasm 10.asm
;tlink /t 10.obj
;Автор: Maverick
;Размер: 20байт
.model      tiny
.386
.code
org         100h
Begin:
pushf
pop ax                    ;В AX регистр флагов
rol eax,16               ;Закинем его в старшую часть EAX
mov cl,16                ;Выводим 16 бит
go:
xor al,al
rol eax,1
or al,30h
int 29h
loop go
ret
end Begin

 

Решение by Lenskiy (20 байт):

; tasm flag.asm
; tlink /x /t flag.obj
; flag.com
; size: 20 bytes

.286
CSEG segment
assume CS:CSEG,DS:CSEG,ES:CSEG,SS:CSEG
ORG 100h
start:
      pushf
      pop bx
      mov cl,10h
      mov ah,2
@@1:  xor dl,dl
      rcr bx,1
      rcl dl,1
      add dl,30h
      int 21h
      loop @@1
      ret
CSEG ends
end start 

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

Задача #11.

Задачу предложил Yuri Lunev. Как я ее понял так и публикую.

Размер моей программы: 42 байта. Кто меньше?

Задание:

Даны два массива одинаковой длины, нужно отличия второго записывать в первый на соответствующие байты и количество таких замен занести в bx.

Ясно, что после записи «различных» байт в первый массив, первый массив будет идентичен второму. Но Вам нужно именно побайтно менять или не менять байты первого массива.

Нельзя пользоваться командами stos, lods, scas, cmps и им подобные. Также нельзя использовать cmp.

Чтобы не возникало непоняток: кол-во байт массивов можно заносить напрямую в регистр (mov сx, 9, например) – это нужно для организации циклов. В конце программы, за ret, должны быть сами массивы:

M1 DB ‘ASSEMBLER’

M2 DB ‘FOREVER!!’

И еще. Ваше решение не должно быть привязано к размеру массива. При изменении длины и содержания массива Ваша программа должна стабильно работать. Ну, естественно, можно будет изменять регистр, который отвечает за перебор всех байтов (cx например).

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

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

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

Broken Sword написал:

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

о том, чтобы всем скопом думать над одной задачей, распределять куски между участниками - дохлый номер, т.к. это не объектно-ориентированное пр-ние слава богу, здесь, как нигде, весь код - единое целое, одна картина, один кусок кода содержит в себе следующий, все взаимосвязано, а делать одну задачу всей кучей - это все равно как если бы несколько художников рисовали одну картину.

Broken Sword отчасти прав, но надо попробовать поучаствовать. И вообще сейчас наша главная задача: организовать нормальную систему решения COMPO. Предложения направлять ко мне на почту.

Кто хочет участвовать высылайте запрос сюда (я просто не обратил внимание на особенности закрытой конференции, поэтому лучше запросы посылать мне): mailto:igoryk@yandex.ru?Subject=Команда для COMPO 

Дискуссия.

Новая тема: "Каких программ по-вашему мнению не хватает на компьютерном рынке, но если бы таковые существовали, то пользовались большим успехом?"

Ответы сюда: mailto:igoryk@yandex.ru?Subject=Дискуссия 

Кое-что еще.

31 декабря возможно выйдет специальный выпуск этой рассылки, посвященный Новому году. Присылайте мне все что хотели бы увидеть в этой рассылке, но не отклоняйтесь от тематики нашей рассылки! Можно присылать всякие приколы на ассемблере, необычные решения необычных задача и т.д. и т.п.

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

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

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

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

 


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

В избранное