operaciones aritmeticas en assembler
Por favor es urgente.
Necesito realizar operaciones matematicas con numeros decimales en assembler para pic pues estoy resalizando un brazo mecanico.
Quien me pueda ayudar muchas gracias
Necesito realizar operaciones matematicas con numeros decimales en assembler para pic pues estoy resalizando un brazo mecanico.
Quien me pueda ayudar muchas gracias
exactamente cual necesitas de la operaciones matematicas, para mandartelas, yo hago controles industriales y las uso mucho, pero son demasiadas, dime cual en particular
[email protected]
[email protected]
me olvidaba , que chip usas y muchas algoritmos matematicos las encuentras en las AN de microchip
te envio un programa que hice, el cual realiza operaciones con numeros en forma decimal, espero que te sea de utilidad
MODEL SMALL
.DATA
ERROR DB '...SIGNO DESCONOCIDO, INTENTA DE NUEVO','$'
OPERA1 DB 'INTRODUZCA EL PRIMER OPERADOR: ','$'
OPERA2 DB 'INTRODUZCA EL SEGUNDO OPERADOR: ','$'
OPERAC DB 'OPERACION A REALIZAR: ','$'
ERRDIG DB '...OPERADOR EXEDE DE 4 DIGITOS,INTENTA DE NUEVO','$'
RESULT DB 'RESULTADO: ','$'
MENU DB 10,13,09,'+',10,13,09,'-',10,13,09,'*',10,13,09,'/',10,13,'$'
DIGITOS DB 7,?,7 DUP('$'),'$'
SIGNO DB 3,?,3 DUP('0'),'$'
BASE DW 1
CAMB DW 0
EXCH DW ?
.CODE
CALCULA PROC NEAR
MOV AX,@DATA
MOV DS,AX
CALL CLEAR
PROC1: CALL UBICA1
MOV AH,09H
LEA DX,OPERA1
INT 21H
MOV AH,0AH
LEA DX,DIGITOS
INT 21H
CMP DIGITOS[1],06H
JAE MAL1
CMP DIGITOS[2],2DH
JNE PROC4
MOV SIGNO[2],01H
JMP PROC4
MAL1: CALL UBICA6
MOV AH,09H
LEA DX,ERRDIG
INT 21H
JMP PROC1
PROC4: CALL BINARIO
MOV AX,CAMB
MOV EXCH,AX
PROC2: CALL UBICA2
MOV AH,09H
LEA DX,OPERA2
INT 21H
MOV AH,0AH
LEA DX,DIGITOS
INT 21H
CMP DIGITOS[1],06H
JAE MAL2
CMP DIGITOS[2],2DH
JNE PROC5
MOV SIGNO[3],01H
JMP PROC5
MAL2: CALL UBICA5
MOV AH,09H
LEA DX,ERRDIG
INT 21H
JMP PROC2
PROC5: MOV CAMB,0000H
CALL BINARIO
INIC: CALL UBICA3
MOV AH,09H
LEA DX,OPERAC
INT 21H
CALL SALIDA
MOV AH,02H
MOV DL,AL
INT 21H
MOV SI,0003H
MOV CX,04H
INIC2: CMP AL,MENU[SI]
JE INIC1
ADD SI,0004H
LOOP INIC2
MOV AH,09H
LEA DX,ERROR
INT 21H
JMP INIC
INIC1: CMP AL,2BH
JNE OPERAC1
CMP SIGNO[2],01H
JNE SIGNO1
NEG EXCH
SIGNO1: CMP SIGNO[3],01H
JNE SIGNO2
NEG CAMB
SIGNO2: MOV AX,EXCH
ADD AX,CAMB
JNS SIGNO3
NEG AX
MOV SIGNO[4],01H
JNC SIGNO3
MOV DIGITOS[3],1
SIGNO3: CALL ASCII
CALL RESULTA
JMP FINAL1
OPERAC1: CMP AL,2DH
JNE OPERAC2
CMP SIGNO[2],01H
JNE RE1
NEG EXCH
RE1: CMP SIGNO[3],01H
JNE RE2
NEG CAMB
RE2: MOV AX,EXCH
SUB AX,CAMB
JNS RE3
NEG AX
MOV SIGNO[4],01H
JNC RE3
MOV DIGITOS[3],1
RE3: CALL ASCII
CALL RESULTA
JMP FINAL1
OPERAC2: CMP AL,2AH
JNE OPERAC3
CMP SIGNO[2],01H
JNE SELEC1
MOV SIGNO[4],01H
SELEC1: CMP SIGNO[3],01H
JNE SELEC2
MOV DL,SIGNO[3]
CMP SIGNO[4],DL
JE SELEC3
MOV SIGNO[4],01H
JMP SELEC2
SELEC3: MOV SIGNO[4],00H
SELEC2: MOV AX,EXCH
MUL CAMB
SELEC4: CALL ASCII
CALL RESULTA
JMP FINAL1
OPERAC3: CMP AL,2FH
JNE FINAL1
CMP SIGNO[2],01H
JNE DETER1
MOV SIGNO[4],01H
DETER1: CMP SIGNO[3],01H
JNE DETER2
MOV DL,SIGNO[3]
CMP SIGNO[4],DL
JE DETER3
MOV SIGNO[4],01H
JMP DETER2
DETER3: MOV SIGNO[4],00H
DETER2: MOV AX,EXCH
XOR DX,DX
DIV CAMB
DETER4: CALL ASCII
CALL RESULTA
JMP FINAL1
FINAL1: CALL SALIDA
MOV AX,4C00H
INT 21H
CALCULA ENDP
CLEAR PROC NEAR
MOV AX,0600H
MOV BX,1A00H
MOV CX,0000
MOV DX,184FH
INT 10H
RET
CLEAR ENDP
UBICA1 PROC SUBSYS
MOV AH,02H
MOV BH,00H
MOV DX,0606H
INT 10H
RET
UBICA1 ENDP
UBICA2 PROC SUBSYS
MOV AH,02H
MOV BH,00H
MOV DX,0806H
INT 10H
RET
UBICA2 ENDP
UBICA3 PROC SUBSYS
MOV AH,02H
MOV BH,00H
MOV DX,0A06H
INT 10H
RET
UBICA3 ENDP
UBICA4 PROC SUBSYS
MOV AH,02H
MOV BH,00H
MOV DX,1010H
INT 10H
RET
UBICA4 ENDP
UBICA5 PROC SUBSYS
MOV AH,02H
MOV BH,00H
MOV DX,1106H
INT 10H
RET
UBICA5 ENDP
UBICA6 PROC SUBSYS
MOV AH,02H
MOV BH,00H
MOV DX,1206H
INT 10H
RET
UBICA6 ENDP
BINARIO PROC NEAR
MOV BX,10
MOV CH,00H
MOV CL,DIGITOS[1]
MOV DI,CX
INC DI
CMP DIGITOS[2],2DH
JNE BINA
DEC CX
BINA: MOV AL,DIGITOS[DI]
AND AX,000FH
MUL BASE
ADD CAMB,AX
MOV AX,BASE
MUL BX
MOV BASE,AX
DEC DI
LOOP BINA
MOV BASE,0001H
RET
BINARIO ENDP
ASCII PROC NEAR
MOV CX,06
MOV SI,0002
ASC3: MOV DIGITOS[SI],00H
INC SI
LOOP ASC3
MOV CX,0010
MOV SI,0007
ASC1: CMP AX,CX
JB ASC2
XOR DX,DX
DIV CX
OR DL,30H
MOV DIGITOS[SI],DL
DEC SI
JMP ASC1
ASC2: OR AL,30H
MOV DIGITOS[SI],AL
RET
ASCII ENDP
RESULTA PROC NEAR
CALL UBICA4
MOV AH,09H
LEA DX,RESULT
INT 21H
CMP SIGNO[4],01H
JNE RES1
MOV DIGITOS[2],2DH
RES1: LEA DX,DIGITOS[2]
INT 21H
RET
RESULTA ENDP
SALIDA PROC NEAR
MOV AH,10H
INT 16H
RET
SALIDA ENDP
.STACK
END CALCULA
MODEL SMALL
.DATA
ERROR DB '...SIGNO DESCONOCIDO, INTENTA DE NUEVO','$'
OPERA1 DB 'INTRODUZCA EL PRIMER OPERADOR: ','$'
OPERA2 DB 'INTRODUZCA EL SEGUNDO OPERADOR: ','$'
OPERAC DB 'OPERACION A REALIZAR: ','$'
ERRDIG DB '...OPERADOR EXEDE DE 4 DIGITOS,INTENTA DE NUEVO','$'
RESULT DB 'RESULTADO: ','$'
MENU DB 10,13,09,'+',10,13,09,'-',10,13,09,'*',10,13,09,'/',10,13,'$'
DIGITOS DB 7,?,7 DUP('$'),'$'
SIGNO DB 3,?,3 DUP('0'),'$'
BASE DW 1
CAMB DW 0
EXCH DW ?
.CODE
CALCULA PROC NEAR
MOV AX,@DATA
MOV DS,AX
CALL CLEAR
PROC1: CALL UBICA1
MOV AH,09H
LEA DX,OPERA1
INT 21H
MOV AH,0AH
LEA DX,DIGITOS
INT 21H
CMP DIGITOS[1],06H
JAE MAL1
CMP DIGITOS[2],2DH
JNE PROC4
MOV SIGNO[2],01H
JMP PROC4
MAL1: CALL UBICA6
MOV AH,09H
LEA DX,ERRDIG
INT 21H
JMP PROC1
PROC4: CALL BINARIO
MOV AX,CAMB
MOV EXCH,AX
PROC2: CALL UBICA2
MOV AH,09H
LEA DX,OPERA2
INT 21H
MOV AH,0AH
LEA DX,DIGITOS
INT 21H
CMP DIGITOS[1],06H
JAE MAL2
CMP DIGITOS[2],2DH
JNE PROC5
MOV SIGNO[3],01H
JMP PROC5
MAL2: CALL UBICA5
MOV AH,09H
LEA DX,ERRDIG
INT 21H
JMP PROC2
PROC5: MOV CAMB,0000H
CALL BINARIO
INIC: CALL UBICA3
MOV AH,09H
LEA DX,OPERAC
INT 21H
CALL SALIDA
MOV AH,02H
MOV DL,AL
INT 21H
MOV SI,0003H
MOV CX,04H
INIC2: CMP AL,MENU[SI]
JE INIC1
ADD SI,0004H
LOOP INIC2
MOV AH,09H
LEA DX,ERROR
INT 21H
JMP INIC
INIC1: CMP AL,2BH
JNE OPERAC1
CMP SIGNO[2],01H
JNE SIGNO1
NEG EXCH
SIGNO1: CMP SIGNO[3],01H
JNE SIGNO2
NEG CAMB
SIGNO2: MOV AX,EXCH
ADD AX,CAMB
JNS SIGNO3
NEG AX
MOV SIGNO[4],01H
JNC SIGNO3
MOV DIGITOS[3],1
SIGNO3: CALL ASCII
CALL RESULTA
JMP FINAL1
OPERAC1: CMP AL,2DH
JNE OPERAC2
CMP SIGNO[2],01H
JNE RE1
NEG EXCH
RE1: CMP SIGNO[3],01H
JNE RE2
NEG CAMB
RE2: MOV AX,EXCH
SUB AX,CAMB
JNS RE3
NEG AX
MOV SIGNO[4],01H
JNC RE3
MOV DIGITOS[3],1
RE3: CALL ASCII
CALL RESULTA
JMP FINAL1
OPERAC2: CMP AL,2AH
JNE OPERAC3
CMP SIGNO[2],01H
JNE SELEC1
MOV SIGNO[4],01H
SELEC1: CMP SIGNO[3],01H
JNE SELEC2
MOV DL,SIGNO[3]
CMP SIGNO[4],DL
JE SELEC3
MOV SIGNO[4],01H
JMP SELEC2
SELEC3: MOV SIGNO[4],00H
SELEC2: MOV AX,EXCH
MUL CAMB
SELEC4: CALL ASCII
CALL RESULTA
JMP FINAL1
OPERAC3: CMP AL,2FH
JNE FINAL1
CMP SIGNO[2],01H
JNE DETER1
MOV SIGNO[4],01H
DETER1: CMP SIGNO[3],01H
JNE DETER2
MOV DL,SIGNO[3]
CMP SIGNO[4],DL
JE DETER3
MOV SIGNO[4],01H
JMP DETER2
DETER3: MOV SIGNO[4],00H
DETER2: MOV AX,EXCH
XOR DX,DX
DIV CAMB
DETER4: CALL ASCII
CALL RESULTA
JMP FINAL1
FINAL1: CALL SALIDA
MOV AX,4C00H
INT 21H
CALCULA ENDP
CLEAR PROC NEAR
MOV AX,0600H
MOV BX,1A00H
MOV CX,0000
MOV DX,184FH
INT 10H
RET
CLEAR ENDP
UBICA1 PROC SUBSYS
MOV AH,02H
MOV BH,00H
MOV DX,0606H
INT 10H
RET
UBICA1 ENDP
UBICA2 PROC SUBSYS
MOV AH,02H
MOV BH,00H
MOV DX,0806H
INT 10H
RET
UBICA2 ENDP
UBICA3 PROC SUBSYS
MOV AH,02H
MOV BH,00H
MOV DX,0A06H
INT 10H
RET
UBICA3 ENDP
UBICA4 PROC SUBSYS
MOV AH,02H
MOV BH,00H
MOV DX,1010H
INT 10H
RET
UBICA4 ENDP
UBICA5 PROC SUBSYS
MOV AH,02H
MOV BH,00H
MOV DX,1106H
INT 10H
RET
UBICA5 ENDP
UBICA6 PROC SUBSYS
MOV AH,02H
MOV BH,00H
MOV DX,1206H
INT 10H
RET
UBICA6 ENDP
BINARIO PROC NEAR
MOV BX,10
MOV CH,00H
MOV CL,DIGITOS[1]
MOV DI,CX
INC DI
CMP DIGITOS[2],2DH
JNE BINA
DEC CX
BINA: MOV AL,DIGITOS[DI]
AND AX,000FH
MUL BASE
ADD CAMB,AX
MOV AX,BASE
MUL BX
MOV BASE,AX
DEC DI
LOOP BINA
MOV BASE,0001H
RET
BINARIO ENDP
ASCII PROC NEAR
MOV CX,06
MOV SI,0002
ASC3: MOV DIGITOS[SI],00H
INC SI
LOOP ASC3
MOV CX,0010
MOV SI,0007
ASC1: CMP AX,CX
JB ASC2
XOR DX,DX
DIV CX
OR DL,30H
MOV DIGITOS[SI],DL
DEC SI
JMP ASC1
ASC2: OR AL,30H
MOV DIGITOS[SI],AL
RET
ASCII ENDP
RESULTA PROC NEAR
CALL UBICA4
MOV AH,09H
LEA DX,RESULT
INT 21H
CMP SIGNO[4],01H
JNE RES1
MOV DIGITOS[2],2DH
RES1: LEA DX,DIGITOS[2]
INT 21H
RET
RESULTA ENDP
SALIDA PROC NEAR
MOV AH,10H
INT 16H
RET
SALIDA ENDP
.STACK
END CALCULA
