PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (giugno 2005) SUBTTL ** TUTORIAL ASSEMBLY -- www.giobe2000.it -- by ing. Giorgio OBER ;/---------------------------------------------------------------------------\ ;| NOME : AT_Test1.ASM /--------------------------------------------\| ;| AUTORE : Giorgio OBER | ************ *********** ************** || ;| VERSIONE : giugno 2005 \--------------------------------------------/| ;| DESCRIZIONE : Questo progetto, dotato di Desktop di presentazione e di| ;| menu interattivi, decodifica e mette a video 9 messaggi SMS| ;| catturati in precedenza dalla memoria di un Telefono| ;| Cellulare con l'aiuto di Comandi, AT+CMGR=. | ;| Si tratta di uno strumento per svelare i segreti del| ;| Protocol Data Unit (PDU), lo standard utilizzato per | ;| trasmettere e ricevere SMS, alternativo al formato Testo,| ;| usato molto pi raramente. | ;| Questa versione si limita a decodificare in blocco tutti e 9| ;| i messaggi e mostrali insieme in un'unica schermata. | ;| La versione AT_Test2 opera sostanzialmente lo stesso| ;| servizio, organizzando per in riquadri dedicati le| ;| informazioni trovate nella stringa PDU di ciascuno dei 9| ;| messaggi SMS, come far il progetto finale, AT1_Srvr. | ;\---------------------------------------------------------------------------/ ; MACRO UTILIZZATE DAL PROGRAMMA: include c:\arch-lab\bin\GIOBE.MAC ; 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 BIOchr1:NEAR EXTRN RIEMPI:NEAR EXTRN BIOSmsg:NEAR EXTRN STAsp:NEAR EXTRN BIOScls:NEAR EXTRN SET_cur:NEAR EXTRN VIA_cur:NEAR EXTRN RIP_cur:NEAR EXTRN RAMcur:NEAR EXTRN KEYwait:NEAR EXTRN Wor2Dec:NEAR ; DICHIARAZIONI (VARIABILI) PER I PROGRAMMI ESTERNI: PUBLIC ATTRIB ;Attributo di colore ; DICHIARAZIONI (PROCEDURE) PER I PROGRAMMI ESTERNI: PUBLIC AT_Test1 ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP AT_Test1 ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ;/---------------------------------------------------------------------------\ ;|Come gi sottolineato le stringhe PDU dei 9 messaggi sono state acquisite| ;|in precedenza con altri mezzi, dalla memoria del telefono e rese| ;|disponibili in questo sorgente ASM per il collaudo della PROCEDURA AT_Chk.| ;\---------------------------------------------------------------------------/ ;/-------------------------------------------------------------------\ ;| 00390461987645 | ;| 11/03/2005 | ;| 17:35:52 | ;| 15 | ;| "aliceadsl.it #B" | ;\-------------------------------------------------------------------/ msg00 DB "079193338528520000" DB "0E8500934016896754" DB "3900" DB "503011" DB "715325" DB "40" DB "0F61767A5C0E93E76C579A0E1A0901" ;--------------------------------------------------------------------- ;/-------------------------------------------------------------------\ ;| 00390461987645 | ;| 11/03/2005 | ;| 17:38:43 | ;| 65 | ;| "aliceadsl.it #B#M0#N0#R1060072011155#K1230#L144#S Prova Finale "| ;\-------------------------------------------------------------------/ msg01 DB "079193338528520000" DB "0E8500934016896754" DB "3900" DB "503011" DB "718334" DB "40" DB "4161767A5C0E93E76C579A0E1A09474D" DB "D8C8091B4963301B0C7693C162B158AD" DB "365AC66433D88819A3D146531054FEB6" DB "8741C6B43BCC2E834020" ;--------------------------------------------------------------------- ;/-------------------------------------------------------------------\ ;| 00390461987645 | ;| 11/03/2005 | ;| 17:40:30 | ;| 17 | ;| "aliceadsl.it #t02" | ;\-------------------------------------------------------------------/ msg02 DB "079193338528520004" DB "0E8500934016896754" DB "3900" DB "503011" DB "710403" DB "40" DB "1161767A5C0E93E76C579A0E1AD16132" ;--------------------------------------------------------------------- ;/-------------------------------------------------------------------\ ;| 00390461987645 | ;| 11/03/2005 | ;| 17:36:25 | ;| 21 | ;| "aliceadsl.it #B#M0#N0" | ;\-------------------------------------------------------------------/ msg03 DB "079193338528040004" DB "0E8500934016896754" DB "3900" DB "503011" DB "716352" DB "40" DB "1561767A5C0E93E76C579A0E1A09474D" DB "D8C80903" ;--------------------------------------------------------------------- ;/-------------------------------------------------------------------\ ;| 00390461987645 | ;| 11/03/2005 | ;| 17:37:37 | ;| 28 | ;| "aliceadsl.it #R1060072011155" | ;\-------------------------------------------------------------------/ msg04 DB "079193338518590000" DB "0E8500934016896754" DB "3900" DB "503011" DB "717373" DB "40" DB "1C61767A5C0E93E76C579A0E1A496330" DB "1B0C7693C162B158AD06" ;--------------------------------------------------------------------- ;/-------------------------------------------------------------------\ ;| 00390461987645 | ;| 11/03/2005 | ;| 17:39:59 | ;| 17 | ;| "aliceadsl.it #t01" | ;\-------------------------------------------------------------------/ msg05 DB "079193338518590004" DB "0E8500934016896754" DB "3900" DB "503011" DB "719395" DB "40" DB "1161767A5C0E93E76C579A0E1AD16131" ;--------------------------------------------------------------------- ;/-------------------------------------------------------------------\ ;| 00390461987645 | ;| 11/03/2005 | ;| 17:38:19 | ;| 57 | ;| "aliceadsl.it #R1060072011155#K1230#L144#S Prova Finale " | ;\-------------------------------------------------------------------/ msg06 DB "079193338528020004" DB "0E8500934016896754" DB "3900" DB "503011" DB "718391" DB "40" DB "3961767A5C0E93E76C579A0E1A496330" DB "1B0C7693C162B158AD365AC66433D88819A3" DB "D146531054FEB68741C6B43BCC2E834020" ;--------------------------------------------------------------------- ;/-------------------------------------------------------------------\ ;| 00390461987645 | ;| 11/03/2005 | ;| 17:43:06 | ;| 91 | ;| "aliceadsl.it #o55#h#oaa#h#o00#h#off#h#o01#h#o02#h#o04#h#o08#h | ;| #o10#h#o20#h#o40#h#o80#h#o00#h"| ;\-------------------------------------------------------------------/ msg07 DB "079193338528530004" DB "0E8500934016896754" DB "3900" DB "503011" DB "713460" DB "40" DB "5B61767A5C0E93E76C579A0E1ABD6BB5" DB "117AF40E8747E8D11B061BA1476FB379841E" DB "BD61B1117AF486C946E8D11B461BA1476F18" DB "6E841EBD63B0117AF496C146E8D19B061BA1" DB "476F1C6C841EBD61B0111A" ;--------------------------------------------------------------------- ;/-------------------------------------------------------------------\ ;| 393331234567 | ;| 11/03/2005 | ;| 18:31:32 | ;| 50 | ;| "#b#m0#n0#r1060072011155#k1230#144#s prova finale ?" | ;\-------------------------------------------------------------------/ msg08 DB "079193432900808904" DB "0C91933313325476" DB "0000" DB "503011" DB "811323" DB "40" DB "3223F1A80D1BB96123790C6683C16E32" DB "582C16ABD546EB986C061BC568B4D11C0497" DB "BFED619039ED0EB3CB2005" ;--------------------------------------------------------------------- ATTRIB DB 00H ;--------------------------------------------------------------------- SMSbyt DB 512 DUP (' ') SMStxt DB 512 DUP (' ') ;--------------------------------------------------------------------- ; ALFABETO del caratteri a 7 bit (default alphabet) ; secondo le specifiche GSM 03.38. AlfaTab DB '@' ; 00H COMMERCIAL AT DB '' ; 01H POUND SIGN DB '$' ; 02H DOLLAR SIGN DB '' ; 03H YEN SIGN DB '' ; 04H LATIN SMALL LETTER E WITH GRAVE DB '' ; 05H LATIN SMALL LETTER E WITH ACUTE DB '' ; 06H LATIN SMALL LETTER U WITH GRAVE DB '' ; 07H LATIN SMALL LETTER I WITH GRAVE DB '' ; 08H LATIN SMALL LETTER O WITH GRAVE DB '' ; 09H LATIN CAPITAL LETTER C WITH CEDILLA DB 0AH ; 0AH LINE FEED DB '' ; 0BH LATIN CAPITAL LETTER O WITH STROKE DB '' ; 0CH LATIN SMALL LETTER O WITH STROKE DB 0DH ; 0DH CARRIAGE RETURN DB '*' ; 0EH LATIN CAPITAL LETTER A WITH RING ABOVE DB '' ; 0FH LATIN SMALL LETTER A WITH RING ABOVE DB '?' ; 10H GREEK CAPITAL LETTER DELTA DB '_' ; 11H LOW LINE _ DB 'F' ; 12H GREEK CAPITAL LETTER PHI DB 'G' ; 13H GREEK CAPITAL LETTER GAMMA DB '?' ; 14H GREEK CAPITAL LETTER LAMBDA DB 'O' ; 15H GREEK CAPITAL LETTER OMEGA DB '?' ; 16H GREEK CAPITAL LETTER PI DB '?' ; 17H GREEK CAPITAL LETTER PSI DB 'S' ; 18H GREEK CAPITAL LETTER SIGMA DB 'T' ; 19H GREEK CAPITAL LETTER THETA DB '?' ; 1AH GREEK CAPITAL LETTER XI DB 1BH ; 1BH ESCAPE TO EXTENSION TABLE DB '' ; 1CH LATIN CAPITAL LETTER AE DB '' ; 1DH LATIN SMALL LETTER AE DB '' ; 1EH LATIN SMALL LETTER SHARP S (German) DB '' ; 1FH LATIN CAPITAL LETTER E WITH ACUTE DB ' ' ; 20H SPACE DB '!' ; 21H EXCLAMATION MARK DB '"' ; 22H QUOTATION MARK DB '#' ; 23H NUMBER SIGN DB '' ; 24H CURRENCY SIGN DB '%' ; 25H PERCENT SIGN DB '&' ; 26H AMPERSAND DB 27H ; 27H APOSTROPHE ' DB '(' ; 28H LEFT PARENTHESIS DB ')' ; 29H RIGHT PARENTHESIS DB '*' ; 2AH ASTERISK DB '+' ; 2BH PLUS SIGN DB ',' ; 2CH COMMA DB '-' ; 2DH HYPHEN-MINUS DB '.' ; 2EH FULL STOP DB '/' ; 2FH SOLIDUS (SLASH) DB '0' ; 30H DIGIT ZERO DB '1' ; 31H DIGIT ONE DB '2' ; 32H DIGIT TWO DB '3' ; 33H DIGIT THREE DB '4' ; 34H DIGIT FOUR DB '5' ; 35H DIGIT FIVE DB '6' ; 36H DIGIT SIX DB '7' ; 37H DIGIT SEVEN DB '8' ; 38H DIGIT EIGHT DB '9' ; 39H DIGIT NINE DB ':' ; 3AH COLON DB ';' ; 3BH SEMICOLON DB '<' ; 3CH LESS-THAN SIGN DB '=' ; 3DH EQUALS SIGN DB '>' ; 3EH GREATER-THAN SIGN DB '?' ; 3FH QUESTION MARK DB '' ; 40H INVERTED EXCLAMATION MARK DB 'A' ; 41H LATIN CAPITAL LETTER A DB 'B' ; 42H LATIN CAPITAL LETTER B DB 'C' ; 43H LATIN CAPITAL LETTER C DB 'D' ; 44H LATIN CAPITAL LETTER D DB 'E' ; 45H LATIN CAPITAL LETTER E DB 'F' ; 46H LATIN CAPITAL LETTER F DB 'G' ; 47H LATIN CAPITAL LETTER G DB 'H' ; 48H LATIN CAPITAL LETTER H DB 'I' ; 49H LATIN CAPITAL LETTER I DB 'J' ; 4AH LATIN CAPITAL LETTER J DB 'K' ; 4BH LATIN CAPITAL LETTER K DB 'L' ; 4CH LATIN CAPITAL LETTER L DB 'M' ; 4DH LATIN CAPITAL LETTER M DB 'N' ; 4EH LATIN CAPITAL LETTER N DB 'O' ; 4FH LATIN CAPITAL LETTER O DB 'P' ; 50H LATIN CAPITAL LETTER P DB 'Q' ; 51H LATIN CAPITAL LETTER Q DB 'R' ; 52H LATIN CAPITAL LETTER R DB 'S' ; 53H LATIN CAPITAL LETTER S DB 'T' ; 54H LATIN CAPITAL LETTER T DB 'U' ; 55H LATIN CAPITAL LETTER U DB 'V' ; 56H LATIN CAPITAL LETTER V DB 'W' ; 57H LATIN CAPITAL LETTER W DB 'X' ; 58H LATIN CAPITAL LETTER X DB 'Y' ; 59H LATIN CAPITAL LETTER Y DB 'Z' ; 5AH LATIN CAPITAL LETTER Z DB '-' ; 5BH LATIN CAPITAL LETTER A WITH DIAERESIS DB '' ; 5CH LATIN CAPITAL LETTER O WITH DIAERESIS DB '' ; 5DH LATIN CAPITAL LETTER N WITH TILDE DB '' ; 5EH LATIN CAPITAL LETTER U WITH DIAERESIS DB '' ; 5FH SECTION SIGN DB '\' ; 60H INVERTED QUESTION MARK DB 'a' ; 61H LATIN SMALL LETTER A DB 'b' ; 62H LATIN SMALL LETTER B DB 'c' ; 63H LATIN SMALL LETTER C DB 'd' ; 64H LATIN SMALL LETTER D DB 'e' ; 65H LATIN SMALL LETTER E DB 'f' ; 66H LATIN SMALL LETTER F DB 'g' ; 67H LATIN SMALL LETTER G DB 'h' ; 68H LATIN SMALL LETTER H DB 'i' ; 69H LATIN SMALL LETTER I DB 'j' ; 6AH LATIN SMALL LETTER J DB 'k' ; 6BH LATIN SMALL LETTER K DB 'l' ; 6CH LATIN SMALL LETTER L DB 'm' ; 6DH LATIN SMALL LETTER M DB 'n' ; 6EH LATIN SMALL LETTER N DB 'o' ; 6FH LATIN SMALL LETTER O DB 'p' ; 70H LATIN SMALL LETTER P DB 'q' ; 71H LATIN SMALL LETTER Q DB 'r' ; 72H LATIN SMALL LETTER R DB 's' ; 73H LATIN SMALL LETTER S DB 't' ; 74H LATIN SMALL LETTER T DB 'u' ; 75H LATIN SMALL LETTER U DB 'v' ; 76H LATIN SMALL LETTER V DB 'w' ; 77H LATIN SMALL LETTER W DB 'x' ; 78H LATIN SMALL LETTER X DB 'y' ; 79H LATIN SMALL LETTER Y DB 'z' ; 7AH LATIN SMALL LETTER Z DB '' ; 7BH LATIN SMALL LETTER A WITH DIAERESIS DB '' ; 7CH LATIN SMALL LETTER O WITH DIAERESIS DB '' ; 7DH LATIN SMALL LETTER N WITH TILDE DB '' ; 7EH LATIN SMALL LETTER U WITH DIAERESIS DB '' ; 7FH LATIN SMALL LETTER A WITH GRAVE ;AREA DESTINATA ALLE PROCEDURE DEL PROGRAMMA ;/---------------------------------------------------------------------------\ ;| PROCEDURA : AT_Chk | ;| DESCRIZIONE : Il compito di questa procedura quello di tradurre e mette-| ;| re a video le principali informazioni nascoste nella stringa| ;| di caratteri di un messaggio SMS, disponibile nel sorgente| ;| ASM in formato PDU (Protocol Description Unit), lo standard| ;| utilizzato da tutti i Telefoni Mobili.La versione AT_SMS del| ;| progetto finale godr dell'esperienza maturata in questo| ;| studio, decodificando al volo i caratteri mentre stanno| ;| arrivando dalla linea seriale. | ;| | ;| La stringa PDU contiene, oltre al testo del messaggio, | ;| anche numerose informazioni relative al mittente, al centro | ;| servizi SMS, alla data e all'ora di ricezione, e cos via.. | ;| E' composta esclusivamente da caratteri ascii alfanumerici | ;| ma la loro interpretazione varia notevolmente in funzione | ;| del contesto. | ;| | ;| NB: in ingresso si aspetta in SI l'indirizzo della stringa | ;| AT di caratteri associati al messaggio, in DH,DL la | ;| riga e la colonna di stampa corrente. | ;| | ;| Per facilitare la comprensione della procedura preso per | ;| esempio il seguente messaggio SMS: | ;| | ;| 0791933385285200 00 0E8500934016896754 39 00 503011 715325 | ;| 400F61767A5C0E93E76C579A0E1A0901 | ;| | ;| La stringa utilizzata quella di un messaggio in ingresso| ;| al Telefonino e composta esclusivamente da caratteri ascii| ;| numerici (da "0" a "9") e letterali (da "A" a "F"), quelli| ;| usati per esprimere i simboli del Sistema di numerazione| ;| esadecimale; in ogni caso bisogna interpretarli a coppie,| ;| dette ottetti, o coppie di semi-ottetti, e la loro interpre-| ;| tazione varia notevolmente in funzione del settore a cui si| ;| riferiscono. | ;\---------------------------------------------------------------------------/ AT_Chk: PUSH DX ; /-------------------------------------------------------------------\ ; | La prima parte della stringa PDU contiene informazioni sul Centro| ; | Servizi (SMSC, Short Message Service Center) che ha gestito il| ; | messaggio SMS. | ; 01 | ڿ 7 coppie di caratteri scambiate | ; | 07 91 93 33 85 28 52 00 >>>> + 39 335 8822500 | ; | N=7 tipo di SCA | ; | La prima coppia di caratteri, la stringa "07", va interpretata| ; | come numero binario a 8 bit espresso in esadecimale: il valore ad| ; | essa corrispondente (07H = 7 decimale) indica la quantit di| ; | ottetti (coppie di caratteri) destinata a documentare il numero| ; | telefonico del Centro Servizi, annunciando di fatto che i| ; | rimanenti caratteri di questo settore saranno 14 (=7 ottetti). | ; | | ; | La seconda coppia di caratteri, la stringa "91", rappresenta essa| ; | pure un numero binario a 8 bit in esadecimale, il cui valore(91H)| ; | indica che il numero telefonico del Centro Servizi espresso in| ; | formato internazionale, cio conterr il prefisso della Nazione a| ; | cui appartiene, per esempio 39 (da intendere +39) per Italia. | ; | | ; | La parte finale del settore si riferisce ai 6 ottetti rimanenti| ; | (uno tra quelli previsti stato consumato per il formato);| ; | ciascuna delle 6 coppie di caratteri,la stringa 93 33 85 28 52 00| ; | va interpretata come coppia di numeri decimali da utilizzare per| ; | scambiandone la posizione rispetto a quella occupata nella strin-| ; | ga di riferimento; rappresenta il numero telefonico del Centro| ; | Servizi che, interpretato in accordo con le regole appena esposte| ; | sar: 39 33 58 82 25 00 cio +39 335 8822500. La stringa analiz-| ; | zata non contiene (nella sua parte finale) il carattere "F";| ; | questo sta ad indicare che il numero telefonico del Centro| ; | Servizi espresso da un numero pari di cifre (semi-ottetti), ma| ; | potrebbe anche non essere cos; per esempio la stringa "93 33 85 | ; | 28 52 F0" sar interpretata come 39 33 58 82 25 0F cio | ; | +39 335 882250, un numero a 11 cifre. | ; | Poich le informazioni contenute in questi bytes non sono utiliz-| ; | zate dal nostro progetto, il codice generato per tenerne conto si| ; | limita a saltare i 16 caratteri ad essi relativi, posizionando il| ; | puntatore sul primo del prossimo settore. | ; \-------------------------------------------------------------------/ CALL Asc2Byt_ ;\Trasforma in byte (in AL) la prima coppia di MOV AH,00H ;|caratteri trovata nella stringa e formatta il MOV CX,AX ;|risultato a 16 bit (in AX = CX) per preparare ;/il contatore dei bytes da saltare ;\Poich ora il contatore tien conto dei bytes ADD CX,CX ;|da saltare ne raddoppia il valore per adattar- ;/lo al n di caratteri corrispondenti ;\Salta i (N)*2 caratteri semplicemente ADD SI,CX ;|spostando in avanti il puntatore SI del ;/carattere corrente ; /-------------------------------------------------------------------\ ; | Il secondo settore della stringa PDU rappresentato da una sola| ; | coppia di caratteri, la stringa "00", da interpretarsi come numero| ; | binario a 8 bit espresso in esadecimale: il valore ad essa corri-| ; | spondente (00H = 0 decimale) un descrittore del tipo di messag-| ; | gio (PDU Type, Protocol Data Unit Type). | ; 02 | 1 coppia di caratteri | ; | 00 | ; | Le informazioni contenute in questo byte sono, in realt, affidate| ; | ai suoi singoli bit e sono legate alle modalit con cui si intende| ; | far gestire talune funzioni legate al messaggio ricevuto o alla| ; | sua tipologia; in particolare il fatto che entrambi i 2 bit meno| ; | significativi siano entrambi nulli(come per altro tutti gli altri)| ; | sta ad indicare che il messaggio sotto test del tipo convenzio-| ; | nale (SMS Deliver); sono comunque irrilevanti ai fini del nostro| ; | progetto e il codice generato per tener conto di questo settore si| ; | limita a saltare i 2 caratteri ad esso relativi, posizionando il| ; | puntatore sul primo del prossimo settore. | ; \-------------------------------------------------------------------/ ;\Salta i 2 caratteri del PDU Type semplicemente ADD SI,2 ;|spostando in avanti il puntatore SI del ;/carattere corrente ; /-------------------------------------------------------------------\ ; | Il terzo settore della stringa PDU contiene informazioni sul| ; | Mittente (OA, Originator Address) del messaggio SMS ed struttu-| ; | ralmente simile al primo. | ; 03 | ڿ 7 coppie di caratteri scambiate| ; | 0E 85 00 93 40 16 89 67 54 >>>> + 00 39 0461 987645 | ; | N=14 tipo di OA | ; | La prima coppia di caratteri, la stringa "0E",va interpretata come| ; | numero binario a 8 bit espresso in esadecimale: il valore ad essa| ; | corrispondente (0EH = 14 decimale) indica il numero di cifre| ; | (semi-ottetti)da cui sar formato il numero telefonico del Mitten-| ; | te (escluse quindi le 2 destinate a documentare il formato); in| ; | questo differisce dalla struttura che descrive le informazioni del| ; | Centro Servizi, nella quale il valore della prima coppia indicava| ; | la quantit di ottetti (coppie di caratteri, compresa quella del| ; | formato) destinata a documentare quel numero telefonico. | ; | | ; | La seconda coppia di caratteri, la stringa "85", rappresenta essa| ; | pure un numero binario a 8 bit in esadecimale, il cui valore (85H)| ; | indica il formato del numero telefonico del Mittente; la struttura| ; | di questo byte indica che il suo Tipo (8xH) sconosciuto e la sua| ; | Categoria (x5H) non documentata; in casi come questi il numero| ; | pu ammette la presenza del prefisso internazionale, come effetti-| ; | vamente rileveremo. | ; | | ; | La parte finale del settore si riferisce ai 14 semi-ottetti annun-| ; | ciati dalla prima coppia, la stringa "0E"; ciascuna delle 7 coppie| ; | di caratteri, la stringa "00 93 40 16 89 67 54", va interpretata| ; | come coppia di numeri decimali da utilizzare per scambiandone la| ; | posizione rispetto a quella occupata nella stringa di riferimento,| ; | e rappresenta il numero telefonico del Mittente che, interpretato| ; | in accordo con le regole appena esposte, sar 00 39 04 61 98 76 45| ; | cio +0039 0461 987645 . La stringa analizzata non contiene (nella| ; | sua parte finale) il carattere "F", essendo il numero telefonico| ; | del Mittente espresso da un numero pari di cifre (appunto 14 semi-| ; | ottetti), ma potrebbe anche non essere cos; per esempio la strin-| ; | ga "00 93 40 16 89 67 F0" sar interpretata come 00 39 04 61 98 76| ; | 0F cio +0039 0461 98760, un numero a 13 cifre; in questo caso la| ; | stringa affifata alla prima coppia sarebbe stata "0D". | ; \-------------------------------------------------------------------/ CALL Asc2Byt_ ;\Trasforma in byte (in AL) la coppia di carat- MOV AH,00H ;|teri trovata in questo punto della stringa e MOV CX,AX ;|formatta il risultato a 16 bit (in AX=CX) per ;/preparare il contatore caratteri da trattare MOV BL,2 ;\Controlla se la stringa contiene il carattere MOV AX,CX ;|"F" nella sua parte finale; in questo caso il DIV BL ;|numero telefonico del Mittente ha un numero PUSH AX ;/dispari di cifre (ottetti) e AH lasciato a 1 ;\Poich ora il contatore tien conto del numero SHR CX,1 ;|effettivo dei caratteri previsti per l'OA, lo ;|divide per 2 per mettersi in condizione di ;/trattarli a coppie INC SI ;\Salta la coppia di caratteri del tipo di "OA" INC SI ;/semplicemente spostando avanti il puntatore M_CURSOR DH,DL ;\ M_COLOR 0FH ;| AT_C0: MOV AL,CS:[SI+1] ;|Messa a video del numero di telefono CALL BIOchr1 ;|dell'utente che ha spedito il "messaggino" MOV AL,CS:[SI] ;| CALL BIOchr1 ;| ADD SI,2 ;| LOOP AT_C0 ;/ POP AX ;\Se la stringa NON contiene il carattere "F" CMP AH,00H ;|nella sua parte finale (numero telefonico del JE AT_C1 ;|Mittente con numero dispari di cifre) la ;/visualizzazione stata operata completamente INC SI ;\Altrimenti salta la "F" che serve per appaiare MOV AL,CS:[SI] ;|i caratteri e mette a video il carattere CALL BIOchr1 ;|rimasto INC SI ;/ ; /-------------------------------------------------------------------\ ; | Il quarto settore della stringa PDU rappresentato da una sola| ; | coppia di caratteri, la stringa "39", da interpretarsi come numero| ; | binario a 8 bit espresso in esadecimale: il valore ad essa corri-| ; | spondente ( 39H = 57 decimale) contiene informazioni sul| ; | Identificatore di Protocollo (PID, Protocol IDentifier). | ; 04 | 1 coppia di caratteri | ; | 39 | ; | Le informazioni contenute in questo byte sono affidate ai suoi| ; | singoli bit e sono legate a possibili operazioni da esercitare sul| ; | messaggio SMS nel momento della ricezione; sono comunque irrile-| ; | vanti ai fini del nostro progetto e il codice generato per tener| ; | conto di questo settore si limita a saltare i 2 caratteri ad esso| ; | relativi, posizionando il puntatore sul primo del prossimo settore| ; \-------------------------------------------------------------------/ ;\Salta i 2 caratteri del PID Protocol Identif. AT_C1: ADD SI,2 ;|spostando in avanti il puntatore SI del ;/carattere corrente ; /-------------------------------------------------------------------\ ; | Il quinto settore della stringa PDU rappresentato da una sola| ; | coppia di caratteri, la stringa "00", da interpretarsi come numero| ; | binario a 8 bit espresso in esadecimale: il valore ad essa corri-| ; | spondente (00H = 0 decimale) contiene informazioni sulle modalit| ; | utilizzate per la Codifica del testo (DCS, Data Coding Scheme) del| ; | messaggio SMS. | ; 05 | 1 coppia di caratteri | ; | 00 | ; | Le informazioni contenute in questo byte sono affidate ai suoi| ; | singoli bit e forniscono indicazioni sulle tecniche utilizzate per| ; | l'eventuale codifica e compressione del testo inserito nell'ultimo| ; | settore della stringa PDU e sul l'alfabeto utilizzato per comporlo| ; | Il valore rilevato nel nostro esempio (00H) indica che il testo| ; | non compresso ed codificato con alfabeto standard, a 7 bit. | ; | | ; | In ogni caso le informazioni contenute in questo byte sono irrile-| ; | vanti ai fini del nostro progetto e il codice generato per tener| ; | conto di questo settore si limita a saltare i 2 caratteri ad esso| ; | relativi, posizionando il puntatore sul primo del prossimo settore| ; \-------------------------------------------------------------------/ ;\Salta i 2 caratteri del Data Coding Scheme, ADD SI,2 ;|spostando in avanti il puntatore SI del ;/carattere corrente ; /-------------------------------------------------------------------\ ; | Il sesto settore della stringa PDU contiene informazioni sul tempo| ; | (SCTS, Service Center Time Stamp) in cui il messaggio SMS stato| ; | inviato dal Centro Servizi al nostro Telefonino. | ; 06 | 3 coppie di caratteri scambiate | ; | 50 30 11 >>>> 05/03/11 >>> 2005 marzo 11 >>> 11/03/05 | ; | 503011 715325 40 | ; | La prima parte del settore, costituita da 3 coppie di caratteri,la| ; | stringa "50 30 11", va interpretata come coppia di numeri decimali| ; | (semi-ottetti) da utilizzare per scambiandone la posizione| ; | rispetto a quella occupata nella stringa di riferimento;rappresen-| ; | ta la data nel formato "anno, mese, giorno" che, interpretato in | ; | accordo con le regole appena esposte, sar: 05 03 11 cio 11/03/05| ; | 11 marzo 2005. | ; | 3 coppie di caratteri scambiate | ; | 71 53 25 >>>> 17:35:52 >>> ore 17, minuti 35, secondi 52| ; | Anche la seconda parte del settore costituita da 3 coppie di| ; | caratteri, la stringa "71 53 25", e va interpretata come coppia di| ; | numeri decimali (semi-ottetti) da utilizzare per scambiandone la| ; | posizione rispetto a quella occupata nella stringa di riferimento;| ; | rappresenta l'ora nel formato "ore,minuti,secondi" che, interpre-| ; | tato in accordo con le regole appena esposte, sar: 17 35 52 cio| ; | 17:35:52, 17 ore, 35 minuti e 52 secondi. | ; | 1 coppia di caratteri | ; | 40 time zone, GMT+ | ; | La parte finale del settore costituita da un'ultima coppia di| ; | caratteri, la stringa "40", essa pure da interpretare come coppia| ; | di numeri decimali (semi-ottetti); il valore ad essa relativo, con| ; | il solito scambio di posizione, rappresenta il fuso orario o, pi| ; | esattamente la differenza di tempo (time zone, espressa in inter-| ; | valli di 15 minuti ciascuno) tra l'ora locale e il GMT (Greenwich| ; | Main Time); in accordo con le solite regole appena esposte, il| ; | valore effettivo 04 cio GMT+1, GMT + 1 ora. da notare che,se il| ; | bit pi significativo a 1 il valore indicato negativo. | ; | | ; | Il codice generato per tener conto di questo settore organizza la| ; | visualizzazione dei primi 12 semi-ottetti sotto forma di data e| ; | ora decodificate, limita a saltare gli ultimi 2 caratteri relativi| ; | al time zone, ritenuti non necessari; al termine il puntatore | ; | pronto per localizzare il primo carattere del prossimo settore | ; \-------------------------------------------------------------------/ M_COLOR 0EH ;\ CALL STAsp ;| MOV CX,3 ;| MOV AL,CS:[SI+5] ;| CALL BIOchr1 ;| /----------- Anno MOV AL,CS:[SI+4] ;| | /-------- Mese CALL BIOchr1 ;| | | /----- Giorno MOV AL,'/' ;| 50 30 11 CALL BIOchr1 ;| | | | MOV AL,CS:[SI+3] ;| 05 03 11 > 2005 marzo 11 > 11/03/05 CALL BIOchr1 ;| MOV AL,CS:[SI+2] ;| Stampa la Data CALL BIOchr1 ;| MOV AL,'/' ;| (3 coppie di caratteri scambiate) CALL BIOchr1 ;| MOV AL,'2' ;| CALL BIOchr1 ;| MOV AL,'0' ;| CALL BIOchr1 ;| MOV AL,CS:[SI+1] ;| CALL BIOchr1 ;| MOV AL,CS:[SI] ;| CALL BIOchr1 ;| ADD SI,6 ;/ ;---------------------------------------------------------------------- M_COLOR 0FH ;\ CALL STAsp ;| MOV CX,3 ;| MOV AL,CS:[SI+1] ;| CALL BIOchr1 ;| /----------- Ora MOV AL,CS:[SI] ;| | /-------- Minuti CALL BIOchr1 ;| | | /----- Secondi ADD SI,2 ;| 71 53 25 MOV AL,':' ;| CALL BIOchr1 ;| MOV AL,CS:[SI+1] ;| CALL BIOchr1 ;| MOV AL,CS:[SI] ;| Stampa l'Ora CALL BIOchr1 ;| ADD SI,2 ;| MOV AL,':' ;| (3 coppie di caratteri scambiate) CALL BIOchr1 ;| MOV AL,CS:[SI+1] ;| CALL BIOchr1 ;| MOV AL,CS:[SI] ;| CALL BIOchr1 ;| ADD SI,2 ;/ ;---------------------------------------------------------------------- ;\Salta la coppia di caratteri del fuso orario ADD SI,2 ;|(time zone, GMT+n) semplicemente spostando ;/avanti il puntatore ; /-------------------------------------------------------------------\ ; | Il settimo e ultimo settore della stringa PDU contiene l'unica| ; | parte veramente utile al nostro progetto finale: il testo (UD,User| ; | Data) del messaggio SMS. | ; 07 | ڿ sequenza di | ; | 0F 61 76 7A 5C 0E 93 E7 6C 57 9A 0E 1A 09 01 codici da | ; | N=15 decodificare | ; | La prima coppia di caratteri, la stringa "0F",va interpretata come| ; | numero binario a 8 bit espresso in esadecimale: il valore ad essa| ; | corrispondente (0FH = 15 decimale) indica il numero effettivo dei| ; | caratteri che compongono il messaggio SMS dopo la sua messa in| ; | chiaro, cio non il numero delle coppie di caratteri ad essa| ; | successive, raccolte nella seconda parte di questo settore. Una| ; | rapida indagine sottolinea che le coppie (ottetti) ad essa succes-| ; | sive ("61 76 7A 5C 0E 93 E7 6C 57 9A 0E 1A 09 01") sono 14, una in| ; | meno dei caratteri attesi (0FH=15); basta questo per anticipare la| ; | necessit di intervenire con qualche magica strategia per far| ; | tornare i conti. | ; | | ; | Tra poco sveleremo l'arcano, riassumibile nel fatto che ognuno dei| ; | 15 caratteri del testo in chiaro sar codificato a 7 bit(settetti)| ; | e incluso con orrenda manipolazione dentro le 14 coppie di carat-| ; | teri (ottetti) successive alla prima. | ; | | ; | La seconda parte del settore costituita da 14 coppie di caratte-| ; | ri, la stringa "61 76 7A 5C 0E 93 E7 6C 57 9A 0E 1A 09 01", e va| ; | interpretata come sequenza di numeri binari a 8 bit(bytes=ottetti)| ; | espressi in esadecimale, nel nostro esempio: 61H, 76H, 7AH, ...);| ; | come annunciato il testo in essi nascosto sar codificato utiliz-| ; | zando un alfabeto a 7 bit, per cui sar necessario estrarre dai| ; | 14*8=112 bit disponibili tutti e soli i gruppi di 7 bit,| ; | tralasciando eventuali bit in surplus. | ; \-------------------------------------------------------------------/ ; | La parte iniziale della procedura prepara il contatore CX con il ; 7 - 1 | numero di caratteri attesi nel testo del messaggio e ne mostra il ; | valore CALL Asc2Byt_ ;\Trasforma in byte (in AL) la coppia di carat- MOV AH,00H ;|teri trovata in questo punto della stringa e MOV CH,00H ;|formatta il risultato a 16 bit (in AX) MOV CL,AL ;/Nell'esempio corrente alla fine AX=000FH = 15 PUSH CX ; Salva il Numero di CARATTERI attesi nel SMS ;---------------------------------------------------------------------- M_COLOR 04H ;\ CALL STAsp ;|Mostra il numero di caratteri previsti MOV AX,CX ;|"in chiaro" nel messaggio CALL Wor2Dec ;/ ; | Le 14 coppie di caratteri successive alla prima sono le stringhe ; 7 - 2 | ("61","76", "7A", "5C", "0E", "93", "E7", "6C", "57", "9A", "0E", ; | "1A", "09" e"01") associate ai 14 bytes (ottetti) che nascondono il ; | testo da decifrare; la prima cosa da fare perci tradurle in ; | bytes e renderle disponibili per l'analisi in un piccolo buffer di ; | memoria (SMSbyt) ad esse dedicato ;\Per estrarre le informazioni dai caratteri ;|della stringa opportuno trasformare ciascuna LEA DI,SMSbyt ;|coppia di caratteri ascii esadecimali nel AT_C2: CALL Asc2Byt_ ;|corrispondente byte, salvato nella zona di MOV CS:[DI],AL ;|memoria puntata da SMSbyt; nell'esempio le 15 INC DI ;|coppie "61767A5C0E93E76C579A0E1A0901" + "??" LOOP AT_C2 ;|diventano 15 bytes effettivi: 61H,76H,7AH,5CH, ;/0EH,93H,E7H,6CH,57H,9AH,0EH,1AH,09H,01H,??H ;---------------------------------------------------------------------- POP DX ; Recupera in DX il Numero di CARATTERI nel SMS ; | Nel buffer di memoria SMSbyt ora disponibile la sequenza di 14 ; 7 - 3 | bytes estratti dalle 14 coppie di caratteri successive alla prima; ; | si prepara un secondo buffer di memoria, SMStxt, per infilarci i ; | caratteri a 7 bit (formattati a 8 con l'aggiunta di un bit7 nullo) ; | ricavati dal processo che stiamo per far partire;bisogna predispor- ; | re una struttura in grado di manipolare i bytes in ingresso a grup- ; | pi di 8 alla volta (CH=8) prevedendo comunque la possibilit di ; | porre fine al ciclo di 8 se i caratteri attesi sono in misura non ; | multipla di 8; per separare i bit appartenenti al carattere(settet- ; | to) corrente da quelli da aggiungere in coda al byte successivo ; | ho pensato di formattare il byte corrente (ottetto, disponibile in ; | AL) a 16 bit, in AX, ponendogli davanti 8 bit a 0 (cio con AH=00H) LEA SI,SMSbyt ;\Punta i bytes corrispondenti alle coppie di ;/caratteri ascii del Messaggio corrente LEA DI,SMStxt ; Punta l'area destinata alla stringa in chiaro ;\Predispone il "resto" iniziale da sommare al AT_C3: MOV BH,00H ;|primo byte della sequenza di 8, al fine di ;|garantire l'iterativit dell'algoritmo anche ;/all'inizio (in assenza di "resti" riportati..) MOV CH,8 ;\Prepara il meccanismo per ovviare al diabolico MOV CL,1 ;|sistema di codifica: ogni byte di partenza: AT_C4: ;| 61H 76H ;| 01100001 01110110 MOV AH,00H ;|viene assunto dalla memoria e formattato a 16 MOV AL,CS:[SI] ;|bit, nel registro AX: (Z vale zero) INC SI ;/ AX=ZZZZZZZZ01100001 ZZZZZZZ01110110Z ; | Bastano ora dei semplici scorrimenti dei bit di AX verso sinistra ; 7 - 4 | (SHL) per ottenere entrambe le parti necessarie, ricordando che il ; | numero di shift sar, byte dopo byte, progressivamente sempre pi ; | grande, da 1 a 8; dal codice si capisce che questo numero affida- ; | to a CL, incrementato dopo il trattamento operato su ognuno degli 8 ; | bytes del gruppo. Per ottenere il settetto corrente basta prima ; | imporre uno scorrimento di AL di un posto verso destra (SHR) con ; | ingresso da sinistra di un bit a 0) e poi sommare logicamente (OR) ; | al risultato (copiato in BL) il valore corrente di BH, copia del ; | byte costruito in AH nella manipolazione del byte precedente ( ; | chiaro che durante l'elaborazione del primo byte di ogni gruppo, si ; | dovr comunque garantire l'automatismo ponendo l'ininfluente BH=0) ;\Viene poi spostato verso sinistra di un numero ;|di posizioni pari al suo ordine nella stringa SHL AX,CL ;|(1,2,3,...,8): ;/ AX=ZZZZZZZ01100001Z ZZZZZZ01110110ZZ ;\La parte bassa di AX la base del carattere ;|finale decodificato, AL=BL: MOV BL,AL ;| BL= 1100001Z 110110ZZ ;|Innanzi tutto lo si riformatta a 8 bit facendo ;|entrare uno "0" da sinistra SHR BL,1 ;| BL= Z1100001 Z110110Z ;|ed infine si crea sommandogli logicamente ;|il "resto" ottenuto nel giro precedente; OR BL,BH ;| BH+ ZZZZZZZZ+ ZZZZZZZ0+ ;| BL= 01100001= 01101100= ;| -------- -------- ;| BL= 01100001=61H="a" 01101100=6CH="l" MOV CS:[DI],BL ;|Non rimane che salvarlo nelle locazioni di INC DI ;/Deposito, per essere eventualmente trattato ;\Prima di chiamarlo in causa prepara il "resto" MOV BH,AH ;|per il prossimo byte: ;/ BH= ZZZZZZZ0 ZZZZZZ01 ; | La parte finale della procedura garantisce lo stesso servizio per ; 7 - 5 | tutti e 8 i potenziali bytes del gruppo, a meno che non sia stato ; | raggiunto il numero previsto (DX=0000H); le ultime istruzioni ; | aggiungono il terminatore 00H in coda al testo in chiaro del ; | messaggio SMS, inserito carattere dopo carattere nel secondo buffer ; | SMStxt, per poterlo stampare con la Macro M_msgC. INC CL ;\ DEC DX ;| JZ AT_C5 ;|Controlla i contatori di processo per vedere DEC CH ;|se l'operazione di decodifica stata portata JNZ AT_C4 ;|completamente a termine dec SI ;| JMP AT_C3 ;/ AT_C5: MOV AL,00H ;\Aggiunge il terminatore al testo in chiaro MOV CS:[DI],AL ;/ ; | Trasforma i settetti estratti dalla stringa (formattati a 8 bit) in ; 7 - 6 | modo da corrispondere ai caratteri della Tabella dell'Alfabeto ; | Standard a 7 bit (default alphabet) secondo le specifiche GSM 03.38 LEA BX,AlfaTab ; Punta la Tabella dell'Alfabeto Standard a 7bit LEA SI,SMStxt ; Punta l'area destinata alla stringa in chiaro AT_C6: MOV AL,CS:[SI] ;\Assume il carattere corrente e verifica se si CMP AL,00H ;|tratta del terminatore del testo in chiaro JE AT_C7 ;/ PUSH CS ;\Trasferisce in AL il contenuto di DS:[BX + AL] POP DS ;|Per assicurare il corretto funzionamento anche XLAT ;/della versione EXE necessario copiare CS=DS MOV CS:[SI],AL ;\Sostituisce il carattere trovato con quello INC SI ;/previsto dalla tabella dell'Alfabeto a 7 bit JMP SHORT AT_C6 AT_C7: M_COLOR 0AH ;\ CALL STAsp ;|Stampa la stringa SMS in chiaro M_msgN SMStxt ;/ POP DX RET ; | Ogni dettaglio sulla tecnica di ricostruzione applicata a tutte le ; 7 - 7 | 14 coppie di caratteri previste dalla stringa PDU per ottenere gli ; | effettivi 15 caratteri a 7 bit previsti disponibile sul sito ; | http://www.giobe2000.it ; | La tabella seguente ne mostra una sintesi: ; | /-----\ ; | "61" = 01100001= 0 1100001| | = 1100001 = 61H= "a" ; | "76" = 01110110= 01 1101100 | = 1101100 = 6CH= "l" ; | "7A" = 01111010= 011 1101001 | = 1101001 = 69H= "i" ; | "5C" = 01011100= 0101 1100011 | = 1100011 = 63H= "c" ; | "0E" = 00001110= 00001 1100101 | = 1100101 = 65H= "e" ; | "93" = 10010011= 100100 1100001 | = 1100001 = 61H= "a" ; | "E7" = 11100111= 1110011 1100100| = 1100100 = 64H= "d" ; | 1110011 = 1110011 = 73H= "s" ; | "6C" = 01101100= 0 1101100| | = 1101100 = 6CH= "l" ; | "57" = 01010111= 01 0101110 | = 0101110 = 2EH= "." ; | "9A" = 10011010= 100 1101001 | = 1101001 = 69H= "i" ; | "0E" = 00001110= 0000 1110100 | = 1110100 = 74H= "t" ; | "1A" = 00011010= 00011 0100000 | = 0100000 = 20H= " " ; | "09" = 00001001= 000010 0100011 | = 0100011 = 23H= "#" ; | "01" = 00000001= 0000000 1000010| = 1000010 = 42H= "B" ; | \-----/ ; | Notare come i "resti" davanti a ciascun byte vengano ; | posti in coda ai bytes successivi, costruendo cos ; | l'effettivo carattere del SMS ; | ; | Alla fine il testo del messaggio SMS :"aliceadsl.it #B"; nella sua ; | parte iniziale appare il promo del gestore che lo ha gestito (cosa ; | tipica dei messaggi spediti via internet) seguito da uno spazio e ; | (finalmente) dai 2 caratteri effettivamente digitati sulla tastiera ; | del Telefonino, "#B",un comando del protocollo software che useremo ; | nel progetto finale per il controllo remoto di un PC via telefono. ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Asc2Nib_ [******* Versione dedicata ai programmi AT_ ******]| ;| DESCRIZIONE : Converte il carattere ASCII corrispondente ad uno dei simbo-| ;| li del sistema di numerazione esadecimale (da "0" a "9" e da| ;| "A" a "F"); tale carattere puntato in ingresso da CS:SI ed| ;| trasformato nel valore esadecimale 0xH a otto bit che gli| ;| corrisponde, lasciato in uscita in AL; il puntatore SI viene| ;| incrementato. | ;\---------------------------------------------------------------------------/ Asc2Nib_:MOV AL,CS:[SI] CMP AL,"9" JG Asc_0 CMP AL,"0" JGE Asc_1 Asc_0: AND AL,0DFH CMP AL,"F" JG Asc_2 CMP AL,"A" JB Asc_2 ;------------------ SUB AL,07H Asc_1: SUB AL,30H INC SI RET Asc_2: MOV AL,00H ;Errore: dato non attendibile RET ; sostituito con 00H ;/---------------------------------------------------------------------------\ ;| PROCEDURA : Asc2byt_ [******* Versione dedicata ai programmi AT_ ******]| ;| DESCRIZIONE : Converte la coppia di caratteri ASCII corrispondenti a sim-| ;| boli del sistema di numerazione esadecimale (da "0" a "9" e| ;| da "A" a "F"); tale coppia puntata in ingresso da DS:SI ed| ;| trasformata nel numero esadecimale xyH a otto bit che le| ;| corrisponde, lasciato in uscita in AL; il puntatore SI viene| ;| incrementato di due posizioni. | ;\---------------------------------------------------------------------------/ Asc2Byt_: CALL Asc2Nib_ ;Preleva in AL il valore 0xH MOV AH,AL ;Sposta in AH il valore 0xH SHL AH,1 ;Trasforma in AH il valore nella forma x0H SHL AH,1 ; /---\ /--\ SHL AH,1 ; SHL: |ffC| <-- |AH| <-- 0 SHL AH,1 ; \---/ \--/ CALL Asc2Nib_ ;Preleva in AL il valore 0yH OR AL,AH ;Lascia in AL il valore finale xyH RET ; ;/---------------------------------------------------------------------------\ ;/--------------------------------------------\| AT_Test1 proc NEAR ;| AREA DEDICATA AL MAIN PROGRAM || ;\--------------------------------------------/| ;\---------------------------------------------------------------------------/ CALL BIOScls MOV DH,2 MOV DL,0 LEA SI,msg00 CALL AT_Chk ADD DH,2 LEA SI,msg01 CALL AT_Chk ADD DH,3 LEA SI,msg02 CALL AT_Chk ADD DH,2 LEA SI,msg03 CALL AT_Chk ADD DH,2 LEA SI,msg04 CALL AT_Chk ADD DH,2 LEA SI,msg05 CALL AT_Chk ADD DH,2 LEA SI,msg06 CALL AT_Chk ADD DH,3 LEA SI,msg07 CALL AT_Chk ADD DH,3 LEA SI,msg08 CALL AT_Chk _OUT: CALL KEYwait MOV AH,4CH INT 21H AT_Test1 ENDP _prog ENDS END INIZIO