|
|
|
![]() |
|
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 ![]()
__________________
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 14: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 15: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 17: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 18: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: 23:54.