---+++ Errori riscontrati nei vostri progetti Assembler Nel correggere le relazioni del SecondoEsercizioAssembler2001 sto incontrando questi errori comuni: * Mancato salvataggio/ripristino dei registri usati nel trap.handler. * Le eccezioni e le interruzioni debbono essere invisibili al programma principale. Se invece "sporcate" i registri l'insorgere di una interruzione potrebbe rovinare l'esecuzione del programma principale. * Lettura sbagliata della password. * Bisogna stare attenti che i caratteri battuti dall'utente non sovrascrivano le strutture dati che seguono. In particolare bisogna ricordarsi che la stringa letta dalla syscall 8, e' terminata da un carattere "0", quindi la zona "password" deve essere lunga almeno 5 caratteri. * Uso di registri per comunicare dal trap.handler al programma principale. * Questo vuol dire *riservare* un registro per uno scopo estremenente specifico. Visto che i registri sono solo 32 questo *non si fa* . * Inoltre, il testo del SecondoEsercizioAssembler2001 indicava chiaramente che e' il programma principale a dover confrontare la *zona di memoria* di nome "buffer" con la *zona di memoria* di nome "password". * Mancato allineamento in memoria di "buffer" o di "password". * Se usate l'istruzione *lw* per caricare una delle due zone di 4 bytes in un registro dovete assicurarvi che l'indirizzo da cui caricate le words sia allineato (cioe' multiplo di 4). Questo si risolve: * definendo le due zone come .word * oppure usando la direttiva *.align 2* che informa l'assemblatore di allineare la zona. * oppure usando l'istruzione *ulw* (unaligned load word) * Salto dal trap handler al programma principale. * questo stravolge completamente il flusso del programma .... non si fa. * Il programma ricorda la password battuta da un run al successivo .... * questo e' un grave baco di sicurezza!!! :-) Avrei dovuto considerare come errore (ma non l'ho fatto) anche: * manipolare il buffer byte a byte invece che come una singola word (era o non era di 4 bytes?) Errori riscontrati nelle vostre relazioni per il PrimoEsercizioAssembler2001 * Errore nello scrivere nella matrice * talvolta siete usciti dalla zona di memoria allocata, sporcando le strutture dati seguenti * Stampa col segno della half-word della prima matrice * si deve usare *lhu* (load half unsigned) per caricare la half-word altrimenti essa verra' *estesa in segno* * Errore nel caricare i due bytes della half-word * anche in questo caso si deve prestare attenzione al fatto che i due bytes non vanno considerati col segno * Uso delle istruzioni *j* o *b* invece che *jal* nella seconda chiamata ricorsiva di *tart* * anche se il programma in alcuni casi particolari funziona ... * ... bisogna stare molto attenti altrimenti lo stack non viene gestita correttamente. * Implementazione di *tart* in cui si somma 1 ad un registro (inizializzato a 0) ogni volta che si giunge al bordo * mi dispiace :-( , ma queste non erano le specifiche da seguire per implementare *tart* Restano poi alcune disattenzioni che hanno penalizzato alcuni di voi (per fortuna pochi): * mancanza del flow-chart di un programma * mancanza dei listati di un programma -- Users.AndreaSterbini - 24 May 2001 <br> <!-- * Set ALLOWTOPICCHANGE = Users.DocentiArcGroup -->
This topic: Architetture2/MZ
>
ErroriComuniAssembler
Topic revision: r4 - 2001-06-01 - AndreaSterbini
Copyright © 2008-2025 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki?
Send feedback