Решения задачи #12.
10. Elf - 28 байт.
12. Odin - 31 байт.
Вывести на экран в одну строку - один символ, два ... семь символов из строки
;Составитель программы 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.
.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, то программа работать не будет. И еще не совсем соблюдено условие задачи.
;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 эти символы выводятся на экран.
; 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 сделал как бы два вложенных цикла - один выводит на экран символы, а второй определяет сколько их нужно вывести.
;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 |
Комментарий: По-моему здесь моего комментария не требуется. Все бы так свои решения оформляли...
; 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, но выводить можно любую строку.
; 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 |
; 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. Поэтому код меняет строку добавляя в нужном месте знак доллара.
; #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 использовал прямое копирование в видеопамять. Интересный код.
;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. И так каждый раз.
; 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 |
Комментарий: ну, собственно, все по условию...