PDA

Visualizza la versione completa : [ASSEMBLER] Operazione di sottrazione


Il Pazzo
22-10-2006, 13:22
Ho fatto questo programma... ma non capisco cos è che non va... mi fa uscire come risultato una faccina che ride...





Sistema SEGMENT STACK
DB 64 DUP (?)
Sistema ENDS


Dati SEGMENT
a DB 4 DUP (?)
Dati ENDS


Codice SEGMENT
ASSUME CS:Codice,SS:Sistema,DS:Dati

Inizio: MOV AH,01h ;Input da tastiera. Ritorna il valore in AL
INT 21H
MOV a,AL


MOV AH,01h
INT 21H


SUB a,AL ;a=a-AL

MOV AH,0Ah
MOV AL,a ;Metto il carattere della stringa in AL
MOV BH,0 ;così da poterlo stampare
MOV CX,1 ;una sola volta sullo schermo
INT 10H

Premi: MOV AH,08h ;Input da tastiera senza echo
INT 21H

CMP AL,27 ;Controlla se il tasto premuto sia il tasto ESC (27 dec.)
JE Esci ;Se uguale esce dal programma
JNE Premi ;Altrimenti attende che rivenga premuto un tasto...

Esci: MOV AX,4C00h ;Torno al DOS
INT 21h

Codice ENDS

END Inizio




Ho provato la stampa anche così... ma non va:



MOV AH,0Ah
MOV AL,a+30h ;Metto il carattere della stringa in AL
MOV BH,0 ;così da poterlo stampare
MOV CX,1 ;una sola volta sullo schermo
INT 10H


E infine ho provato anche così:


MOV AH,01h
INT 21H
MOV a,AL

MOV AH,01h
INT 21H

SUB a,AL

MOV DL,a
MOV AH,02H
INT 21H


Nessuno dei tre funziona.... cosa sbaglio?

Grazie per l'aiuto

oregon
22-10-2006, 13:30
Devi trasformare il risultato in ASCII prima di visualizzarlo ...


...
MOV AL,a ; Metto il risultato della sottrazione in AL
OR AL,30h ; lo trasformo in ASCII
MOV BH,0 ;così da poterlo stampare
...

Il Pazzo
22-10-2006, 13:59
Ahhhh perfetto.. si funziona... invece io in una prova avevo fatto MOV AL,a+30h
ma non dovrebbe essere la stessa cosa?

e poi altre 3 domandine (non c'è bisogno di scrivere il codice)

se voglio inserire un numero di più cifre lo devo fare con un ciclo o esiste una particolare istruzione?

per quanto riguarda i numeri negativi (sia come risultato che per inserirli)?

non ricordo bene... con "a DB 4 DUP (?)" alloco 4 byte di memoria per la variabile a (4 byte per un intero come in c)... corretto?

oregon
22-10-2006, 14:04
Originariamente inviato da Il Pazzo
Ahhhh perfetto.. si funziona... invece io in una prova avevo fatto MOV AL,a+30h
ma non dovrebbe essere la stessa cosa?


Non e' la stessa cosa ...


Originariamente inviato da Il Pazzo
e poi altre 3 domandine (non c'è bisogno di scrivere il codice)

se voglio inserire un numero di più cifre lo devo fare con un ciclo o esiste una particolare istruzione?

Esiste una funzione per l'input di una stringa ma, dopo, devi provvedere con un ciclo a trasformare il valore inserito da ASCII a binario ...


Originariamente inviato da Il Pazzo
per quanto riguarda i numeri negativi (sia come risultato che per inserirli)?


I numeri negativi sono rappresentati con il metodo del "complemento a due" ... le operazioni di addizione e sottrazione operano gia' in complemento a due ...


Originariamente inviato da Il Pazzo
non ricordo bene... con "a DB 4 DUP (?)" alloco 4 byte di memoria per la variabile a (4 byte per un intero come in c)... corretto?

In quel modo allochi 4 byte (32 bit) per la tua variabile, ma non la utilizzi completamente perche' stai lavorando a 16 bit ... (e poi nel tuo codice lavori con soli 8 bit) ...

Il Pazzo
22-10-2006, 14:31
Ah ti ringrazio... quindi potrei anche dichiarare "a DB (?)"... giusto? (non dovrei neanche avere problemi con numeri a + cifre così.. no?)


allora per il resto ti faccio sapere dopo che smanetto un pò.. intanto grazie ancora...

Loading