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:
- MVI B 75 mueve 75 números decimales al registro B
- 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
- MVI D 00 mueve el número 00 al registro d
- MOV A, B mueve el contenido del registro B al registro A (acumulador)
- RRC gira el contenido de A (que es 75 con el equivalente binario 01110101) a la derecha
- JNC 200C salta a la dirección 200C y realiza las instrucciones escritas allí si la bandera de acarreo no es cero
- INR D aumenta el valor del registro D añadiendo uno a su contenido
- DCR C disminuye el valor del registro C restando uno de su contenido
- JNZ 2007 salta a la dirección 2007 y realiza las instrucciones escritas allí si las banderas cero no son cero
- MOV A, D mueve el contenido del registro B al registro A
- STA 3050 almacena el contenido de A en la ubicación de memoria 3050
- 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. |