ciao a tutti... studio ingegneria informatica e mi sono ritrovato in questi periodi a dover fare combattimenti mortali contro assembler!!! Poiché ho un sacco di cose da fare e la logica assembler è un po' più complicata del buon vecchio C allora volevo chiedere un aiuto a chi se ne intende più di me... Veniamo al dunque

Programma che converte 2 numeri A e B inseriti da tastiera compresi tra 0 e 255 e stampa in formato decimale e binario in numeri simmetrici compresi tra A e B

io ho iniziato a buttare giù un po' di codice e sono riuscito a fare la conversione in binario, in simmetrico solo di un numero e non ho idea di come fare il cuore del programma ovvero trovare i simmetrici e convertirli.

vi allego il codice che ho già fatto... chi mi vorrà aiutare sarà ben voluto



codice:
;DEFINIZIONE COSTANTI
PAGINA                  EQU 00h
HT                      EQU 09h
LF                      EQU 0AH
CR                      EQU 0DH
;
BIOS_VIDEO              EQU 10H
SET_VIDEO_MODE          EQU 00H
MODO_TESTO              EQU 03H
;
SET_CURSOR              EQU 02H
W_CHR_TTY               EQU 0EH
;
DOS                     EQU 21H
R_KEY_CHR               EQU 01H
PRINT_STRING            EQU 09H
R_KEY_CHR_NE            EQU 07H

DSEG                    SEGMENT PARA PUBLIC 'DATA'
TITOLO                  DB      'CORSO DI CALCOLATORI ELETTRONICI$'
ISTRUZIONI              DB      CR,HT,HT,HT,HT,HT,CR,'premere il tasto A e in seguito il tasto B: $'
BIN_MESS                DB      CR,LF,HT,HT,'rappresentazione binaria: $'
DEC_MESS                DB      CR,LF,HT,HT,'rappresentazione decimale: $'
TERMINE                 DB      CR,LF,LF,HT,'un altra iterazione? [S/N]$'
CODICE_TASTO1           DB      ?
CODICE_TASTO2		    DB	    ?
DSEG                    ENDS

STACKM                  SEGMENT PARA STACK 'STACK'
                        DB      64 DUP('12345678')
STACKM                  ENDS

                        ASSUME  CS:CSEG,DS:DSEG,SS:STACKM
CSEG                    SEGMENT PARA PUBLIC 'CODE'

;CORPO PRINCIPALE DEL PROGRAMMA

MAIN                    PROC  FAR
                        PUSH  DS
                        MOV   AX,00H
                        PUSH  AX
                        CALL  INIZIALIZZAZIONE
CICLO_PRINCIPALE:       CALL  PROMPT
                        CALL  LETTURA_DATI1
						CALL  LETTURA_DATI2
						MOV   DX,OFFSET BIN_MESS
						CALL  STAMPA_STRINGA
						MOV   DL,[CODICE_TASTO1]
						CALL  STAMPA_BIN
						MOV   DX,OFFSET BIN_MESS
						CALL  STAMPA_STRINGA
						MOV   DL,[CODICE_TASTO2]
						CALL  STAMPA_BIN
						MOV   AL,[CODICE_TASTO1]
						CALL  STAMPA_DEC
						MOV   AL,[CODICE_TASTO2]
						CALL  STAMPA_DEC
						CALL  TEST_FINALE
						JNZ   CICLO_PRINCIPALE
						RET
MAIN					ENDP

;PROCEDURA DI INIZIALIZZAZIONE

INIZIALIZZAZIONE        PROC  NEAR
                        MOV   AX,DSEG
                        MOV   DS,AX
                        MOV   AH,SET_VIDEO_MODE
                        MOV   AL,MODO_TESTO
                        INT   BIOS_VIDEO
                        MOV   DX,0315H
                        CALL  SPOSTA_CURSORE
                        MOV   DX,OFFSET TITOLO
                        CALL  STAMPA_STRINGA
                        MOV   DX,0400H
                        CALL  SPOSTA_CURSORE
                        RET
INIZIALIZZAZIONE        ENDP

;PROCEDURA PER STAMPARE IL MESSAGGIO INIZIALE

PROMPT                  PROC         NEAR
                        MOV          DX,OFFSET ISTRUZIONI
                        CALL         STAMPA_STRINGA
                        RET
PROMPT                  ENDP

;PROCEDURA PER STAMPARE UN NUMERO IN FORMATO BINARIO

STAMPA_BIN	        	PROC     NEAR
				        CMP	     DL,'0'
					    JB	     SOTTOB
					    CMP	     DL,'9'
						JA	     SOTTOB
						SUB	     DL,'0'
SOTTOB:                 MOV      DH,08H
CICLO_BINARIO :         XOR      AL,AL
                        SHL      DL,01H
                        ADC      AL,AL
                        CALL     STAMPA_NUMERO
                        DEC      DH
                        JNZ      CICLO_BINARIO
                        RET
STAMPA_BIN              ENDP


;PROCEDURA PER STAMPARE UN NUMERO IN FORMATO DECIMALE

STAMPA_DEC              PROC     NEAR
                        MOV      DX,OFFSET DEC_MESS
                        CALL     STAMPA_STRINGA
                        MOV      CH,10
                        XOR      CL,CL

MEMODEC:                XOR      AH,AH
                        IDIV     CH
                        PUSH     AX
                        INC      CL
                        CMP      AL,0
                        JNZ      MEMODEC

                        XOR      CH,CH
STAMPADEC:              POP      AX
                        MOV      AL,AH
                        CALL     STAMPA_NUMERO
                        LOOP     STAMPADEC

                        RET
STAMPA_DEC              ENDP

;PROCEDURA PER DETERMINARE SE OCCORRE UN'ALTRA ITERAZIONE

TEST_FINALE             PROC        NEAR
                        MOV         DX,OFFSET TERMINE
                        CALL        STAMPA_STRINGA
                        CALL        LETTURA_SN
                        CMP         AL,'n'
                        RET
TEST_FINALE             ENDP

;PROCEDURE DI BASSO LIVELLO DI INTERFACCIA

;PROCEDUREA PER STAMPARE UN NUMERO DA 0 A 9

STAMPA_NUMERO           PROC    NEAR
                        ADD     AL,'0'
                        MOV     AH,W_CHR_TTY
                        INT     BIOS_VIDEO
                        RET
STAMPA_NUMERO           ENDP

;PROCEDURA PER LEGGERE DA TASTIERA S O N

LETTURA_SN              PROC    NEAR
NUOVA_LETTURA:          MOV     AH,R_KEY_CHR_NE
                        INT     DOS
                        OR      AL,00100000B
                        CMP     AL,'n'
                        JZ      FINE_LETTURA
                        CMP     AL,'s'
                        JNZ     NUOVA_LETTURA
FINE_LETTURA:           RET
LETTURA_SN              ENDP

;PROCEDURA PER SPOSTARE IL CURSORE

SPOSTA_CURSORE          PROC      NEAR
                        MOV       BH,PAGINA
                        MOV       AH,SET_CURSOR
                        INT       BIOS_VIDEO
                        RET
SPOSTA_CURSORE          ENDP

;PROCEDURA PER LEGGERE UN TASTO E MEMORIZZARLO IN CODICE_TASTO1

LETTURA_DATI1           PROC    NEAR
                        MOV     AH,R_KEY_CHR
                        INT     DOS
                        MOV     [CODICE_TASTO1],AL
                        RET
LETTURA_DATI1           ENDP

;PROCEDURA PER LEGGERE UN TASTO E MEMORIZZARLO IN CODICE_TASTO2

LETTURA_DATI2           PROC    NEAR
                        MOV     AH,R_KEY_CHR
                        INT     DOS
                        MOV     [CODICE_TASTO2],AL
                        RET
LETTURA_DATI2           ENDP


;PROCEDURA PER STAMPARE UNA STRINGA

STAMPA_STRINGA          PROC       NEAR
                        MOV        AH,PRINT_STRING
                        INT        DOS
                        RET
STAMPA_STRINGA          ENDP

CSEG                    ENDS
                        END     MAIN