|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Sep 2011
Messaggi: 72
|
[ASSEMBLY 8086] Programma somma
Ragazzi sto provando a fare una semplice somma con l'8086,però quando arrivo a stampare mi stampa una miriade di caratteri (cuori,frecce etc..) che non ci incastrano nulla.
Il codice è questo Codice HTML:
.model small ;definisce il modello di memoria da utilizzare
.stack 200h ;dimensione massima del codice sorgente
.data ;definizione variabili e/o costanti
num1 db ?
ris db ?
.code
inizio:
mov ax,@data
mov ds,ax ;inizializzo il segmento
mov ah,1 ;funzione di lettura carattere
int 21h
mov bh,al
mov num1,bh
mov ah,1
int 21h
mov bh,al
add bh,num1
mov ris,bh
;
;a capo
mov AH,02h
mov DL,13
int 21h
mov AH,02h
mov DL,10
int 21h
;
mov ah,9 ;funzione di stampa della stringa
mov dx,offset ris
int 21H
jmp inizio
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
Hmm, non posso testare il tuo codice, e non mi ricordo bene l'8086.
Però sappi che le procedure DOS attivate attraverso l'istruzione INT 21H permettono di leggere o visualizzare esclusivamente caratteri ascii. Di conseguenza sta a te poi trasformare l'input in un vero numero. Generalmente devi aggiungere/sottrarre ( ora non ricordo bene ) 48 ( il numero decimale che corrisponde allo 0 ascii ) perchè le somme stampate siano corrette.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Sep 2011
Messaggi: 72
|
un altra domanda,come faccio,tramite questo menù,ad andare a 4 procedure diverse?
Cioè io ero abituato a mettere il je (salta se è uguale) ma devo usare le procedure..e le procedure si richiamano solo con la call,quindi il controllo come lo faccio? Codice HTML:
.code ;inizio codice sorgente inizio: mov ax,@data mov ds,ax ;carica il segmento dati ;a capo mov AH,02h mov DL,13 int 21h mov AH,02h mov DL,10 int 21h mov ah,9 ;funzione di stampa della stringa mov dx,offset stringa ;visualizza la stringa int 21h mov dx,offset scelta1 int 21h mov dx,offset scelta2 int 21h mov dx,offset scelta3 int 21h mov dx,offset scelta4 int 21h mov ah,1 ;funzione di lettura carattere int 21h |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
Metti il codice che vuoi far eseguire dentro una procedura.
Poi se la procedura deve essere richiamata solo in certe condizioni, le anteponi un'etichetta ( label ) così puoi con un salto condizionato, andare all'etichetta ( che come prima istruzione avrà una CALL procedura ): Codice:
CMP 0,CX JE etichetta1 ... etichetta1: CALL procedura
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
|
|
|
|
|
#5 | |
|
Member
Iscritto dal: Sep 2011
Messaggi: 72
|
Quote:
Sono arrivato a questo punto,sto facendo la potenza,nel caso specifico un numero elevato alla prima (che quindi rimane uguale). Stampa tutto correttamente,ma insieme mi stampa una marea di caratteri (come vi dicevo ieri sera). Il pezzetto di codice che riguarda la variabile RIS (risultato) è questo: Codice HTML:
stampa_ris: ;a capo mov AH,02h mov DL,13 int 21h mov AH,02h mov DL,10 int 21h ; mov bl,n1 mov ris,bl mov ah,9 mov dx,offset ris int 21h jmp inizio end Come posso stampare ris? |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
Ma per stampare un numero o un singolo carattere ( ASCII ) ti basta fare uguale a come hai fatto per stampare il line-feed e il carriage-return...
Ti consiglio di leggerti un libro sull'Assembler 8086 perchè pare tu non abbia le idee chiare
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Sep 2011
Messaggi: 72
|
mi riesce l'8086..ma non so stampare un risultato.
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
il motivo, come detto da kwb nella prima risposta, è che un valore zero in un registro non corrispondente al simbolo zero che vedi sullo schermo
lo zero sullo schermo ha valore 48, l'uno 49, ecc.... se vuoi stampare un numero ( ad una cifra ) devi sommargli 48 se i numeri sono a più cifre va ovviamente scisso il numero nelle sue cifre costituenti e ad ognuna va sommato 48 e poi inviato alla funzione di stampa |
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Sep 2011
Messaggi: 72
|
allora,comincio a capirci.
In questo caso N1 = 1 e N2 = 2 Mi stampa 3 quindi VA BENE !!!! Codice HTML:
MOV AL, N1 ;carica N1 da RAM a registro AL
MOV BL, N2 ;carica N2 da RAM a registro BL
ADD AL, BL ;significa AL=AL+BL, il registro AL fa da accumulatore e contiene ora la somma
add al,48
MOV SOMMA, AL ;il risultato viene scritto in memoria nella variabile somma, copiato da registro AL
mov dl,somma
mov ah,2
int 21h
Se io avessi però 20 + 15?Come faccio a stampare 35 e non un carattere? |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Tramite divisioni successive per 10. Usa l'istruzione div e leggi, ad ogni divisione, il risultato in dx ( il resto ).
Ad esempio 15/10 = 1 con resto 5...1/10 = 0 con resto 1. Semplice!! |
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Sep 2011
Messaggi: 72
|
et voilà,siete dei geni ce l'ho fatta.
Una cosa però a me funziona SOLO se dichiaro in alto le variabili,cioè se dico db N1 3 e db N1 5 lui mi fa 3+5= 8 e va bene,però se io volessi inserire da tastiera n1 e n2 e faccio Codice HTML:
mov n1,al |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
La variabile ( che in realtà è un indirizzo di memoria... ) deve essere sempre dichiarata prima.
Mi pare che facendo: Codice:
variabile DW ? Se poi vuoi mettere qualcosa in quella "variabile" puoi fare: Codice:
mov variabile,AL
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Sep 2011
Messaggi: 72
|
Ragazzi un altra domanda.
Ho fatto questo codice (è una procedura). Se volessi "trasformarla" in MACRO come faccio per richiamarla? Codice HTML:
input_potenza proc
;--------INPUT N1--------
mov n1, 0000h
mov ah,9 ;funzione di stampa della stringa
mov dx,offset mess_pot_1 ;visualizza la stringa
int 21h
mentre:
mov ah, 01h
int 21h
cmp al, 30h
jb continuo
cmp al, 39h
ja continuo
mov ah, 00h
sub al, 30h
mov cifra, ax
mov ax, n1
mov bx, 0ah
mul bx
add ax, cifra
mov n1,ax
jmp mentre
;--------INPUT N2---------
continuo:
mov n2, 0000h
mov ah,9 ;funzione di stampa della stringa
mov dx,offset mess_pot_2 ;visualizza la stringa
int 21h
mentre_2:
mov ah, 01h
int 21h
cmp al, 30h
jb fine
cmp al, 39h
ja fine
mov ah, 00h
sub al, 30h
mov cifra, ax
mov ax, n2
mov bx, 0ah
mul bx
add ax, cifra
mov n2,ax
jmp mentre_2
fine:
ret
endp
Ultima modifica di jyciap11 : 14-05-2013 alle 15:50. |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
Una macro si crea nel seguente modo:
Codice:
NomeMacro MACRO valore1, valore2, ..., valoreN ... ENDM
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
Ultima modifica di kwb : 14-05-2013 alle 16:22. |
|
|
|
|
|
#15 |
|
Member
Iscritto dal: Sep 2011
Messaggi: 72
|
Ultima domanda.
Questo programma calcola una potenza,però con due cifre. Qualcuno riesce a dirmi come fare per n cifre (esempio 9^9) Codice HTML:
calcolo_potenza:
call input_potenza
call a_capo
mov ax,1
mov bx, n1
mov cx, n2
ciclo:
mul bx
loop ciclo
istr_finali:
mov ptz, ax
mov ah,0 ; azzero AH così AX è il risultato
mov bl,10 ; carico il divisore in BL
div bl ; divido AX per BL(10) ed ottengo AL=quoziente (le decine) AH=resto (le unità)
add al,30h ; le decine in ASCII
mov ris_ascii,al
add ah,30h ; le untià in ASCII
mov ris_ascii+1,ah
lea dx, ris
mov ah,09h
int 21h
Ultima modifica di jyciap11 : 14-05-2013 alle 18:49. |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
Cioè tu vuoi calcolare la potenza n-esima di un numero i-esimo?
i^n? Fa conto però che se così fosse, devi prevedere il caso in cui il risultato non sia memorizzabile in un singolo registro e attrezzarti per salvarlo in più registri.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
Ultima modifica di kwb : 14-05-2013 alle 19:52. |
|
|
|
|
|
#17 | |
|
Member
Iscritto dal: Sep 2011
Messaggi: 72
|
Quote:
Quindi fino a che il risultato è di due cifre funziona,ma dopo non funziona più |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
Quote:
Secondo quanto ho detto ( ammesso sia corretto, ma ho ricontrollato sul libro che avevo usato per studiare il linguaggio e pare confermarlo ) non ci dovrebbero essere problemi fino a 65535. Inoltre, trattandosi di potenze, il numero è sempre positivo. Tra l'altro, se usi delle variabili per salvare il risultato, assicurati che siano DW ( che mi pare sia il tipo di dato da 16 bit ) così da essere grandi quanto i registri.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
|
|
|
|
|
|
#19 | |
|
Member
Iscritto dal: Sep 2011
Messaggi: 72
|
Quote:
|
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:26.











) 48 ( il numero decimale che corrisponde allo 0 ascii ) perchè le somme stampate siano corrette.









