-Ivan-
24-06-2006, 13:36
Questo è il programma, la maschera è in C ma l'algoritmo è tutto in assembly.
Dovrebbe secondo il mio ragionamento calcolare la distanza tra il punto Point e gli altri punti contenuti in PointSet e darmi in output l'indice dell'elemento di PoinSet più vicino a Point.
l'algoritmo che ho pensato è semplicissimo ed è questo:
1) metto prima in ax e bx le coordinate x di Point e di un elemento PointSet poi le coordinate y
2) eseguo le operazioni matematiche per calcolare la distanza e metto il risultato in DX
3) confronto DX con il vecchio DX che conteneva la distanza tra il punto e l'elemento precedente di PointSet, se il vecchio DX è più grande lo sostituisco con il nuovo in modo da avere in DX sempre la distanza minore
4) aggiorno l'indice se ho sostituito DX altrimenti lo lascio invariato (come indice uso ECX che incremento per scorrere PointSet e che salvo nello stack all'inizio del ciclo)
5) ripeto il ciclo fino a n che è il numero di elementi di PointSet e poi esco
#include<stdio.h>
void main()
{
unsigned int Point = (5<<16 | 3); //il punto
unsigned int PointSet[] = {(10<<16) |3, (4<<16) |2, (5<<16) |20 }; //insieme
unsigned int n = sizeof(PointSet)/sizeof(PointSet[0]); //numero punti dell'insieme
unsigned int index; //risultatoindice del punto più vicino a Point
_asm{
//Azzero i registri utilizzati nel programma
XOR EAX,EAX
XOR EBX,EBX
XOR ECX,ECX
XOR EDX,EDX
XOR ESI,ESI
XOR EDI,EDI
Ciclo:
PUSH ECX
MOV CX, DX
// metto in AX la coordinata x di Point
MOV AX,[WORD PTR Point+2]
// metto in BX la coordinata x dell'elemento PointSet a cui sono arrivato
MOV BX,[WORD PTR PointSet+ECX+2]
//operazioni matematiche sui registri per fare sqrt ((x2-x1)^ + (y2-y1)^2)
SUB BX, AX //in bx ho x2-x1
IMUL BX, BX //in bx ho (x2-x1)^2
MOV DX, BX //in dx ho (x2-x1)^2
MOV AX,[WORD PTR Point]
MOV BX,[WORD PTR PointSet+ECX]
SUB BX, AX //in bx ho y2-y1
IMUL BX, BX //in bx ho (y2-y1)^2
ADD BX, DX //in BX ho (x2-x1)^ + (y2-y1)^2
MOV DX, BX //in DX ho (x2-x1)^ + (y2-y1)^2
//mettere qui la radice quadrata di DX
CMP CX, DX
JG Salva
Ritorna:
POP ECX
INC ECX
CMP ECX, n
JNE Ciclo
JE Termina
Salva:
MOV CX, DX
MOV index, ECX
JMP Ritorna
Termina:
}
//Stampa su video
printf("Il punto più vicino a: ( %d, %d ) e' |%d, %d| [indice=%d]\n",
(short int)(Point&0xFFFF), (short int) (Point>>16),
(short int)(PointSet[index]&0xFFFF), (short int) (PointSet[index]>>16),
index
);
}
Dovrebbe secondo il mio ragionamento calcolare la distanza tra il punto Point e gli altri punti contenuti in PointSet e darmi in output l'indice dell'elemento di PoinSet più vicino a Point.
l'algoritmo che ho pensato è semplicissimo ed è questo:
1) metto prima in ax e bx le coordinate x di Point e di un elemento PointSet poi le coordinate y
2) eseguo le operazioni matematiche per calcolare la distanza e metto il risultato in DX
3) confronto DX con il vecchio DX che conteneva la distanza tra il punto e l'elemento precedente di PointSet, se il vecchio DX è più grande lo sostituisco con il nuovo in modo da avere in DX sempre la distanza minore
4) aggiorno l'indice se ho sostituito DX altrimenti lo lascio invariato (come indice uso ECX che incremento per scorrere PointSet e che salvo nello stack all'inizio del ciclo)
5) ripeto il ciclo fino a n che è il numero di elementi di PointSet e poi esco
#include<stdio.h>
void main()
{
unsigned int Point = (5<<16 | 3); //il punto
unsigned int PointSet[] = {(10<<16) |3, (4<<16) |2, (5<<16) |20 }; //insieme
unsigned int n = sizeof(PointSet)/sizeof(PointSet[0]); //numero punti dell'insieme
unsigned int index; //risultatoindice del punto più vicino a Point
_asm{
//Azzero i registri utilizzati nel programma
XOR EAX,EAX
XOR EBX,EBX
XOR ECX,ECX
XOR EDX,EDX
XOR ESI,ESI
XOR EDI,EDI
Ciclo:
PUSH ECX
MOV CX, DX
// metto in AX la coordinata x di Point
MOV AX,[WORD PTR Point+2]
// metto in BX la coordinata x dell'elemento PointSet a cui sono arrivato
MOV BX,[WORD PTR PointSet+ECX+2]
//operazioni matematiche sui registri per fare sqrt ((x2-x1)^ + (y2-y1)^2)
SUB BX, AX //in bx ho x2-x1
IMUL BX, BX //in bx ho (x2-x1)^2
MOV DX, BX //in dx ho (x2-x1)^2
MOV AX,[WORD PTR Point]
MOV BX,[WORD PTR PointSet+ECX]
SUB BX, AX //in bx ho y2-y1
IMUL BX, BX //in bx ho (y2-y1)^2
ADD BX, DX //in BX ho (x2-x1)^ + (y2-y1)^2
MOV DX, BX //in DX ho (x2-x1)^ + (y2-y1)^2
//mettere qui la radice quadrata di DX
CMP CX, DX
JG Salva
Ritorna:
POP ECX
INC ECX
CMP ECX, n
JNE Ciclo
JE Termina
Salva:
MOV CX, DX
MOV index, ECX
JMP Ritorna
Termina:
}
//Stampa su video
printf("Il punto più vicino a: ( %d, %d ) e' |%d, %d| [indice=%d]\n",
(short int)(Point&0xFFFF), (short int) (Point>>16),
(short int)(PointSet[index]&0xFFFF), (short int) (PointSet[index]>>16),
index
);
}