Schemat Hornera asm

Odpowiedz Nowy wątek
2012-06-18 15:14

Rejestracja: 7 lat temu

Ostatnio: 7 lat temu

0

Witam. Mam za zadanie napisać w assemblerze program obliczający wartość wielomianu w punkcie z użyciem schematu Hornera.
Dane należy zainicjalizować osobiście wartościami, jakimi się żywnie podoba, nie jest to istotny punkt programu. Wybrałam sobie osobiście tablicę czterolementową int tab[4] = {2, 7, 4, 9} na przechowanie wartości stojących przy x oraz wartość x określiłam jako 3.

Jak powinien wyglądać kod tego programu? Chodzi mi tylko o assemblerowski fragment. Od znajomego, głowiącego się nad tym samym zadaniem dostałam ten kod, jednak ni w grosz nie wiem, jak go doprowadzić do pełnej funkcjonalności.

#include <stdio.h>

int main()
{
int tab[4] = {2, 7, 4, 9}; // zainicjalizowana tablica
int n = 4;
int x = 3; // wartość x-sa
int i;
int wynik;

printf("%d*x3 + %d*x2 + %d*x + %d\n\n",tab[3], tab[2], tab[1], tab[0]);

__asm
{
    lea esi, tab  
    mov ebx, n
    mov ecx, n
    mov eax, [esi+4*ebx-4]
    petla:
        mul x
        dec ebx
        add eax, [esi+4*ebx-4]
        dec ecx
    jnz petla
    mov wynik, eax
}

printf("Wynik wynosi %d\n\n", wynik);

return 0;
}

edytowany 1x, ostatnio: Lethit, 2012-06-18 15:15

Pozostało 580 znaków

msm
2012-06-18 16:56
msm
Administrator

Rejestracja: 11 lat temu

Ostatnio: 1 tydzień temu

0

A wiesz jak to zrobić w samym C/C++? Jeśli tak to przerób ten kod od kolegi na razie na czysty C i pomożemy. Jeśli nie... to nie mogę pomóc.

edytowany 3x, ostatnio: msm, 2012-06-18 17:00

Pozostało 580 znaków

2012-06-18 17:52

Rejestracja: 17 lat temu

Ostatnio: 1 rok temu

Ja bym to zrobił tak:

#include <stdio.h>

int main()
{
    int tab[4] = {2, 7, 4, 9};  // zainicjalizowana tablica
    int n = 4;
    int x = 3; // wartość x-sa
    int i;
    int wynik;

    printf("%d*x3 + %d*x2 + %d*x + %d\n\n",tab[3], tab[2], tab[1], tab[0]);

    __asm
    {
        lea esi, tab
        xor eax, eax    // wyzerowanie eax, eax bedzie przechowywac aktualny wynik
        mov ebx, n
        or ebx, ebx // sprawdzenie czy ebx = 0
        jz end

        petla:
            dec ebx
            add eax, [esi+4*ebx]
            mul x
            or ebx, ebx // sprawdzenie czy ebx = 0
            jnz petla

        end:
        mov wynik, eax
    }

    printf("Wynik wynosi %d\n\n", wynik);
return 0;
}

edytowany 1x, ostatnio: Nevar, 2012-06-18 17:53

Pozostało 580 znaków

2012-06-18 21:14

Rejestracja: 7 lat temu

Ostatnio: 7 lat temu

0

Dziękuję. Poradziliśmy sobie z pomocą kodu Nevara. Grupa programistów w zakresie assemblera zielonych jak wiosenna trawa dziękuje za wsparcie. :)

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0