EMU8086 GENERATED LISTING. MACHINE CODE <- SOURCE. str2num.exe -- emu8086 assembler version: 4.07 [ 20/12/2012 -- 22.10.33 ] =================================================================================================== [LINE] LOC: MACHINE CODE SOURCE =================================================================================================== [ 1] : [ 2] : ; ------------------------------------------------------------------- [ 3] : ; A. Veneziani - Programma Assembly 8086 che converte un numero [ 4] : ; letto da console nel corrispondente valore intero [ 5] : ; ------------------------------------------------------------------- [ 6] : [ 7] : ; Segmento dati con variabili assembly utilizzate nel programma [ 8] : Dati SEGMENT [ 9] 0000: 00 00 N DW ? ; variabile che conterrą il valore del numero trasformato [ 10] 0002: 00 Cont DB ? ; conta la cifra considerata (da destra) [ 11] 0003: 00 Cc DB ? ; altro contatore per calcolo potenza di 10 [ 12] 0004: 14 00 00 00 00 00 00 00 00 00 00 00 Strng DB 20d, 20 DUP(?) ; stringa letta (numero sotto forma di stringa) 00 00 00 00 00 00 00 00 00 [ 13] 0019: 0A 00 Base DW 10d ; costante 10 decimale [ 14] : Dati ENDS [ 15] : [ 16] : Codice SEGMENT [ 17] : ASSUME CS:Codice,DS:Dati [ 18] 0020: B8 00 00 Inizio: MOV AX,Dati ; setta effettivamente l'inizio del registro [ 19] 0023: 8E D8 MOV DS,AX ; DS (segmento dati) [ 20] : [ 21] : ; porta in DX l'indirizzo di Strng [ 22] : ; indicando la zona di memoria dove depositare la stringa letta [ 23] 0025: BA 04 00 LEA DX,Strng [ 24] : ; chiama l'interrupt DOS per la lettura di una stringa... [ 25] 0028: B4 0A MOV AH,0Ah [ 26] 002A: CD 21 INT 21h [ 27] : [ 28] : ; [ 29] : ; si appresta a convertire la stringa letta in numero intero... [ 30] : ; [ 31] 002C: C7 06 00 00 00 00 MOV N,0000h ; azzera la cella di memoria N (16 bit) [ 32] 0032: C6 06 02 00 01 MOV Cont,01d ; contatore che tiene conto della cifra considerata [ 33] 0037: BB 00 00 MOV BX,00d [ 34] 003A: B9 00 00 MOV CX,00d [ 35] 003D: 8A 1E 05 00 MOV BL,Byte Ptr[Strng + 1] [ 36] 0041: Salta: [ 37] 0041: 8A 4F 05 MOV CL,Byte Ptr[Strng + BX + 1] [ 38] 0044: 80 E9 30 SUB CL,48d [ 39] : [ 40] : ; sposta Cont in Cc tramite AL (operazione su 1 byte) [ 41] 0047: 8A 16 02 00 MOV DL,Cont ; passa il contenuto di Cont a Cc [ 42] 004B: 88 16 03 00 MOV Cc,DL ; " " " [ 43] 004F: 80 2E 03 00 01 SUB Cc,01d ; Cc ora contiene il valore di Cont - 1 [ 44] : [ 45] 0054: B8 01 00 MOV AX,01h [ 46] : ; se risulta elevato alla 0 (ossia cifra unitą) salta alla [ 47] : ; moltiplicazione della cifra letta (CL) per 1 [ 48] 0057: 80 3E 03 00 00 CMP Cc,00h [ 49] 005C: 74 0F JZ Salta2 [ 50] : [ 51] 005E: Calc10: [ 52] : ; calcola la potenza di 10 opportuna per la cifra considerata [ 53] 005E: F7 26 19 00 MUL Base [ 54] 0062: FE 0E 03 00 DEC Cc [ 55] 0066: 80 3E 03 00 00 CMP Cc,0h [ 56] 006B: 75 F1 JNE Calc10 [ 57] : [ 58] 006D: Salta2: [ 59] : ; moltiplica la cifra per la pot. di 10 appena calcolata [ 60] 006D: F7 E1 MUL CX [ 61] : ; aggiunge il risultato al numero risultato N [ 62] 006F: 01 06 00 00 ADD N,AX [ 63] : [ 64] 0073: 4B DEC BX [ 65] 0074: FE 06 02 00 INC Cont [ 66] : [ 67] 0078: 83 FB 00 CMP BX,0d ; ci sono altre cifre da leggere ? [ 68] 007B: 75 C4 JNE Salta ; allora salta alle operazioni di lettura sulla stringa [ 69] : [ 70] : ; ritorna al DOS [ 71] 007D: B4 4C MOV AH,4Ch [ 72] 007F: CD 21 INT 21h [ 73] : Codice ENDS [ 74] : [ 75] : END Inizio [ 76] : ===================================================================================================