Problema: Escriba un programa en lenguaje ensamblador en un microprocesador 8085 para encontrar la suma de los dígitos de un número de 8 bits.
Ejemplo:
Suposiciones: Las direcciones de datos de entrada y datos de salida son 2050 y 3050 respectivamente.
Algoritmo:
- Cargue el valor almacenado en la ubicación de memoria 2050 en el acumulador A
- Mueva el valor del acumulador A en el registro B al proceso 43H.
- Realice el enmascaramiento de nibbles, es decir, realice la operación AND del acumulador A con OF con la ayuda de la instrucción ANI (Modo de direccionamiento inmediato con AND). Obtendremos un valor de nibble más bajo en el acumulador A. Debido a 0F, Higher Nibble se enmascarará y se obtendrá un nibble más bajo tal como está.
- Mueva el valor del acumulador A en el registro C, porque actualmente, el valor del acumulador es el valor de un nibble inferior, por lo que [C] = Valor de nibble inferior = 3H
- Mueva el valor del registro B en el acumulador A, debido a que el valor del acumulador se actualiza, por lo tanto, moveremos nuevamente el valor de B al acumulador.
- Invierta el número que está almacenado en el acumulador A utilizando la instrucción RLC 4 veces y vuelva a enmascarar los nibbles como se hizo en el paso 3.
- Suma el valor del registro C en el acumulador A
- Almacene el valor de A en la ubicación de memoria 3050
(Después de usar 4 veces RLC, revertiremos el número dado porque después de 4 veces, 4 bits se moverán hacia la izquierda y nuevamente se rotarán de MSB a LSB y viceversa, por lo tanto, obtendremos el número invertido, y después de usar ANI 0F , obtendremos valores de nibble más bajos en ambos casos. Por lo tanto, después de agregar estos 2 valores usando la instrucción ADD C, obtenemos una suma de dígitos en un número dado).
Programa –
Explicación: Registros usados A, B, C
- LDA 2050: carga el contenido de la ubicación de memoria 2050 en el acumulador A
- MOV B, A: mueve el valor del acumulador A en el registro B
- ANI 0F: realiza la operación AND en valor del acumulador A y 0F
- MOV C, A: mueve el valor del acumulador A en el registro C
- MOV A, B: mueve el valor del registro B en el acumulador A
- RLC: la instrucción rota el valor del acumulador A, 1 bit a la izquierda. Dado que se realiza 4 veces, esto invertirá el número, es decir, intercambiará el nibble de orden inferior con un nibble de orden superior.
- Repita el paso 3
- ADD C: Suma el contenido del registro de C en el acumulador A
- STA 3050: Almacena el valor de A en 3050
- HLT: detiene la ejecución del programa y detiene cualquier ejecución adicional
INSTRUCCIÓN ADICIONAL: Esta tarea se puede realizar de una 2ª forma utilizando la instrucción RRC 4 veces.
LDA 2050
AÑO 0F
MOV C, A
MOV A, B
CRR
RRC //4 RRC hacen el mismo trabajo que 4 RLC. Entonces podemos usar cualquiera alternativamente.
CRR
CRR
AÑO 0F
AÑADIR C
STA 3050
HLT
FINAL
Example : 16H in Binary Written as : 0001 0110 RLC 1st Time : 0010 1100 {Carry Flag = 0} RLC 2nd Time : 0101 1000 {Carry Flag = 0} RLC 3rd Time : 1011 0000 {Carry Flag = 0} RLC 4th Time : 0110 0001 { Carry Flag = 1} Converted Number after 4th RLC : 0110 0001 [61H] Hence our number is reversed from 16H to 61H. For Example : 16H in Binary Written as : 0001 0110 RRC 1st Time : 0000 1011 {Carry Flag = 0} RRC 2nd Time : 1000 0101 {Carry Flag = 1} RRC 3rd Time : 1100 0010 { Carry Flag = 1} RRC 4th Time : 0110 0001 { Carry Flag = 0} Converted Number after 4th RRC : 0110 0001 [61H] Hence our number is reversed from 16H to 61H. Hence Instead of 4 RLC, we can also use 4 RRC instructions in our code and accordingly AND them with 0F in the same way as above.
Publicación traducida automáticamente
Artículo escrito por AmishTandon y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA