Решения задачи
#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
|