Asembler - ktoś moze pomóc?

Wszystkie tematy, które nie do końca dotyczą Alfy Romeo.

Moderator: Moderatorzy

Awatar użytkownika
m1strzunio
Posty: 46
Rejestracja: 23-04-2007 19:32
Lokalizacja: Świdnica
Kontaktowanie:

Asembler - ktoś moze pomóc?

Postautor: m1strzunio » 28-06-2007 13:11

mam mały problem, a mianowicie dostaliśmy za zadanie z systemów komputerowych napisać 5 programów w assemblerze, jeden miał pokazywać maximum, drugi minimum, trzeci sume liczb a czwarty miał to wszytko posortować a piąty odwrócić tablice. I tak zrobiłem prawie wszytko ale nie działa mi sortowanie tablicy... i mianowicie mam takie pytanie czy ktoś sie na tym zna i mógłby nieco pomóc przy tym jednym zadaniu? (tym na dole) bo trzeba mieć kurcze komplet żeby zaliczyć przedmiot... Wiem dla większości to pewnie czarna magia :D

//---------------------------------------------------------------------------

#include <vcl>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
#include <iostream>
// MAX ELEMENT TABLICY
int znajdz_max(int *a, int n)
{
asm{
MOV ECX,n //do rejestru ecx dajemy n czyli ilosc elementow tablicy
MOV EBX,&a //do ebs adres tej tablicy
MOV EAX,0 //tu dajemy zero to wynik bedzie
start:
CMP EAX,[EBX] //porwnujemy eax z ebx
JG wieksze //jesli ebx wieksze to skaczemy do etykiety wieksze
MOV EAX,[EBX] //jak nie wieksze to dochodzimy tutaj i przenosimy do wyniku czyli eax wartosc EBX
wieksze: //etykieta wieszke
ADD EBX,4 // przesuwamy sie o 4 bo int to 4 bajty
Loop start // petla ktora przenosi nas do etykiety start

}
}

// MIN ELEMENT TABLICY
int funk_min(int *a, int n)
{
asm{
MOV ECX,n //do rejestru ecx dajemy n czyli ilosc elementow tablicy
MOV EBX,&a //do ebs adres tej tablicy
MOV EAX,0 //tu dajemy zero to wynik bedzie
start:
CMP EAX,[EBX] //porwnujemy eax z ebx
JL mniejsze //jesli ebx minjsze to skaczemy do etykiety minjsze
MOV EAX,[EBX] //jak nie mnijsze to dochodzimy tutaj i przenosimy do wyniku czyli eax wartosc EBX
mniejsze: //etykieta mnijsze
ADD EBX,4 // przesuwamy sie o 4 bo int to 4 bajty
Loop start
}
}

// SUMA ELEMENTÓW TABLICY
int funk_sum(int *a, int n)
{
asm{
MOV ECX,n //ilolsc elemntow do ecx
MOV EBX,&a //adres do ebx
MOV EAX,0 // wynik bedzie wiec narazie 0
start:
CMP ECX,1 //czy to ostani elemnt?
JB mniejsze // jak tak to koniec
ADD EAX,[EBX] // dodajemy pierszy z do eax
add ebx,4 //przecowamy adres na nastepny elemnt
sub ECX, 1 //od licznika odejmujemy 1
JMP start //idzemy do startu(petla)
mniejsze:
}
}

// ZAMIANA ELEMENTÓW TABLICY PIERWSZT <-> OSTATNI
int funk_zam(int *a, int n)
{
asm{

MOV ECX,n //ilolsc elemntow do ecx
MOV EBX,&a //adres do ebx
MOV EAX,0 // wynik bedzie wiec narazie 0
petla_1: //ustalenie adresu ostatniego elementu tablicy
CMP ECX,2 // porownujemy ecx z 2
JB break_1 // jesli mniejsze to skaczemu do break_1
add ebx,4 //przechodzimy do nastepnego elemntu
sub ecx,1 //obnizmy licznik
JMP petla_1 //skaczemy do petla 1
break_1:
MOV EDX,EBX //do EDX dajemy warotsc EBX
MOV EBX,&a //pod EBX postawiamy adres pierwszego elentu
petla_2:
CMP EDX,EBX //porownujemy EDX Z EBX
JB break_2 //ejsli ponizej to skaczemy fo braek_2
MOV EAX,[EBX] // tu jest zmiana: w eax wstawimy warotsc ebx
MOV ECX,[EDX] //w ecx warotsc z ebx
MOV [EDX],EAX // w edx eax
MOV [EBX],ECX // w ebx ecx
add ebx ,4 //przenosimy sie na nastepne pole z przoedu
sub EDX, 4 //przenosimy sie o jedne w dol
JMP petla_2 // skaczemy do petla 2
break_2:
}
}


void b (int *tab, int d){

//nie dzala niestety
asm{
MOV ECX,d
MOV EBX,&tab
MOV EAX,0
DEC ECX
DOPASS: MOV EDX,ECX
CHECK: MOV AL,[EBX]
add EBX,4
CMP [Ebx],AL
JNC NOSWAP
add EBX,4
MOV BL,[ebx]
MOV [ebx],AL
sub ebx,4
MOV [ebx],BL
NOSWAP: ADD Ebx,4
LOOP CHECK
DEC EDX
JNZ DOPASS

}
}
void main()
{
int x[]={-4,-77,3,1,11,1222,33,44,11,6};
cout << "\nElement MAX : " << znajdz_max(x,10);
cout << "\nElement MIN : " << funk_min(x,10);
cout << "\nSuma elementow : " << funk_sum(x,10);
cout << "\nZamieniona tablica : {";
funk_zam(x,10);




b(x,10);
for (int i=0;i<10;i++)
cout << x[i] << ",";
cout << "}";
system("pause");
}
//---------------------------------------------------------------------------

Awatar użytkownika
da_vinci
Posty: 2005
Rejestracja: 18-01-2006 09:48
Lokalizacja: Poznań
Kontaktowanie:

Postautor: da_vinci » 28-06-2007 13:22

Byłoby łatwiej jakbyś skomentował ten fragment niedziałający.
Linia jest piękna, logo też, chciałem ją mieć...
i mam Alfa Romeo 146 1,6 TS 1998 SILVER SHADOW :)

Awatar użytkownika
Maciej Loret
Posty: 6285
Rejestracja: 22-11-2004 12:03
Lokalizacja: Bydgoszcz, Zgorzelec
Kontaktowanie:

Re: Asembler - ktoś moze pomóc?

Postautor: Maciej Loret » 28-06-2007 13:22

m1strzunio pisze:mam mały problem, a mianowicie dostaliśmy za zadanie z systemów komputerowych napisać 5 programów w assemblerze


15 lat temu bym Ci pomógł, co nieco pisałem na 6502 i Z81... :lol:


Wróć do „Hyde Park”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 6 gości