Schemat Hornera asm

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

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.

0

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

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

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