Правила - Рейтинг участников - Библиотека решений

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

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

2. Broken Sword - 19 байт

3. Bart Simpson - 19 байт

4. Beeblebrx - 21 байт

5. G3 - 21 байт

6. Shur - 21 байт

7. Alexey_1 - 22 байта

8. Ayl - 22 байта

9. Lenskiy - 22 байта

10. Ungydrid - 22 байта

11. Edward Samokhvalov - 23 байта

12. 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

 

Hosted by uCoz