uP:Palindrom

Z Wiki Rafał (ert16) Trójniak

Spis treści

Temat zadania

Napisać program testujący (w C) oraz funkcję (w ASM) sprawdzającą czy łancuch znakow bedacy argumentem jest palindromem (1 - tak, 0 -nie). Wielkosc znakow nie jest istotna

Deklaracja fkcji:

long is_palindrome( char *s );

Kody źródłowe

main.c

#include <stdlib.h>
long is_palindrome( char *s );
 
int main()
{
	char * dobry1 = "abcba",
		 * dobry2 = "abba",
		 * dobry3 = "aBba",
		 * zly = "abc";
	long 
		t1=is_palindrome(dobry1)
		,t2=is_palindrome(dobry2)
		,t3=is_palindrome(zly)
		,t4=is_palindrome(dobry3)
		;
	printf("Testy:\n"
			"\tdobry1:%ld\n"
 			"\tdobry2:%ld\n"
 			"\tdobry3:%ld\n"
			"\tzly:%ld\n"
			,t1
			,t2
			,t4
			,t3
			);
	return 0;
}

asm.s

.data
	printstr:
	.asciz "%s , %d\n"
.text
	.type is_palindrome,  @function
	.global is_palindrome
is_palindrome: #Prolog
	pushl %ebp
	mov %esp, %ebp
 
	movl 8(%ebp), %ecx
	movl %ecx, %esi
 
nextcharLen:
	lodsb
	and %al , %al
	jnz nextcharLen
	mov %esi, %edx
	dec %edx
	dec %edx
# %ecx jest ustawiony na pierwszy znak
# %edx jest ustawiony na ostatni znakw str
 
xor %eax, %eax
xor %ebx, %ebx
 
nextcharCheck :
	movb (%ecx), %al
	inc %ecx
	call toLower
	mov %al, %ah
 
	movb (%edx), %al
	dec %edx
	call toLower
 
	cmp %al, %ah
	jne fail
 
	cmp %ecx, %edx
	jg nextcharCheck
 
success:
	xor %eax, %eax
	inc %eax
	jmp finish
 
fail : 
	xor %eax, %eax
finish: #epilog
	mov %ebp, %esp
	popl %ebp
	ret
 
# podprocedura zmieniająca na małą literę jeśli konieczne
 
toLower:
	cmpb $'A', %al
	jb end
	cmpb $'Z', %al
	ja end
	xorb $0x20, %al
end :
	ret

Odpowiedź programu

Testy:
	dobry1:1
	dobry2:1
	dobry3:1
	zly:0
Osobiste