Problema: todos los bits de un acumulador son 0 excepto un solo bit que es 1. Escriba un programa en lenguaje ensamblador usando 8085 para determinar qué bit del acumulador es 1. El resultado debe ser un número decimal del 1 al 8 y debe ser almacenado en el registro C.
Ejemplos –
Example 1 : Accumulator Content is 10H (Hex) Accumulator Content -> 0 0 0 1 0 0 0 0 Result after execution -> Register C : 5 Example 2 : Accumulator content is 02H (Hex) Accumulator Content -> 0 0 0 0 0 0 1 0 Result after execution -> Register C : 2
Solución:
el problema se puede resolver a través de múltiples métodos. Aquí, se han discutido dos enfoques:
- Sin usar Carry Flag
- Uso de la bandera de transporte
Método 1: Sin usar Carry Flag
Algoritmo –
- Inicializar un contador en forma de registro C
- Cargue un registro B con 01 a AND con acumulador y verifique el bit establecido
- Y el contenido del acumulador con registro B
- Si el resultado de la operación AND es distinto de cero, entonces se obtiene el resultado final
- Si el resultado es cero, incrementa el contador C
- El contenido del acumulador se desplaza a la derecha usando RRC sin afectar la bandera de acarreo
- La búsqueda del siguiente bit se realiza de nuevo.
Programa –
Dirección de inicio del programa -> 3000H
DIRECCIÓN DE MEMORIA | MNEMOTÉCNICA | COMENTARIO |
---|---|---|
3000 | LXI SP, 5000H | Inicializar puntero de pila |
3003 | MVI C, 01H | C <- 01H |
3005 | MVI B, 01H | B <- 01H |
3007 | Ana B. | Y A con B |
3008 | JNZ 3010H | Saltar en el reinicio de cero bandera (Z = 1) a la ubicación 3010H |
300B | INR C | C <- C+1 |
300C | CRR | Gire el acumulador a la derecha sin llevar |
300D | JMP 3007H | Salto incondicional a la ubicación 3007H |
3010 | HLT | Detener ejecución |
Explicación –
- LXI SP, 5000H se usa para inicializar el puntero de la pila en una ubicación más alta de modo que no coincida con el contador del programa
- MVI C, 01H almacena el valor del contador que almacenará el resultado final al final de la ejecución
- MVI B, 01H almacena 01H para registrar B
- ANA B Lógico Y el contenido del registro B con el bit más a la derecha del acumulador para verificar el bit establecido
- JNZ 3010H salta a la instrucción Halt si la operación AND da como resultado un valor distinto de cero; implica que el bit está establecido y se obtiene el resultado final
- INR C incrementa el contador de bits si la operación AND da como resultado un valor cero; lo que implica que la búsqueda del bit establecido debe continuar
- RRC se usa para cambiar el acumulador a la derecha sin afectar la bandera de acarreo
- JMP 3007H salta incondicionalmente para verificar el siguiente bit de acumulador
- HLT detiene la ejecución del flujo del programa
Método 2: usar la bandera de transporte
Algoritmo –
- Inicializar un contador en forma de registro C
- El contenido del acumulador se desplaza a la derecha a través de la bandera de acarreo
- El contador se incrementa
- Si se establece la bandera de acarreo (el bit más a la derecha del acumulador), se obtiene el resultado final
- Si se restablece la bandera de acarreo (CY=0), la iteración continúa para el siguiente bit
Programa –
Dirección de inicio del programa -> 3000H
DIRECCIÓN DE MEMORIA | MNEMOTÉCNICA | COMENTARIO |
---|---|---|
3000 | LXI SP, 5000H | Inicializar puntero de pila |
3003 | MVI C, 00H | C <- 00H |
3005 | RAR | Gire el acumulador a la derecha a través de Carry |
3006 | INR C | C <- C+1 |
3007 | JNC 3005H | Saltar a la ubicación 3005H si CY=0 |
300A | HLT | Detener ejecución |
Explicación –
- LXI SP, 5000H se usa para inicializar el puntero de la pila en una ubicación más alta de modo que no coincida con el contador del programa
- MVI C, 00H almacena el valor del contador que almacenará el resultado final al final de la ejecución
- RAR gira el acumulador hacia la derecha a través de la bandera de acarreo de tal manera que después de la instrucción, la bandera de acarreo contiene el bit más a la derecha del acumulador
- INR C Incrementa el contador
- JNC 3005H salta a la ubicación 3005H si el indicador Carry no está configurado, es decir, el bit más a la derecha del acumulador es 0. No se ejecuta si el indicador Carry está configurado
- HLT detiene la ejecución del flujo del programa
Publicación traducida automáticamente
Artículo escrito por PratikBasu y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA