PDA

Visualizza la versione completa : [Assembly] Help programmino


azidoiam
19-05-2010, 15:54
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 :)




;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

azidoiam
19-05-2010, 23:19
heeeeeeeeeeeeeeeeelp!!!

azidoiam
20-05-2010, 19:44
nessuno conosce assembly in questo forum?

Loading