EMU8086 GENERATED LISTING. MACHINE CODE <- SOURCE. lettura_dos.exe -- emu8086 assembler version: 4.07 [ 18/02/2013 -- 13.26.52 ] =================================================================================================== [LINE] LOC: MACHINE CODE SOURCE =================================================================================================== [ 1] : Dati SEGMENT [ 2] 0000: 00 00 00 00 00 00 Numero_in DB 6 DUP(?) ; numeri alfanumerici in ingresso e uscita [ 3] 0006: 00 00 00 00 00 00 Numero_out DB 6 DUP(?) [ 4] 000C: 00 Cifra DB ? ; singola cifra (numerica o alfanumerica) [ 5] 000D: 00 00 Molti DW ? ; valore moltiplicatore (potenza di 10 - 10^x) [ 6] 000F: 00 00 N DW ? ; rappresentazione numerica del valore [ 7] 0011: 0A Potenza DB 10d ; valore costante 10 decimale [ 8] : Dati ENDS [ 9] : [ 10] : Codice SEGMENT [ 11] 0020: Inizio: [ 12] : [ 13] 0020: B8 00 00 MOV AX,Dati [ 14] 0023: 8E D8 MOV DS,AX [ 15] : [ 16] : ;------------------------------------------------------------------- [ 17] : ; Blocco delle istruzioni di lettura del numero intero (senza segno) [ 18] : ;------------------------------------------------------------------- [ 19] 0025: B9 00 00 MOV CX,0d [ 20] 0028: BB 00 00 MOV BX,Offset Numero_in [ 21] 002B: Ciclo: [ 22] 002B: B4 01 MOV AH,1d ; invoca il servizio DOS di lettura di un solo carattere [ 23] 002D: CD 21 INT 21h [ 24] 002F: 3C 0D CMP AL,13d ; e' stato premuto Invio - termine lettura [ 25] 0031: 74 06 JE Fine_Lettura [ 26] 0033: 88 07 MOV Byte Ptr[BX],AL [ 27] 0035: 43 INC BX [ 28] 0036: 41 INC CX [ 29] 0037: EB F2 JMP Ciclo [ 30] : ;------------------------------------------------------------------- [ 31] : [ 32] : ;----------------------------------------------------------------------- [ 33] : ; Blocco delle istruzioni di conversione da alfanumerico a valore intero [ 34] : ;----------------------------------------------------------------------- [ 35] 0039: Fine_Lettura: [ 36] 0039: 4B DEC BX [ 37] 003A: C7 06 0F 00 00 00 MOV N,0d [ 38] 0040: C7 06 0D 00 01 00 MOV Molti,1d [ 39] 0046: Conversione: [ 40] 0046: 8A 07 MOV AL,Byte Ptr[BX] ; prende una delle cifre lette [ 41] 0048: A2 0C 00 MOV Cifra,AL [ 42] 004B: 80 2E 0C 00 30 SUB Cifra,48d ; individua il valore numerico da quello ASCII [ 43] : [ 44] 0050: B4 00 MOV AH,0d [ 45] 0052: A0 0C 00 MOV AL, Cifra ; calcola il "peso" della cifra, ossia il suo valore effettivo [ 46] 0055: F7 26 0D 00 MUL Molti [ 47] 0059: 01 06 0F 00 ADD N,AX ; somma il valore della cifra al numero totale [ 48] : [ 49] 005D: A1 0D 00 MOV AX,Molti ; calcola la nuova potenza di 10 per la prossima cifra [ 50] 0060: F6 26 11 00 MUL Potenza [ 51] 0064: A3 0D 00 MOV Molti,AX [ 52] : [ 53] 0067: 4B DEC BX [ 54] 0068: E2 DC LOOP Conversione [ 55] : ;----------------------------------------------------------------------- [ 56] : [ 57] : [ 58] 006A: D1 06 0F 00 ROL N,1 ; <-- effettua una semplice operazione su N ( moltiplicazione per 2) [ 59] : [ 60] : [ 61] : ;----------------------------------------------------------------------- [ 62] : ; Blocco delle istruzioni di stampa del risultato posto in N [ 63] : ; (conversione da N in alfanumerico e stampa di ogni singolo carattere) [ 64] : ;----------------------------------------------------------------------- [ 65] : [ 66] 006E: B2 0A MOV DL,10d [ 67] 0070: B4 02 MOV AH,2d [ 68] 0072: CD 21 INT 21h [ 69] : [ 70] 0074: BB 06 00 MOV BX, Offset Numero_out [ 71] : [ 72] 0077: Ripeti: [ 73] 0077: BA 00 00 MOV DX,0d ; carica il dividendo [ 74] 007A: A1 0F 00 MOV AX,N [ 75] 007D: F7 36 11 00 DIV Word Ptr [Potenza] ; divisione per 10 (vista come divisione 32 bit / 16 bit [ 76] 0081: 88 16 0C 00 MOV Cifra,DL ; recupera il resto (in DX ) [ 77] 0085: A3 0F 00 MOV N,AX [ 78] : [ 79] 0088: 80 06 0C 00 30 ADD Cifra,48d ; data la cifra numerica individua il corrispondente ASCII [ 80] 008D: A0 0C 00 MOV AL,Cifra ; e lo immagazzina in Numero_out [ 81] 0090: 88 07 MOV Byte Ptr[BX],AL [ 82] 0092: 43 INC BX [ 83] : [ 84] 0093: 83 3E 0F 00 0A CMP N,10d ; se il quoziente è superiore a 10 non ha terminato il procedimento [ 85] 0098: 77 DD JA Ripeti [ 86] : [ 87] 009A: 83 06 0F 00 30 ADD N,48d ; converte N in ASCII e lo inserisce nell'ultima cifra di Numero_out [ 88] 009F: A1 0F 00 MOV AX,N [ 89] 00A2: 88 07 MOV [BX],AL [ 90] : [ 91] : ; [ 92] : ; ciclo (contatore BX) che stampa tutto il vettore di ASCII Numero_out [ 93] : ; [ 94] 00A4: Stampa: [ 95] 00A4: 8A 17 MOV DL,Byte Ptr[BX] [ 96] 00A6: B4 02 MOV AH,2d ; richiama l'apposito servizio DOS di stampa... [ 97] 00A8: CD 21 INT 21h [ 98] 00AA: 4B DEC BX ; sposta all'indietro l'indice BX [ 99] 00AB: 83 FB 06 CMP BX, Offset Numero_out ; se BX è arrivato all'inizio del vettore [ 100] 00AE: 73 F4 JAE Stampa [ 101] : [ 102] : ;----------------------------------------------------------------------- [ 103] : [ 104] 00B0: B4 4C MOV AH,4Ch ; ritorno al DOS... [ 105] 00B2: CD 21 INT 21h [ 106] : [ 107] : Codice ENDS [ 108] : [ 109] : END Inizio [ 110] : [ 111] : [ 112] : ===================================================================================================