Programa 8085 para contar el número de unos en el contenido del registro B

Problema: escriba un programa en lenguaje ensamblador para contar el número de unos en el contenido del registro B y almacene el resultado en la ubicación de memoria 3050. 

Ejemplo:

  

Algoritmo:

  • Convierta el número decimal en Acumulador a su equivalente binario.
  • Gira los dígitos del número binario a la derecha sin llevar.
  • Aplique un ciclo hasta que el conteo no sea cero para cambiar los valores del registro D y el conteo.
  • Copie el valor del registro D al acumulador y almacene el resultado.

Programa:

DIRECCIÓN DE MEMORIA MNEMOTÉCNICA COMENTARIOS
2000 MVI B 75 B ← 75
2002 MVI C 08 C ← 75
2004 MVI D 00 D ← 00
2006 MOV A, B A ← B
2007 CRR Girar a la derecha sin llevar
2008 JNC 200C Saltar si no llevar
200B INR D D ← D+1
200C DCR C C ← C-1
200D JNZ 2007 Saltar si no es cero
2010 MOV A, D A ← D
2011 STA 3050 A → 3050
2014 HLT Detiene la ejecución

Explicación:

  1. MVI B 75 mueve 75 números decimales al registro B
  2. MVI C 08 mueve 08 números decimales al registro C, que se toma como contador ya que el número es de 8 bits
  3. MVI D 00 mueve el número 00 al registro d
  4. MOV A, B mueve el contenido del registro B al registro A (acumulador)
  5. RRC gira el contenido de A (que es 75 con el equivalente binario 01110101) a la derecha
  6. JNC 200C salta a la dirección 200C y realiza las instrucciones escritas allí si la bandera de acarreo no es cero
  7. INR D aumenta el valor del registro D añadiendo uno a su contenido
  8. DCR C disminuye el valor del registro C restando uno de su contenido
  9. JNZ 2007 salta a la dirección 2007 y realiza las instrucciones escritas allí si las banderas cero no son cero
  10. MOV A, D mueve el contenido del registro B al registro A
  11. STA 3050 almacena el contenido de A en la ubicación de memoria 3050
  12. HLT detiene la ejecución

Enfoque: 2 [Usando la instrucción de rotación RLC] :

Aquí el algoritmo será el mismo que el anterior, pero aquí estamos moviendo el contenido de los bits del acumulador a 1 bit a la izquierda y luego verificando los valores de la bandera de acarreo y actualizando el registro de conteo en consecuencia.

Si Carry Flag = 1, entonces Count = Count + 1

De lo contrario: gire el acumulador hacia la izquierda nuevamente sin transportarlo y repita el procedimiento anterior.

 

Ambas instrucciones diferentes hacen la misma tarea y el concepto de lograr el objetivo final es el mismo. Solo el estilo giratorio es diferente, pero estos 2 métodos pueden hacer la misma tarea por nosotros.

DIRECCIÓN DE MEMORIA MNEMOTÉCNICA COMENTARIOS
2000 MVI B,75H 75H es el valor que se va a probar para el Número de 1
2002 MVI C,08H C está almacenando 8 debido a los datos de 8 bits que estamos usando y necesitamos rotar el número dado 8 veces, por lo tanto, para el ciclo [C] = 08
2004 MVI D,00H Esta es una variable de contador que se incrementará cuando se encuentre 1
2006 MOV A, B Mueva 75H al Acumulador para fines de rotación porque RLC funcionará solo en el Acumulador.
2007 RLC Gire el acumulador a la izquierda sin llevar
2008 JNC 200C Si Carry Flag = 0, simplemente disminuya el contador y vuelva a iniciar el acumulador rotatorio usando RLC.
200B INR D Si Carry Flag = 1, entonces tenemos que incrementar el registro de contador D = D + 1
200C DCR C Disminuya el valor del registro C porque tenemos que rotar los datos 8 veces debido a los 8 bits. Entonces límite de rotación = 8
200D JNZ 2007 Mientras [C] = 0, esta estructura de bucle se ejecutará desde la ubicación 2007 y seguirá rotando el contenido del acumulador hasta que [C] = 0
2010 MOV A, D Mueva el Contenido del registro D que contiene un número total de 1 en datos dados al Acumulador.
2011 STA 3050 Almacene el contenido del acumulador en la ubicación de memoria 3050H como se indica en la pregunta.
2014 HLT Detener la ejecución del Programa dado.

Publicación traducida automáticamente

Artículo escrito por Sakshi98 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *