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

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

  Все выпуски  

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


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


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


Выпуск #17.

Добрый день, уважаемые подписчики! В связи с опасной ситуацией в интернете выпуск слегка задержался.

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

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

2. Задача #17.

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

4. Дискуссия: новая тема.

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

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

1. Broken Sword - 19 байт

2. Bart Simpson - 19 байт

3. Beeblebrx - 21 байт

4. G3 - 21 байт

5. Shur - 21 байт

6. Alexey_1 - 22 байта

7. Ayl - 22 байта

8. Lenskiy - 22 байта

9. Ungydrid - 22 байта

10. Edward Samokhvalov - 23 байта

11. Yuri Lunev - 23 байта

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

В соответствии с массивом порядковых номеров символов вывести на экран строку.

Решения.

Решение by Broken Sword:

; Assembler Tasks COMPO #16
; tasm /m task16.asm
; tlink /x /3 /t task16.obj
; task16.com
; by Broken Sword
; size:  13 bytes (+ DATA)

                .model         tiny
                .code
                .386
                org            100h
@@start:

number   db             2,1,3
len           equ            $-number
string      db             'SAM'

                mov            CL,len
@@S0:                           
                lodsb
                xchg           AX,BX
                mov            AL,byte ptr string-1[BX]
               
                int            29h
                loop           @@S0

                ret
                end            @@start

 

Комментарий: Так как при старте SI=100h, то при запуске в SI заносится смещение number. Затем считывается из этого массива порядковый номер символа и символ выводится на экран. Недостатки кода: В примере используются строки с данными как код. Если поставить другую строку, то нельзя предугадать как на это отреагирует процессор - возможно в этом случае будет сбой.

Решение by Bart Simpson:

.model tiny
.code
 org 100h
begin:
 digits db 2,1,3,0 ;В некоторых случаях (при нечетном кол-ве букв)
;приходится добавлять 0 иначе команды (add ??,??) "сливаются"
 mov bx,offset string-1
 ;mov si,offset digits
 mov cl,string_len
 @@print:
  lodsb
  xlatb
  int 29h
 loop @@print
 retn
;data
 string db 'SAM'
 string_len equ $-offset string
end begin

 

Комментарий: В принципе используется такая же идея как и у первого решения, а значит существуют в нем такие же недостатки. Но есть небольшое несоответствие условию задачи: "digits DB 2,1,3", а не "digits DB 2,1,3,0". 

 

Решение by Beeblebrx, Shur:

.model tiny
.code
.386
                org     100h
start:      mov     bx,offset str-1
                mov     si,offset order
                mov     cl,len
m0:         lodsb
                xlat
                int     29h
                loop    m0
                ret
str           db      'SAM'
order      db      2,1,3
len          equ     $-offset order
               end     start

 

Комментарий: С помощью команды lodsb считывается байт (CS:SI) в AL, затем происходит "трансляция в соответствии с таблицей" (xlat) и вывод на экран.

 

Решение by G3:

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

Start:
mov cl,Number-String      ;длина строки
MainLoop:
mov bl,[si+Number-Start] ;bl=индекс символа
mov al,[bx+String-1]         ;al=текущий символ
int29h
inc   si                                ;переход к следующему символу
loop MainLoop
ret

String db'SAM'
Number db2,1,3

 

Комментарий: Идея решения такая же как и в предыдущем, но способ реализации немного другой.

 

Решение by Alexey_1, Ayl, Lenskiy, Ungydrid:

; Assembler Tasks COMPO #16
; tasm 16.asm
; tlink /x /t 16.obj
; 16.com
; size: 22 bytes

.Model TINY
.286

.Data
String db 'SAM'
Number db 2,1,3
Len EQU $ - Number ; кол-во выводимых символов

.Code
.StartUp 
lea bx, String - 1 ; загpузить адpес стpоки
                               ; (т.к. нумеpация идет с 1, а не с 0 -
                               ; адpес уменьшаем на 1)
mov cx, Len         ; кол-во символов для вывода
lea si, Number     ; последовательность индексов

R:
lodsb                     ; получить очеpедной индекс
xlat                        ; получить символ по индексу (AL = BX[AL])
int 29h                  ; вывести на экpан
loop R                   ; повтоpить

ret                         ; закончить
end

 

Решение by Edward Samokhvalov:

;Exersize 16
;bY Sam0khval0v Edward
;TASM - 23 bYt3Zz
.model tiny
.code
.startup
                           lea si, Number
___________: lodsb                ;грузим нужное смещение из Number
         xchg ax, bx                       ;а адресация то д0лжна быть по BX
         mov al, string[bx-1]        ;а вот и буковку взяли
         int 29h                                ;общеизвестная недокументированная функция =)
         xor bx, len                         ;x0r - моя любимая функция в асеме
         loopnz  ___________
ret
;data
String db       "SAM"
Number db       2,1,3
len    =  $ - offset Number       ;длина того чаво читать
end

 

Решение by Yuri Lunev:

cseg segment
org 100h
begin:
       assume cs:cseg, ds:cseg, ss:cseg, es:cseg
       lea bx, string-1
       lea si, number
       mov cl, 3
lp:
       mov al, [si]
       xlat
       int 29h
       inc si
       loop lp
       ret
String DB 'SAM'
Number DB 2,1,3
cseg ends
end begin

 

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

Задача #17.

Размер моего решения: 50 байт, так что упрощайте свои решения как можете.

Задание:

Дано: DL=любая цифра (0..9).

Вывести на экран строку - код Морзе для данной цифры.

Для справки:

1 .----

2 ..---

3 ...--

4 ....-

5 .....

6 -....

7 --...

8 ---..

9 ----.

0 -----

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

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

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

А вообще кто хочет попасть в команду, напишите письмо по адресу: igoryk@yandex.ru. Только прошу учесть, что в этой команде мы только решаем COMPO. И еще прошу писать предложения о том, как это все лучше организовать.

Дискуссия.

Что Вы думаете о законах по поводу защиты авторских прав программистов?

Мнения сюда: igoryk@yandex.ru 

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

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

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

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


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

В избранное