Hola soy un estudiante, de ingenieria
informatica de cienfuegos y necesito que me aclaren una duda de ensamblador si esta en
sus posibilidades, la cuestion es la sgte:
Se necesita separar las cifras decimales
de una doble palabra, a un arreglo de byte, lo que tengo hecho es lo sgte
Dato DD
54545H
ARR DB ?,?,?,?,?,?,?,?,?,?
Mov AX, word ptr Dato ; pongo el lsb
en ax
MOv DX, word ptr Dato +2 , pongo el msb en dx
Lo que me
sucede es que no puedo dividir por 10 o por 100 y luego por 1000 por que el cociente y
el resto no me cabrian en ax o dx, mi pregunta es como puedo extraer estas cifras
decimales del numero de doble palabra, saludos al experot y disculpe la molestia;
por favor responder tambien a:
inf200717@ucf.edu.cu
cifras decimales de un DD
Moderador: Junta Directiva
-
- Usuario Desarrollador
- Mensajes: 1082
- Registrado: Mié Jun 07, 2006 11:09 pm
- Nombre: Francisco Javier Sánchez
- Ubicación: Vejer de la Frontera
- Contactar:
Re: cifras decimales de un DD
Muy buenas, en primer lugar darte la bienvenida. En segundo lugar, yo no pondría mi mail así por la buenas en un foro, puede que se te llene de más SPAM el buzón de entrada. Y para concluir esta parte, la gente no va a molestarse en contestarte a tu correo, en cualquier caso contestarán al foro para que sirva a más gente.
Ahora con tu problema, no estaría de más decir con que micro se supone que trabajas, porque ensamblador no es algo universal, sino que depende de cada dispositivo. Por ejemplo, no se si trabajas con un micro de 8,16 o 32 bits, tampoco que instrucciones tiene, etc.
Así te digo que nadie te va a poder ayudar.
Un saludo.
Ahora con tu problema, no estaría de más decir con que micro se supone que trabajas, porque ensamblador no es algo universal, sino que depende de cada dispositivo. Por ejemplo, no se si trabajas con un micro de 8,16 o 32 bits, tampoco que instrucciones tiene, etc.
Así te digo que nadie te va a poder ayudar.
Un saludo.
_ _ _ _ _ _ _ _ _ _
Hack your mind \\ F.J. Sánchez
Okupa tu mente. \\ _ _ _ _ _ _ _ _ _ _ _ _
Hack your mind \\ F.J. Sánchez
Okupa tu mente. \\ _ _ _ _ _ _ _ _ _ _ _ _
-
- Usuario Desarrollador
- Mensajes: 1323
- Registrado: Mié Oct 03, 2007 12:15 am
- Ubicación: Ibiza
Re: cifras decimales de un DD
Por los registros que hace referencia (AX, DX) supongo que se refiere a un micro compatible x86. Aquí tratamos sobre todo microcontroladores, y no tanto microprocesadores, pero quizá haya alguien que controle del tema. Yo hace muuuucho que ya no me acuerdo del ensamblador de los "PC".
-
- Usuario Desarrollador
- Mensajes: 1082
- Registrado: Mié Jun 07, 2006 11:09 pm
- Nombre: Francisco Javier Sánchez
- Ubicación: Vejer de la Frontera
- Contactar:
Re: cifras decimales de un DD
Puff, entonces ni idea... Lo más parecido que yo he usado es el ensamblador del 68000, y de eso hace ya 2 o 3 añitos...
_ _ _ _ _ _ _ _ _ _
Hack your mind \\ F.J. Sánchez
Okupa tu mente. \\ _ _ _ _ _ _ _ _ _ _ _ _
Hack your mind \\ F.J. Sánchez
Okupa tu mente. \\ _ _ _ _ _ _ _ _ _ _ _ _
Re: cifras decimales de un DD
las instrucciones que puedo utilizar es del 80286 y 80386, se pueden utilizar los registros de proposito general como bx, ax, dx, y los indices como si, di, los extendidos tambien como eax, ebx etc, pero el problema no radica en eso y espero no molestarlos, yo se que la programacion en esnamblador depende de la arquitectura de la maquina pero lo que yo pregunto ejemplificado es lo sgte
supongamos que tengo un registro de 16 bits o sea AX y en la parte baja de AX se pone AL y en la parte alta AH que tienen respectivamente 8 bits, si quiero dividir AX por un numero entero decimal lo que hago es usar la instruccion DIV que pone el resultado en AL y el resto en AH pero si cuando voy a dividir el resultado o el resto es mas grande que AL o AH, se genera int 0 una interrupcion. ESto es lo que me pasa cuando voy a extraer las cifras decimales por Ejemplo:
el numero 65 001 decimal que cabe en un registro de 16 bits
si lo divido por 10 para extraerle la cifras de las decenas el resto
es muy grande y no cabe en el registro AL.
Entonces ¿como podria sacarles las cifras decimales a ese numero?
supongamos que tengo un registro de 16 bits o sea AX y en la parte baja de AX se pone AL y en la parte alta AH que tienen respectivamente 8 bits, si quiero dividir AX por un numero entero decimal lo que hago es usar la instruccion DIV que pone el resultado en AL y el resto en AH pero si cuando voy a dividir el resultado o el resto es mas grande que AL o AH, se genera int 0 una interrupcion. ESto es lo que me pasa cuando voy a extraer las cifras decimales por Ejemplo:
el numero 65 001 decimal que cabe en un registro de 16 bits
si lo divido por 10 para extraerle la cifras de las decenas el resto
es muy grande y no cabe en el registro AL.
Entonces ¿como podria sacarles las cifras decimales a ese numero?
Re: cifras decimales de un DD
Buenas,
Puedes hacer lo siguiente, división entera:
Dividendo = 57 decimal = 0011 1001
Divisor = 12 decimal = 0000 1100
El registro que contiene el Divisor lo has de desplazar a la izquierda, es decir multiplicar por 2 hasta que el bit más significativo sea 1. Esto te dará un número de desplazamientos que lo vamos a llamar "k". "C" será el cociente, y Ck cada uno de los bits del cociente.
Luego has de restar al Dividendo el divisor desplazado. Esto puede darte dos resultados:
Si el resultado es negativo el valor binario de Ck es 0.
Si el resultado es positivo el valor binario de Ck es 1. Y se toma el resto de la división como nuevo Dividendo.
Se desplaza a la derecha el divisor anterior para seguir con la siguiente iteración.
Proceso:
Primero.- Multiplicamos el divisor por 2 hasta que el bit más significativo sea 1. Divisor = 0000 1100, al desplazarlo nos quedará 1100 0000 y el valor de k = 4.
Segundo.- Procedemos con la primera resta.
0011 1001
1100 0000
---------------
Resultado negativo, esto implica que C4 = 0
Tercero.- Desplazamos el Divisor y el dividendo sigue siendo el mismo.
0011 1001
0110 0000
---------------
Resultado negativo, esto implica que C3 = 0
Cuarto.- Desplazamos el Divisor y el dividendo sigue siendo el mismo.
0011 1001
0011 0000
--------------
0000 1000 Resultado positivo, esto implica C2 = 1 y el dividendo para la sigiente iteración será 0000 1000.
Quinto.- Desplazamos el Divisor y el dividendo es el resto del anterior ya que el resultado fue positivo.
0000 1000
0001 1000
----------------
Resultado negativo, esto implica C1 = 0.
Sexto.- Desplazamos el Divisor y el dividendo sigue siendo el mismo.
0000 1000
0000 1100
--------------
Resultado negativo, esto implica C0 = 0. Está es la última iteración ya que hemos obtenido el último bit del Cociente.
Cociente = 0000 0100
Si quieres hacerlo con más registros de 8 bits, tan solo tienes que tener en cuenta el bit the carry para realizar las operaciones y el bit que desplazas cuando salga de un regitro en el que se encuentran los bits de mayor peso los has de desplazar a los registros donde se encentran los bits de mayor peso. De esta forma puedes hacer operaciones con 8, 16, 24, 32, etc bits. Si prefieres realiza operaciones con 2 registros de 8 bits manualmente antes de programar el algoritmo.
Espero que te sirva.
Puedes hacer lo siguiente, división entera:
Dividendo = 57 decimal = 0011 1001
Divisor = 12 decimal = 0000 1100
El registro que contiene el Divisor lo has de desplazar a la izquierda, es decir multiplicar por 2 hasta que el bit más significativo sea 1. Esto te dará un número de desplazamientos que lo vamos a llamar "k". "C" será el cociente, y Ck cada uno de los bits del cociente.
Luego has de restar al Dividendo el divisor desplazado. Esto puede darte dos resultados:
Si el resultado es negativo el valor binario de Ck es 0.
Si el resultado es positivo el valor binario de Ck es 1. Y se toma el resto de la división como nuevo Dividendo.
Se desplaza a la derecha el divisor anterior para seguir con la siguiente iteración.
Proceso:
Primero.- Multiplicamos el divisor por 2 hasta que el bit más significativo sea 1. Divisor = 0000 1100, al desplazarlo nos quedará 1100 0000 y el valor de k = 4.
Segundo.- Procedemos con la primera resta.
0011 1001
1100 0000
---------------
Resultado negativo, esto implica que C4 = 0
Tercero.- Desplazamos el Divisor y el dividendo sigue siendo el mismo.
0011 1001
0110 0000
---------------
Resultado negativo, esto implica que C3 = 0
Cuarto.- Desplazamos el Divisor y el dividendo sigue siendo el mismo.
0011 1001
0011 0000
--------------
0000 1000 Resultado positivo, esto implica C2 = 1 y el dividendo para la sigiente iteración será 0000 1000.
Quinto.- Desplazamos el Divisor y el dividendo es el resto del anterior ya que el resultado fue positivo.
0000 1000
0001 1000
----------------
Resultado negativo, esto implica C1 = 0.
Sexto.- Desplazamos el Divisor y el dividendo sigue siendo el mismo.
0000 1000
0000 1100
--------------
Resultado negativo, esto implica C0 = 0. Está es la última iteración ya que hemos obtenido el último bit del Cociente.
Cociente = 0000 0100
Si quieres hacerlo con más registros de 8 bits, tan solo tienes que tener en cuenta el bit the carry para realizar las operaciones y el bit que desplazas cuando salga de un regitro en el que se encuentran los bits de mayor peso los has de desplazar a los registros donde se encentran los bits de mayor peso. De esta forma puedes hacer operaciones con 8, 16, 24, 32, etc bits. Si prefieres realiza operaciones con 2 registros de 8 bits manualmente antes de programar el algoritmo.
Espero que te sirva.
Sytek
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado