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; }