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

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

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

2. Eugene - 24 байта.

3. Beeblbrx - 25 байт.

4. G3 - 26 байт.

5. Broken Sword - 27 байт.

6. Denis Maximov - 27 байт.

7. [stl] - 27 байт.

8. Alexey Volkov - 27 байт.

9. Ayl - 28 байт.

10. Elf - 28 байт.

11. Alexey_1 - 29 байт.

12. Odin - 31 байт.

 

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

Вывести на экран в одну строку - один символ, два ... семь символов из строки

 

Решение by Eugene:

;Составитель программы Eugene
;способ компиляции:
;fasm 12.asm 12.com
;размер 24 байта
org 100h
cycle:
inc 	cl 		;в CL лежит количество символов на вывод
mov 	ah, 40h 		;используем 40h функцию DOS прерывания
mov 	bl, 1 		;в BL лежит дескриптор консоли std out
mov 	dx, Stroka 	;DS:DX->адрес строки
int 	21h
cmp 	cl, Len
jne 	cycle
ret

Stroka 	db '1234567'
Len = $ - Stroka

 

Комментарий: Если Вы заметили в таблице рекордов рядом с размером программы Eugene я поставил знак вопроса. Дело в том, что реальный размер программы 25 байт, хотя возможно FASM компилирует по-своему. Теперь насчет решения. Решение поражает своей простотой. Никто не догадался сделать аналогичное решение. Хотя кто только начал читать Зубкова увидит описание функции, которая выводит то количество знаков строки, какое указано в cx.

 

Решение by Beeblbrx:

.model tiny
.286
.code
org 100h
start:
mov 	cl,1
m1: 	mov si,offset string
m2: 	lodsb
int 	29h
loop 	m2
lodsb
sub 	al,'0'-1
xchg 	ax,cx
loop 	m1
retn

string 	db '1234567'
stop_marker db '0'

end start

 

Комментарий: Этому решению явно не хватает комментариев - нет не моих :). Идея решения такая: в AL считывается символ из строки, затем производится вывод на экран. Высчитывается количество оставшихся символов и все повторяется сначала до тех пор, пока не будут выведены все символы. Недостаток решения: строка строго закреплена, т.е. если ввести другую строку в string, то программа работать не будет. И еще не совсем соблюдено условие задачи.

 

Решение by G3:

;Task #12
;tasm /m task.asm
;tlink /x /3 /t task.obj
;26 байт
;by G3

.model tiny
.386
.code
org 100h

Start:
mov 	di,offset Stroka
inc    	bx
mov 	cx,bx
Output:
mov 	al,[di]
int	29h
inc   	di
loop   	Output

cmp 	bx,Len
jnz 	Start

ret

Stroka db "1234567"
Len equ $-Stroka

end Start

 

Комментарий: Алгоритм решения прост: каждый раз считывается и выводится DI символов и с помощью int 29h эти символы выводятся на экран.

 

Решение by Broken Sword:

; Assembler Tasks COMPO #12
; tasm /m entry.asm
; tlink /x /3 /t entry.obj
; entry.com
; by Broken Sword [HI-TECH]
; size: 27 bytes

.model tiny
.code
.386
org 100h 
@@start: 
mov 	SI,offset stroka
xchg 	AX,CX
@@S1:
inc 	CX
push 	CX

push 	SI
@@S2:
lodsb
int 	29h
loop 	@@S2

pop 	SI
pop 	CX
cmp 	CX,len
jnz 	@@S1

ret
stroka 	db '1234567'
len equ 	$-stroka

end @@start 

 

Комментарий: Broken Sword сделал как бы два вложенных цикла - один выводит на экран символы, а второй определяет сколько их нужно вывести.

 

Решение by Denis Maximov:

;Task#12
;Coded by DeMax
;27 bytes
;Tasm 5.0
;tasm task12.asm
;tlink /t task12.obj
.model tiny
.code
org 100h
start:
xor 	bx,bx
inc 	bx 		;bx=1 - стандартный описатель вывода 
xor 	cx,cx 		;cx - число выводимых символов в строке
main 	proc near 	;прибегнем к помощи рекурсии :)))
inc 	cx 		;увеличиваем с каждым проходом длину выводимой строки
mov 	ah,40h 		;функция записи DOS
mov 	dx,offset Stroka 	; в dx - указатель на строку
int 	21h 		;выводим строку на экран
cmp 	cx,Len 		;выведена вся строка?
jne 	main 		;если нет, то вызываем сами себя ещё раз
main endp
ret
Stroka 	DB "1234567"
Len 	EQU $-Stroka
end 	start

 

Комментарий: По-моему здесь моего комментария не требуется. Все бы так свои решения оформляли...

 

Решение by [stl]:

; task12.asm
; by [stl]
; tasm task12.asm
; tlink /x /3 /t task12.obj
; 27 bytes
.386
IDEAL
MODEL tiny
CODESEG
ORG 100h
start:
db 	0b1h,len 	;mov cl,len
mov 	dx,OFFSET string
inc 	bx 		;stdout
loop0:
push 	cx
neg 	cl
db 	080h,0c1h,len+1 ;add cl,len+1
mov 	ah,40h
int 	21h
pop 	cx
loop 	loop0
ret
string 	db "1234567"
len	=$-string
end 	start

 

Комментарий: Вообще-то идея кода как у Beeblebrx, но выводить можно любую строку.

 

Решение by Alexey Volkov: 

; Assembler Tasks COMPO #12
; Способ компиляции: tasm 12.asm, tlink /t 12.obj
; Автор: Alexey Volkov AKA xAL
; Размер: 27 байт
.model tiny
.386
.code
org 	100h
start:
mov 	cl, Len                  	; Количество символов (для loopa)
org 	102h                    ; Без этого вставляется два nopа :(
inc 	bx                        	; ~ BX=1
mov 	dx, offset Stroka 	; Адрес буфера для функции 40h прерывания 21h
cycle:
push 	cx 		; cx нам будет нужен, чтобы указать количество
			; символов для печати, поэтому сохраняем его
mov 	ax, 4000h+Len+1 ; \ AH = номер функции (40h)
sub 	al, cl 		; | Len+1-cx = кол-во символов для печати
mov 	cl, al 		; /
int 	21h

pop 	cx
loop 	cycle
ret

Stroka 	DB "1234567"
Len 	EQU $-Stroka
end 	start

 

Решение by Ayl:

; Assembler Tasks COMPO #12
; tasm 12.asm
; tlink /x /t 12.obj
; 12.com
; by Ayl
; size: 28 bytes (7 bytes for data)

.Model TINY
.286

.Code
.StartUp
xchg 	ax, bp 	; загpузить AH значением 9 (BP = 0912 пpи стаpте)
mov 	bl, '$' 	; в BL - пpизнак конца стpоки для функции 9
mov 	cx, Len 	; в CX - количество повтоpений
lea 	dx, stroka ; адpес стpоки
mov 	si, dx 	; текущий конец стpоки
r:
inc 	si 	; следующая позиция в стpоке
xchg 	[si], bl 	; подставляем в стpоку пpизнак конца, стаpый символ - в BL
int 	21h 	; выводим текущую подстpоку
xchg 	[si], bl 	; восстанавливаем стpоку и pегистp BL
loop 	r 	; повтоpяем

ret 		; выходим

stroka 	db '1234567'
Len EQU $ - stroka

end

 

Комментарий: Вывод на экран осуществляется функцией 09h прерывания int 21h. Поэтому код меняет строку добавляя в нужном месте знак доллара.

 

Решение by Elf:

; #12
; tasm task12 /z
; tlink task12 /t/3
; size: 28
; by elf
.Model TINY
.286
.Code
.StartUp
push 	0b800h 	;3
pop 	es 	;1
xor 	di,di 	;2
yo: 	inc ax 	;1
mov 	cx,ax 	;2
lea 	si,stroka	;3
cy: 	movsb 	;1
inc 	di 	;1
loop 	cy 	;2
cmp 	al, len	;2
jne 	yo	;2
ret 		;1
stroka 	db "1234567" ;7
len 	equ $-stroka
end 		;=28

 

Комментарий: Elf использовал прямое копирование в видеопамять. Интересный код.

 

Решение by Alexey_1:

;tasm /m2 prog.asm
;tlink /t prog
;29 байт
;by Alex

CSEG segment
assume cs:CSEG, ds:CSEG, ss:CSEG, es:CSEG
org 100h
main:

xor 	si,si		;2 байта
xor 	cx,cx		;2 байта
	
m2:

xchg 	cx,si		;2 байта

inc 	cx		;1 байт

m1:
mov 	al,stroka[si]	;4 байта
int 	29h		;2 байта
inc 	si		;1 байт
loop 	m1		;2 байта

cmp 	si,len		;3 байта (при использовании 2х проходов)
jne 	m2		;2 байта

ret
Stroka 	DB "1234567"
Len 	EQU $-Stroka

CSEG 	ends
end main

 

Комментарий: выводится строка с первого символа до si. И так каждый раз.

 

Решение by Odin:

; task12.asm by Odin
; fasm task12.asm task12.com
; 31 bytes
            org   100h
            mov   dl, 1
repeat1:
            mov   cl, dl
            mov   si, stroka
repeat2:
            lodsb
            int   29h
            loop  repeat2
            cmp   dl, [len]
            je    exit
            inc   dl
            jmp   repeat1
exit:
            retn
stroka db '1234567'
len db $-stroka

Комментарий: ну, собственно, все по условию...

 

Hosted by uCoz