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

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

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

2. Решение by Maverick (23 байта).

3. Решение by Serj (23 байта).

4. Решение by Elf (23 байта).

5. Решение by Ungydrid (24 байта).

6. Решение by Ayl (27 байт).

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

 Определить является ли данная строка палиндромом.

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

by Maverick: размер 23 байта.

;Task #6
;Способ компиляции: 
;tasm 6.asm
;tlink /t 6.obj
;Автор: Maverick
;E-Mail: Maverick@nightmail.ru
;Размер: 23байта
.model tiny
.286
.code
org 100h
start:
lea si,stroka ;Смещение первого символа
lea di,str_len-1 ;Смещение последнего
mov cl,str_len-stroka;Длина строки и цикл, для скорости можно добавить shr cl,1
go: ;но проиграем в размере
cmpsb ;Сравниваем 1 и 5(в нашем случае) потом 2-4,3-3,4-2,5-1.....при добавлении строки shr cl,1
;сравниваем 1-5,2-4
jne $+7 ;На выход, если не равны
dec di ;Настройка индексов
dec di
loop go
dec ax ;Если Stroka палиндром, то AX=0FFFFh, иначе 0
exit:
ret ;Game Over
Stroka DB 'kabak' ;Это слово мне по душе :)
Str_Len DB $-Stroka ;Длина строки
end start

by Serj: размер 23 байта.

;23 байта
code segment
assume cs:code
org 100h
b:
lea si,stroka
lea di,str_len+1
l:
dec di
dec di
cmpsb
jz l
cmp si,di
jl r
dec ax
r:ret
stroka db 'kazak'
str_len db $-stroka
ends
end b

by Elf: размер 23 байта.

;Task #6
;tasm task.asm
;tlink /t task.obj
;by elf
;size: 23 bytes

; ax=0000
; direction flag (d) is clear (incrementing)
model tiny
.code
org 100h
start:
mov cl, offset str_len - offset stroka ; cl=length(stroka)
; mov cl, [str_len]
lea si, str_len +1 ; si=last_char(stroka)+2
lea di, stroka ; di=first_char(stroka)
next: dec si ;
dec si ; si=last_char(stroka)
cmpsb ; compare chars [si] & [di]
loope next ; zf=1 & cx<>0 => goto next
jne yo ; if <> goto yo
dec ax ; ax=0ffffh
yo: ret ; exit
stroka db 'kazak'
str_len db $-stroka
end start

by Ungydrid: размер 24 байта.

.model tiny
.code 
org 100h

start:
mov si, offset stroka
mov di, offset str_len ; конец строки + 1

trial:
dec di                 ;2 кратное уменьшение, т.к при cmpsb возрастают и di и si
cmpsb 
jne exit 
dec di
cmp di, si             ;т.к. сравнение символов "навстречу" друг-другу
jnbe trial
not ax                 ;при старте eax=0000h
exit:
ret

stroka db 'kazak'
str_len db $-stroka

end start

 by Ayl: размер 27 байт.

; Assembler Tasks COMPO #6
; tasm pal.asm
; tlink /t pal.obj
; pal.com
; by Ayl
; size: 27 bytes

.Model TINY
.286

.Code
.Startup
mov si, OFFSET Stroka ; устанавливаем указатели на начало и конец стpоки
mov di, OFFSET Str_Len - 1
r:
lodsb ; читаем символ
cmp al, [di] ; сpавниваем с симметричным
jne c ; если не pавны - не полиндpом
dec di ; хвостовой указатель смещается к центpу
cmp di, si ; сpавниваем указатели
jge r ; если не достигли сеpедины стpоки - проверяем опять
mov ah, cl ; палиндpом! CL = 0ffh при запуске программы!
c:
mov al, ah ; а AL мы все pавно портили! 
ret ; конец

Stroka db 'kazak'
Str_Len db $ - Stroka

 

Hosted by uCoz