|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Sep 2010
Messaggi: 28
|
[Assembler] problema ciclo annidato
ciao sono nuova nel forum e spero possiate aiutarmi.
sono alle prime armi con la programmazione assembler e devo realizzare un ciclo annidato che in c++ ho fatto in questo modo: int v[2] = {1,2}; for (int i=0; i<2; i++) { for (int j=0; j<2; j++) { if(i!=j) { cout <<v[i]<< v[j]<< endl; } } } il problema è convertirlo in assembler, io ho provato con questa procedura ma ovviamente non funziona: EFFETTUA_CICLO PROC NEAR mov Ax, 0000h mov Bx, 0000h .loop1: .loop2: CMP Ax, BX ; istruzioni loop interno JNZ ordina INC Bx CMP BX, 0002h JB .loop2 INC Ax CMP Ax, 0002h JB .loop1 ordina: MOV AL, vett[Ax] CALL STAMPA_NUMERO MOV AL, vett[BX] CALL STAMPA_NUMERO JMP .loop2 EFFETTUA_CICLO ENDP sapete aiutarmi? grazie mille |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Un trucco.
Prendi il C++, lo compili, lo disassembli e prendi spunto.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Sep 2010
Messaggi: 28
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
E' un pò che non lo uso dev-C++ credo non abbia quella funzione....
Sicuramente lo puoi fare con CodeBlocks. Migliore anche sotto molti altri aspetti. Altrimenti puoi anche installarti la versione express di Visual C++. Entrambi hanno la funzione disassembly. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6624
|
|
|
|
|
|
|
#6 | |
|
Junior Member
Iscritto dal: Sep 2010
Messaggi: 28
|
Quote:
sono riuscita a farlo correttamente senza disassemblare, ho un ultimo piccolo problema non so se potete darmi una mano. per scorrere il vettore mi servono 5 differenti registri da usare come indici ho già usato SI, BX, DI, BP (spero di averli usati in modo corretto) però me ne servirebbe un ultimo che mi permetta di fare la stessa cosa, ma non riesco a trovarlo, sapete quale posso usare?? |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
Conviene che posti il tuo codice però.
Cmq hai a diposizione anche EAX e ECX a meno che già li usi per altro.... in ultimo questo ti può essere molto utile: www.giobe2000.it |
|
|
|
|
|
#8 | ||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Comunque per quel programma 5 registri indice mi sembrano tanti. Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
|
|
|
|
|
#9 | |
|
Junior Member
Iscritto dal: Sep 2010
Messaggi: 28
|
Quote:
cmq vi posto la procedura che dovrebbe fare questa cosa: EFFETTUA_CICLO PROC NEAR MOV DX,OFFSET MESS6 ;Sceglie la stringa (DS CALL STAMPA_STRINGA ; e la stampa. mov SI, 0000h .loop1: mov BX, 0000h .loop2: mov DI, 0000h .loop3: mov BP, 0000h .loop4: MOV AX, 0000h .loop5: CMP SI, BX JNZ confr2 JMP incrementa stampa: MOV AL, vett[SI] CALL STAMPA_NUMERO MOV AL, vett[BX] CALL STAMPA_NUMERO MOV AL, vett[DI] CALL STAMPA_NUMERO MOV AL, vett[BP] CALL STAMPA_NUMERO MOV AL, vett[AX] ------->QUESTO NON POSSO FARLO GIUSTO? CALL STAMPA_NUMERO MOV DX,OFFSET caratt ;Sceglie la stringa (DS CALL STAMPA_STRINGA ; e la stampa. incrementa: INC AX CMP AX, 0005h JB .loop5 INC BP CMP BP, 0005h JB .loop4 INC DI CMP DI,0005h JB .loop3 INC BX CMP BX, 0005h JB .loop2 INC SI CMP SI,0005h JB .loop1 JMP fine_ciclo chiama_stampa: JMP STAMPA confr2: CMP BX, DI JNZ confr3 JMP incrementa confr3: CMP SI, DI JNZ confr4 JMP incrementa confr4: CMP BP, SI JNZ confr5 JMP incrementa confr5: CMP BP, BX JNZ confr6 JMP incrementa confr6: CMP BP, DI JNZ confr7 JMP incrementa confr7: CMP AX, BX JNZ confr8 JMP incrementa confr8: CMP BP,AX JNZ confr9 JMP incrementa confr9: CMP AX, SI JNZ confr10 JMP incrementa confr10: CMP AX, DI JNZ chiama_stampa JMP incrementa fine_ciclo: EFFETTUA_CICLO ENDP L'errore che ottengo è dove ho inserito la freccia, in alternativa ho provato a fare così: stampa: MOV AL, vett[SI] CALL STAMPA_NUMERO MOV AL, vett[BX] CALL STAMPA_NUMERO MOV AL, vett[DI] CALL STAMPA_NUMERO MOV AL, vett[BP] CALL STAMPA_NUMERO MOV NUM, SI MOV SI, AX MOV AL, vett[SI] CALL STAMPA_NUMERO MOV SI, NUM MOV DX,OFFSET caratt ;Sceglie la stringa (DS CALL STAMPA_STRINGA ; e la stampa. in questo modo tutte le permutazioni sono corrette, ma l'ultima cifra di ogni combinazione non è un numero ma un carattere!! Ultima modifica di me88 : 22-09-2010 alle 11:00. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:51.




















