uP:Jedynki

Z Wiki Rafał (ert16) Trójniak

Spis treści

Temat zadania

Napisać program testujący (w C) oraz funkcję (w ASM) wyznaczającą liczbę jedynek w binarnej reprezentacji liczby oraz liczbę podciągów jedynek o długości większej od 1.

Deklaracja funkcji:

long count_ones( unsigned logn number, long *runs );

Kody źródłowe

asm.s

	.file	"main.c"
	.text
.globl count_ones2
	.type	count_ones2, @function
count_ones2:
	pushl	%ebp
	movl	%esp, %ebp
	movl	12(%ebp), %eax
	movl	(%eax), %eax
	popl	%ebp
	ret
	.size	count_ones2, .-count_ones2
	.section	.rodata
.LC0:
	.string	"f(%ld) = %ld, %ld\n"
	.text
.globl main
	.type	main, @function
main:
	pushl	%ebp
	movl	%esp, %ebp
	andl	$-16, %esp
	subl	$64, %esp
	movl	$0, 28(%esp)
	movl	$1, 32(%esp)
	movl	$10, 36(%esp)
	movl	$255, 40(%esp)
	movl	$65535, 44(%esp)
	movl	$-1, 48(%esp)
	movl	$0, 56(%esp)
	jmp	.L4
.L5:
	movl	52(%esp), %eax
	movl	%eax, %edx
	movl	56(%esp), %eax
	movl	28(%esp,%eax,4), %eax
	movl	%edx, 4(%esp)
	movl	%eax, (%esp)
	call	count_ones2
	movl	%eax, 60(%esp)
	movl	56(%esp), %eax
	movl	28(%esp,%eax,4), %edx
	movl	$.LC0, %eax
	leal	52(%esp), %ecx
	movl	%ecx, 12(%esp)
	movl	60(%esp), %ecx
	movl	%ecx, 8(%esp)
	movl	%edx, 4(%esp)
	movl	%eax, (%esp)
	call	printf
	addl	$1, 56(%esp)
.L4:
	cmpl	$5, 56(%esp)
	jbe	.L5
	movl	$0, %eax
	leave
	ret
	.size	main, .-main
	.ident	"GCC: (GNU) 4.4.0 20090526 (prerelease)"
	.section	.note.GNU-stack,"",@progbits

main.c

#include <stdio.h>
 
long count_ones( unsigned long number, long *runs );
 
int main (){
	unsigned l;
	long odp,runs, 
		 test[]={
			 0,
			 1,
			 10,
			 0xff, 
			 0xffff,
			 0xffffffff,
			 0xfff0ffff,
			 0xf0ff0fff
		 };
	for(l=0;l<sizeof(test)/sizeof(long);l++){
		odp=count_ones(test[l],&runs);
		printf("f(%lX) = %ld, %ld\n", test[l], odp, runs);
	}
	return 0;
}

Odpowiedź programu

Osobiste