Ensamblador - matriz entera

   
Vista:

matriz entera

Publicado por Mario (1 intervención) el 13/06/2009 19:00:17
hola este es mi primer post en el foro y estoy empezando en ensamblador, pero pasando a mi pregunta, quiero saber como hacer que un programa me lea numero negativos y numeros positivos y estos numeros almacenarlos en una matriz de 8*8 por ejemplo

-60 -50 10 12 13 5 3 0
45 12 13 10 -10 -5 4 60


y asi sucesivamente hasta completar la matriz. Mi problema no seria mostrar la matriz o un elemento de ella sino convertir lo caracteres leidos por medio de la funcion 10 de la interrupcion 21H a binario y luego leer esos caracteres para luego mostrarlos como caracteres.

Resumiendo quiero leer los numeros y que me los almacene en una matriz de 8*8 y luego mostrarlos digamos la diagonal principal de la matriz pero como estan almacenados como binario porque no quiere que se almacenen como caracter el programa deberia convertirlos primero (en la captura) de caracter a binario y de binario a caracter a la hora de mostrar un valor en especifico.

Adjunto mi codigo para que lo vean.
Aclaro que si bien la matriz tiene 4 elementos, pero primero quiero que me funcione y despues le modifico los tamaños
La macro solo es para impresion y captura de datos asi que no creo que haga falta, mas bien mi problema es de logica... espero que alguien me pueda ayudar. Desde ya gracias

DATA SEGMENT
MSJ1 DB "INGRESAR VALORES: $"
MAT DB 4 DUP(" ")
DB 10,13,"$"
BUF DB 4
DB ?
VALOR DB 4 DUP (0)
VECTLONG DB 64 (0)
TOTAL DW 0
CRLF DB 10,13,"$"
MULT10 DW 1
ENDS DATA

PILA SEGMENT STACK
DB 4 DUP (0)
PILA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
INCLUDE MACRO.MAC

INICIO:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,0
MOV CX,5
LEA SI,MAT
OTRO:

PUSH SI
PUSH CX
IMPRIMIR_CAD MSJ1
CAP_STRING BUF
IMPRIMIR_CAD CRLF
XOR CX,CX ; SE PONE A CERO CX
MOV CL,[BUF+1] ; SE CARGA EN CL LA CANTIDAD DE CARACTERES LEIDOS
LEA SI,VALOR-1 ; DIRECCION DE CARACTERES LEIDOS -1
ADD SI,CX ; MAS CANTIDAD DE CARACTERES ( SE LLEGA AL FINAL DE LOS DATOS INTRODUCIDOS
CALL BINOUT
ADD [TOTAL],DI ; SE SUMA A TOTAL
POP CX
POP SI
MOV [SI],DI
INC SI
LOOP OTRO ; OTRO VALOR
IMPRIMIR_CAD MAT
MOV AX,[TOTAL] ; SE COPIA TOTAL EN AX
LEA SI,MAT+3 ; SE DIRECCIONA FINAL DE AREA DE IMPRESION
CALL WRITE ; SE INVOCA CONVERSION DE BINARIO A CARACTERES

IMPRIMIR_CAD MAT
ESPERA
SALIRSE

;-----------------------------------------------------------
BINOUT PROC
; In : DIRECCION EN SI
; CANTIDAD DE CARACTERES EN CX
; Out: VALOR EN DI
;
; ConvIERTE UN NUMERO DE CARACTERES A BINARIO
;-----------------------------------------------------------------------------
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BX,10 ; POTENCIA DE 10
XOR DI,DI ; VALOR A CERO
MOV MULT10,1 ; MULTIPLICADOR 1, 10, 100, ....

B20:
MOV AL,[SI] ; CAARCTER EN AL
CMP AL,"-" ; SI IGUAL EL VALOR ES NEGATIVO
JE MENOS ; SALIMOS
CMP AL,"+" ; SI IGUAL EL VALOR ES POSITIVO
JE MAS ; SALIMOS

AND AX,000FH ; ANULAMOS LA ZONA DEL DIGITO
MUL MULT10 ; MULTIPLICAMOS POR LA POTENCIA DE 10
;ADD DI,AX ; SUMAMOS AL VALOR
MOV AX,MULT10 ; CORREGIMOS LA POTENCIA
MUL BX ; PARA EL SIGUIENTE DIGITO
MOV MULT10,AX ; POTENCIA CORREGIDA
DEC SI ; DECREMENTAMOS LA DIRECCION PARA
LOOP B20 ; SIGUIENTE DIGITO
JMP MAS ; SE TERMINO SIN SIGNO ES POSITIVO

MENOS:
NEG DI

MAS:

POP DX
POP CX
POP BX
POP AX
RET ; REGRESAMOS
BINOUT ENDP

;-----------------------------------------------------------

;-----------------------------------------------------------
WRITE PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX

MOV CX,10
CMP AX,0
JGE C20
NEG AX
C20:
CMP AX,CX
JB C30
XOR DX,DX
DIV CX
OR DL,30H
MOV [SI],DL
DEC SI
JMP C20
C30:
OR AL,30H
MOV [SI],AL
POP DX
POP CX
POP BX
POP AX
CMP AX,0
JGE SALI
MOV [SI-1], BYTE PTR "-"
SALI:
RET
WRITE ENDP
;-----------------------------------------------------------
CODE ENDS
END INICIO
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder