PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (aprile 2009) SUBTTL** EsA032.ASM - Esercizi PALESTRA ASSEMBLY APPRENDISTI - by ing. G.OBER ;/---------------------------------------------------------------------------\ ;| NOME : EsA032.ASM | ;| AUTORE : Giorgio OBER | ;| VERSIONE : aprile 2009 | ;| DESCRIZIONE : Esercizio nř 0032 | ;| Organizza l'esecuzione delle 4 operazioni aritmetiche. | ;\---------------------------------------------------------------------------/ ; COSTANTI DEFINITE PER IL PROGRAMMA: Invio EQU 13 ;Codice Ascii del tasto ; MACRO UTILIZZATE DAL PROGRAMMA: include c:\arch-lab\bin\GIOBE.MAC ; Organizza la stampa a livello BIOS di un ; carattere passato dal parametro "Carattere", M_Chr_ MACRO Carattere,Colore; nella posizione di stampa corrente e con il M_COLOR Colore ; Colore specificato dal parametro "Colore". MOV AL,Carattere ; Rispetto alla MACRO "M_Chr", gi… disponibile CALL Biochr1 ; nella libreria GIOBE.MAC, non dispone dunque ENDM ; dei parametri "Riga","Colonna" cioŠ non ; consente di fissare la posizione di stampa ; (per altro poco utile nel nostro esempio...) M_BytDec MACRO Dato,Colore ; Organizza la stampa del valore DECIMALE M_COLOR Colore ; del dato a 8 bit (byte) passato dal parametro MOV AL,Dato ; "Dato", nella posizione di stampa corrente e CALL Byt2Dec ; con il colore specificato dal parametro ENDM ; "Colore" M_BytAsc MACRO Dato,Colore ; Organizza la stampa del valore ESADECIMALE M_COLOR Colore ; del dato a 8 bit (byte) passato dal parametro MOV AL,Dato ; "Dato", nella posizione di stampa corrente e CALL Byt2Asc ; con il colore specificato dal parametro ENDM ; "Colore" ; LIBRERIA UTILIZZATA DAL PROGRAMMA [opzione WinASM altrimenti non necessaria] includelib c:\arch-lab\bin\GIOBE.LIB ;PROCEDURE ESTERNE UTILIZZATE dal PROGRAMMA [NEAR, dalla LIBRERIA ~GIOBE.LIB~] ;----------------------------------------------------------------------------- EXTRN CambiaCol:NEAR EXTRN SET_cur:NEAR EXTRN VIA_cur:NEAR EXTRN RIP_cur:NEAR EXTRN KEYwait:NEAR EXTRN STAsp:NEAR EXTRN Acapo:NEAR EXTRN BIOScls:NEAR EXTRN BIOchr1:NEAR EXTRN BIObeep:NEAR EXTRN BIOSmsg:NEAR EXTRN Byt2Dec:NEAR EXTRN Byt2Asc:NEAR EXTRN Wor2Dec:NEAR EXTRN Wor2Asc:NEAR EXTRN Dec2Byt:NEAR EXTRN RIEMPI:NEAR EXTRN Del_1500:NEAR ; DICHIARAZIONI (VARIABILI) PER I PROGRAMMI ESTERNI: PUBLIC ATTRIB ;Attributo di colore ; DICHIARAZIONI (PROCEDURE) PER I PROGRAMMI ESTERNI: PUBLIC EsA032 ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP EsA032 ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 0FH No_DIV DB 0FFH Dato1 DB 00H Dato2 DB 00H Depo1 DB "00",00H Depo2 DB "00",00H Testo01 DB "Operazioni Aritmetiche",00H Testo02 DB "Digita il 1ř operando (massimo 2 cifre, da 0 a 99): " Testo03 DB " ",00H Testo04 DB "Operando Fuori Range !!",00H Testo05 DB " Resto ",00H Testo06 DB " SCAMBIO !!! ",00H Testo07 DB "1ř operando: ??",00H Testo08 DB "2ř operando: ??",00H Testo09 DB "Operando Nullo - Divisione Impossibile",00H SegnoA DB "+" SegnoS DB "-" SegnoP DB "*" SegnoD DB ":" TestoA DB "************* ADDIZIONE *************",00H TestoS DB "************ SOTTRAZIONE ************",00H TestoP DB "************* PRODOTTO **************",00H TestoD DB "************* DIVISIONE *************",00H MENU_ DB "Scegli: [N]uovi Dati " DB "[A]ddizione " DB "[S]ottrazione " DB "[P]rodotto " DB "[D]ivisione " DB "[Q]uit ",00H CopyRg DB "TUTORIAL ASSEMBLY --- www.Giobe2000.it --- Copyright 2009",00H ;AREA DESTINATA ALLE PROCEDURE DEL PROGRAMMA ;/---------------------------------------------------------------------------\ ;|PROCEDURA :DeskTop | ;|DESCRIZIONE :Predispone il piano di lavoro (DeskTop): dopo aver pulito lo| ;| schermo e dopo aver fatto sparire il cursore mostra tutti i| ;| messaggi di presentazione del programma. | ;\---------------------------------------------------------------------------/ DeskTop:CALL BIOScls CALL VIA_cur ; fa sparire il cursore M_CURSOR 0,0 ; Stampa l'intera riga 0 (la prima) con M_COLOR 1FH ; caratteri vuoti (spazi) CALL BARRA ; M_CURSOR 23,0 ; Stampa l'intera riga 24 (l'ultima) con M_COLOR 1FH ; caratteri vuoti (spazi) CALL BARRA ; M_msgC TESTO01,0,28,1FH; Testo del titolo M_msgC CopyRg,24,10,04H; Testo del CopyRight M_msgC Testo07,02,32,0FH; "1ř operando: " M_msgC Testo08,03,32,0FH; "2ř operando: " MOV CS:[No_DIV],0FFH; se [No_DIV]=0FFH la divisione si pu• fare RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA :Menu | ;|DESCRIZIONE :Propone il menu principale del programma. | ;\---------------------------------------------------------------------------/ Menu: M_msgC MENU_,23, 1,1FH ; Testo del Menu M_Chr 'N',23,10,1EH ; "[A]ddizione " M_Chr 'A',23,23,1EH ; "[A]ddizione " M_Chr 'S',23,35,1EH ; "[S]ottrazione " M_Chr 'P',23,49,1EH ; "[P]rodotto " M_Chr 'D',23,60,1EH ; "[D]ivisione " M_Chr 'Q',23,74,1EH ; "[Q]uit " RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : BARRA | ;| DESCRIZIONE : Stampa una intera riga di caratteri vuoti, ideale per | ;| scrivere titoli e menu!! | ;\---------------------------------------------------------------------------/ BARRA: PUSH AX PUSH CX MOV CX,80 MOV AL,' ' Barra0: CALL BIOchr1 LOOP Barra0 POP CX POP AX RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : In_dati | ;| DESCRIZIONE : Organizza l'acquisizione dei 2 operandi, costituiti esclusi-| ;| vamente da stringhe Ascii ciascuna con 2 caratteri NUMERICI| ;| DECIMALI; i due bytes di dato sono disponibili in altrettan-| ;| te variabili [Dato1] e [Dato2], cosŤ come le due stringhe,| ;| entrambe terminate con 00H e disponibili nelle variabili| ;| [Depo1] e [Depo2]. | ;\---------------------------------------------------------------------------/ In_dati:MOV CX,2 ;Conta le 2 fasi d'acquisizione consecutive LEA SI,Depo1 ;Punta la locazione deposito per la 1.ma stringa LEA DI,Dato1 ;Punta la locazione deposito per il 1ř dato M_msgC Testo02,23,01,1FH;Propone il primo messaggio d'acquisizione MOV DH,2 ;Coordinata di riga per la stampa del 1ř dato ;Aspetta caratteri ASCII esclusivamente NUMERI- ;CI DECIMALI e pone fine all'acquisizione non In_da: CALL In_dato ;appena Š premuto Š ; la stringa acqui- ;sita viene collocata nelle locazioni puntate ;in ingresso da SI e poi convertita nel corri- ;spondente valore esadecimale a 8 bit, lasciato ;nella locazione puntata in ingresso da DI. ADD SI,3 ;Punta la locazione deposito per la 2.da stringa INC DI ;Punta la locazione deposito per il 2ř dato INC DH ;Coordinata di riga per la stampa del 2ř dato M_msgC Testo03,23,54,1FH;Adatta il primo messaggio d'acquisizione per M_Chr '2',23,11,1FH ;essere utile nella seconda acquisizione; tra ;l'altro cancella il dato assunto in precedenza LOOP In_da ;Ripete per la seconda acquisizione RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : In_dato | ;| DESCRIZIONE : Aspetta caratteri ASCII esclusivamente NUMERICI DECIMALI e,| ;| non appena Š premuto Š pone fine all'acquisizione;| ;| la stringa acquisita viene collocata nelle locazioni puntate| ;| in ingresso da SI e poi convertita nel corrispondente valore| ;| esadecimale a 8 bit, lasciato in uscita nella locazione pun-| ;| tata in ingresso da DI. | ;| In caso di Operando fuori l'acquisizione viene ripetuta. | ;\---------------------------------------------------------------------------/ In_dato:PUSH SI ;Salva il puntatore al deposito corrente M_CURSOR 23,54 ;Fissa la posizione di stampa dell'operando M_COLOR 1EH ;Fissa il colore dell'operando corrente In_d0: CALL KEYwait ; Rimane in attesa della pressione di un tasto ; qualunque (lasciando il suo valore in AL) CMP AL,Invio ; Verifica se il tasto appena premuto Š JE In_d1 ; e in questo caso pone fine all'acquisizione CMP AL,'9' ; Verifica se il carattere letto dal deposito Š JA In_d0 ; un NUMERO; se Š pi— grande di "9" (JA) o pi— CMP AL,'0' ; piccolo di "0" (JB) non ci interessa e si JB In_d0 ; ritorna in attesa di tasti numerici ; Se invece si tratta di un NUMERO salva il co- MOV CS:[SI],AL ; dice appena assunto da tastiera nel deposito INC SI ; (DepoX, puntato da SI) e poi incrementa il ; puntatore per puntare la locazione successiva CALL BIOchr1 ; Pone a video il carattere appena assunto da JMP SHORT In_d0 ; tastiera e torna in attesa di pressione tasti In_d1: MOV AL,00H ; Comunque sostituisce il carattere Ascii Invio MOV CS:[SI],AL ; con 00H, con cui termina la stringa acquisita POP SI ; Recupera il puntatore al deposito corrente e PUSH SI ; converte la stringa in esso contenuta, costi- CALL Dec2Byt ; tuita da 2 caratteri Ascii numerici e termi- POP SI ; nata con 00H, nel corrispondente valore esa- ; decimale a 8 bit, lasciato in uscita in AL CMP AL,0FFH ; JNE In_d2 ; CALL BIObeep ; In caso di Operando fuori range AL Š lasciato M_msgC Testo04,23,54,1EH; a FFH e la acquisizione viene ripetuta: per CALL Del_1500 ; prima cosa cancella il dato assunto in prece- M_msgC Testo03,23,54,1FH; denza e poi rientra in attesa tasti numerici JMP SHORT In_dato ; ; Se il dato Š correttamente nel range il suo In_d2: MOV CS:[DI],AL ; valore esadecimale a 8 bit, frutto della con- ; versione Š copiato nella locazione [DatoX] CMP AL,00H JNZ In_d3 MOV CS:[No_DIV],AL; se [No_DIV]=00H la divisione NON si pu• fare In_d3: M_CURSOR DH,45 ; M_BytDec AL,0EH ; Stampa il valore decim dell'operando corrente M_Chr_ ' ',0EH ; RET ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Fase1 | ;| DESCRIZIONE : Prima Parte comune a tutte e 4 le operazioni aritmetiche;| ;| assume dalle variabili [DatoX] i 2 valori esadecimali da| ;| coinvolgere nelle operazioni e li mette a video con il giu-| ;| sto segno aritmetico e il segno "=", in notazione DECIMALE; | ;| Prepara in AL il 1ř dato (primo operando) | ;\---------------------------------------------------------------------------/ Fase1: MOV BL,CS:[Dato1]; Assume dalle variabili di Dato i due valori MOV BH,CS:[Dato2]; esadecimali da coinvolgere nelle operazioni M_msgC Testo03,05,30,0FH; Pulisce il campo del messaggio di "SCAMBIO" e M_msgC Testo03,10,15,0FH; il campo del risultato, per una corretta M_msgN Testo03 ; visualizzazione dei risultati successivi MOV DL,28 ; CMP Byte Ptr CS:[SI],'*'; Fissa in modo dinamico la posizione di stampa JNE Fase1_ ; della stringa del risultato, pi— a sinistra se MOV DL,25 ; si tratta del risultato del PRODOTTO Fase1_: M_CURSOR 10,DL ; M_BytDec BL,0EH ; Mette a video i due operandi con il giusto M_Chr_ CS:[SI],0FH ; segno aritmetico e il segno "=", in notazione M_BytDec BH,0EH ; DECIMALE M_Chr_ '=',0FH ; MOV AL,BL ; Prepara in AL il 1ř dato (primo operando) RET ; ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Fase2 | ;| DESCRIZIONE : Seconda Parte comune a tutte e 4 le operazioni aritmetiche;| ;| mette a video il risultato in notazione DECIMALE, e poi| ;| aggiunge i due operandi con il giusto segno aritmetico e il| ;| segno "=", in notazione ESADECIMALE (cioŠ con la "H" finale)| ;| Prepara in AL il 1ř dato (primo operando) | ;\---------------------------------------------------------------------------/ Fase2: M_COLOR 0EH ; CMP Byte Ptr CS:[SI],'*'; Mette a video il risultato in notazione DECI- JNE Fase2_ ; MALE, a partire dalla word (Wor2dec) se si CALL Wor2Dec ; tratta di PRODOTTO oppure dal byte (Byt2Dec) JMP SHORT Fase2__; per le rimanenti tre operazioni aritmetiche Fase2_: CALL Byt2Dec ; Fase2__:M_Chr_ ' ',0FH ; M_Chr_ '(',0FH ; M_BytAsc BL,0EH ; Mette a video i due operandi con il giusto M_Chr_ 'H',06H ; segno aritmetico e il segno "=", in notazione M_Chr_ CS:[SI],0FH ; ESADECIMALE (cioŠ con la "H" finale) M_BytAsc BH,0EH ; M_Chr_ 'H',06H ; M_Chr_ '=',0FH ; MOV AL,BL ; Prepara in AL il 1ř dato (primo operando) MOV AH,00H ; Azzera AH (utile solo per la DIVISIONE) RET ; ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Fase3 | ;| DESCRIZIONE : Terza Parte comune a tutte e 4 le operazioni aritmetiche;| ;| mette a video il risultato in notazione ESADECIMALE, e poi| ;| chiude la stringa dei risultati. | ;\---------------------------------------------------------------------------/ Fase3: M_COLOR 0EH ; CMP Byte Ptr CS:[SI],'*'; JNE Fase3_ ; Mette a video il risultato in notazione ESA- CALL Wor2Asc ; DECIMALE a partire dalla word (Wor2dec) se si JMP SHORT Fase3__; tratta di PRODOTTO oppure dal byte (Byt2Dec) Fase3_: CALL Byt2Asc ; per le rimanenti tre operazioni aritmetiche Fase3__:M_Chr_ 'H',06H ; M_Chr_ ')',0FH ; RET ;***************************************************************************** ; ---------------------------------------------- EsA032 proc NEAR ; AREA DEDICATA AL MAIN PROGRAM ; ---------------------------------------------- ;----------------------------------------------------------------------------- CALL DeskTop ; Predispone il piano di lavoro ; Organizza l'acquisizione dei 2 operandi, xxx00: CALL In_dati ; costituiti esclusivamente da 2 caratteri Ascii ; NUMERICI DECIMALI CALL Menu ; Propone il menu principale ; ---------------------------------------------- xxx01: CALL KEYwait ; MAIN LOOP : Attesa decisioni ; ---------------------------------------------- AND AL,11011111B ; Rende maiuscolo il carattere del tasto premuto CMP AL,'A' ; JNZ xxx02 ; Servizio per il tasto "A" - *** ADDIZIONE ** JMP ServAdd ; xxx02: CMP AL,'S' ; JNZ xxx03 ; Servizio per il tasto "S" - ** SOTTRAZIONE * JMP ServSot ; xxx03: CMP AL,'P' ; JNZ xxx04 ; Servizio per il tasto "P" - *** PRODOTTO *** JMP Servpro ; xxx04: CMP AL,'D' ; JNZ xxx05 ; Servizio per il tasto "D" - *** DIVISIONE ** JMP ServDiv ; xxx05: CMP AL,'N' ; JNZ xxx06 ; Servizio per il tasto "N" - ** nuovi dati ** JMP ServNew ; xxx06: CMP AL,'Q' ; JZ _OUT ; Servizio per il tasto "Q" - fine programma JMP SHORT xxx01 ; _OUT: PUSH AX ; Torna al DOS con la memoria liberata e con la CALL RIP_cur ; chiusura di tutti i file; cede il controllo MOV DH,23 ; al processo padre (generalmente COMMAND.COM); MOV DL,0 ; il valore posto eventualmente in AL prima di CALL SET_cur ; uscire pu• essere testato in uscita con la POP AX ; funzione 4DH o mediante la lettura della MOV AH,4CH ; variabile DOS "ERRORLEVEL" INT 21H ; ;/---------------------------------------------------------------------------\ ;| SERVIZIO INTERNO: ServAdd (********** NB: NON E' UNA PROCEDURA *********) | ;| DESCRIZIONE : Esegue l'operazione di SOMMA e organizza la proposta dei| ;| risultati in notazione DECIMALE e ESADECIMALE | ;| Al termine non ritorna con RET (NON E' UNA PROCEDURA) ma| ;| rientra nel MAIN LOOP con un normale salto..... | ;\---------------------------------------------------------------------------/ ServAdd:M_msgC TestoA,8,20,0EH LEA SI,SegnoA CALL Fase1 ADD AL,BH ;<< ADDIZIONE: AL = AL+BH (= BL+BH) CALL Fase2 MOV AL,BL ADD AL,BH ;<< ADDIZIONE: AL = AL+BH (= BL+BH) CALL Fase3 JMP xxx01 ;/---------------------------------------------------------------------------\ ;| SERVIZIO INTERNO: ServSot (********** NB: NON E' UNA PROCEDURA *********) | ;| DESCRIZIONE : Esegue l'operazione di SOTTRAZIONE e organizza la proposta| ;| dei risultati in notazione DECIMALE e ESADECIMALE | ;| Al termine non ritorna con RET (NON E' UNA PROCEDURA) ma| ;| rientra nel MAIN LOOP con un normale salto..... | ;\---------------------------------------------------------------------------/ ServSot:M_msgC TestoS,8,20,0EH LEA SI,SegnoS CALL Fase1 PUSH BX CMP BL,BH ;\--------------------------------------------- JGE Dif1_ ;| Controllo sugli operandi MOV AL,BL ;| MOV BL,BH ;| Scambia gli operandi se il sottrendo Š MOV BH,AL ;| maggiore del minuendo M_Chr_ '-',0FH ;| MOV AL,BL ;/--------------------------------------------- Dif1_: SUB AL,BH ;<< SOTTRAZIONE: AL = AL-BH (= BL-BH) CALL Fase2 POP BX MOV AL,BL CMP BL,BH ;\--------------------------------------------- JGE Dif2_ ;| Controllo sugli operandi MOV AL,BL ;| MOV BL,BH ;| Scambia gli operandi se il sottrendo Š MOV BH,AL ;| maggiore del minuendo M_Chr_ '-',0FH ;| MOV AL,BL ;/--------------------------------------------- Dif2_: SUB AL,BH ;<< SOTTRAZIONE: AL = AL-BH (= BL-BH) CALL Fase3 JMP xxx01 ;/---------------------------------------------------------------------------\ ;| SERVIZIO INTERNO: ServPro (********** NB: NON E' UNA PROCEDURA *********) | ;| DESCRIZIONE : Esegue l'operazione di PRODOTTO e organizza la proposta dei| ;| risultati in notazione DECIMALE e ESADECIMALE | ;| Al termine non ritorna con RET (NON E' UNA PROCEDURA) ma| ;| rientra nel MAIN LOOP con un normale salto..... | ;\---------------------------------------------------------------------------/ ServPro:M_msgC TestoP,8,20,0EH LEA SI,SegnoP CALL Fase1 MUL BH ;<< PRODOTTO: AX = AL*BH (= BL*BH) CALL Fase2 MOV AL,BL MUL BH ;<< PRODOTTO: AX = AL*BH (= BL*BH) CALL Fase3 JMP xxx01 ;/---------------------------------------------------------------------------\ ;| SERVIZIO INTERNO: ServDiv (********** NB: NON E' UNA PROCEDURA *********) | ;| DESCRIZIONE : Esegue l'operazione di DIVISIONE e organizza la proposta dei| ;| risultati in notazione DECIMALE e ESADECIMALE | ;| Al termine non ritorna con RET (NON E' UNA PROCEDURA) ma| ;| rientra nel MAIN LOOP con un normale salto..... | ;\---------------------------------------------------------------------------/ ServDiv:M_msgC TESTOd, 8,20,0EH CMP CS:[No_DIV],00H; JNE Div2_ ; se [No_DIV]=00H la divisione NON si pu• fare M_msgC Testo09,10,19,0FH; JMP xxx01 ; Div2_: LEA SI,SegnoD MOV BL,CS:[Dato1] ; Assume dalle variabili di Dato i due valori MOV BH,CS:[Dato2] ; esadecimali da coinvolgere nelle operazioni CMP BL,BH ;\---------------------------------------------- JGE Div1_ ;| Controllo sugli operandi MOV AL,BL ;| MOV BL,BH ;| Scambia gli operandi se il divisore Š MOV BH,AL ;| maggiore del dividendo M_msgC Testo06,05,32,0CFH;/---------------------------------------------- Div1_: ; Pulisce il campo del risultato e posizione il M_msgC Testo03,10,25,0FH; punto di stampa in modo dinamico, pi— a sini- MOV DL,19 ; stra se si tratta del risultato della DIVI- CALL Fase1_ ; SIONE; poi mette a video i due operandi con ; il giusto segno aritmetico e il segno "=", in ; notazione DECIMALE, e prepara in AL il 1řdato MOV AH,00H ; DIV BH ; < DIVISIONE: AL = AX:BH (= BL:BH), AH=resto M_BytDec AL,0EH ; M_COLOR 0FH ; M_msgN Testo05 ; Aggiunge il resto della DIVISIONE M_BytDec AH,0EH ; CALL Fase2__ ; Mette a video i due operandi con il giusto MOV AL,BL ; segno aritmetico e il segno "=", in notazione MOV AH,00H ; ESADECIMALE (cioŠ con la "H" finale) DIV BH ; < DIVISIONE: AL = AX:BH (= BL:BH), AH=resto PUSH AX ; M_BytAsc AL,0EH ; M_Chr_ 'H',06H ; M_COLOR 0FH ; Aggiunge il resto della DIVISIONE M_msgN Testo05 ; POP AX ; M_BytAsc AH,0EH ; CALL Fase3__ JMP xxx01 ;/---------------------------------------------------------------------------\ ;| SERVIZIO INTERNO: ServNew (********** NB: NON E' UNA PROCEDURA *********) | ;| DESCRIZIONE : Rientro in caso di richiesta di Nuova sessione di calcolo:| ;| pulisce il campo del messaggio di "SCAMBIO", il campo del| ;| risultato e il campo del tipo di operazione aritmetica. | ;\---------------------------------------------------------------------------/ ServNew: M_msgC Testo03,05,30,0FH M_msgC Testo03,08,20,0FH M_msgN Testo03 M_msgC Testo03,10,15,0FH M_msgN Testo03 M_msgC Testo07,02,32,0FH M_msgC Testo08,03,32,0FH MOV CS:[No_DIV],0FFH; se [No_DIV]=0FFH la divisione si pu• fare JMP xxx00 EsA032 ENDP ; Chiusura della Procedura MainProgram _prog ENDS ; Chiusura del Segmento di CODICE END INIZIO ; Indirizzo dell'ultima istruzione da compilare