Preguntas de programación en sistemas de aplicaciones informáticas
Solución: MOV A, R1
MOV R0, A
(2) El contenido de la unidad RAM externa 20H se envía a R0.
Solución: MOV R0, #20H
MOVX A, @R0
MOV R0, A
(3) RAM externa 20H El contenido de la unidad se envía a la unidad interna RAM 20H.
Solución: MOV R0, #20H
MOVX A, @R0
MOV @R0, A
(4) RAM externa El contenido de la unidad 1000H se envía a la unidad 20H de RAM interna.
Solución: MOV DPTR, #1000H
MOVX A, @DPTR
MOV 20H, A
(5) ROM externa 2000H El contenido de la unidad enviará R0.
Solución: MOV DPTR, #2000H
CLR A
MOVC A, @A DPTR
MOV R0, A
(6) El contenido de la unidad RAM 2000H externa se envía a la unidad RAM 20H interna.
Solución: MOV DPTR, #2000H
CLR A
MOVC A, @A DPTR
MOV 20, A
(7) El contenido de la unidad RAM 2000H externa se envía a la unidad RAM 20H externa.
Solución: MOV DPTR, #2000H
CLR A
MOVC A, @A DPTR
MOV R0, #20H p> p>
MOV @R0, A
2-2 Se sabe que A=7AH, R0=30H, (30H)=A5H, PSW=81H. Pregunte el resultado de ejecutar cada una de las siguientes instrucciones (cada instrucción participa en la operación con los datos especificados en la pregunta).
(1) XCH A, R0 A=30H, R0=7AH, P=0
(2) XCH A, 30H A=A5H, (30H)=7AH, P =0
(3)XCH A,@R0 A=A5H, (30H)=7AH, P=0
(4)XCHD A,@R0 A=75H, ( 30H)=AAH, P=1
(5) SWAPA A=A7H P=1
(6) AÑADIR A, R0 A=AAH Cy=0 OV=1 P= 0
(7)AÑADIR A,30H A=1FH Cy=1 OV=0 P=1
(8)AÑADIR A,#30H A=AAH Cy=0 OV= 1 P=0
(9)ADDC A,30H A=20H Cy=1 OV=1 P=1
(10)SUBB A,30H A=D4H Cy=1 OV=1 P=0
(11)SUBB A,#30H A=49H Cy=0 OV=0 P=1
(12)DA A A=80H Cy=1 P=1
(13)RL A A=F4H Cy=1 P=1
(14)RLC A A=F5H Cy=0 P=0
(15) CJNE A, #30H, 00 A=7AH Cy=0 P=1
(16) CJNE A, #30H, 00 A=7AH Cy=1 P=1
2-3 Supongamos que el contenido de la unidad 30H de la RAM interna es 40H, es decir, (30H) = 40H. También se sabe que (40H) = 10H, (10H) = 00H, puerto P1 = CAH. y pregunte sobre el almacenamiento relevante después de ejecutar las siguientes instrucciones. El contenido de las unidades, registros y puertos del dispositivo (es decir, unidades R0, R1, A, B, P1, 40H, 30H y 10H).
MOV R0, #30H
MOV A, @R0
MOV R1, A
MOV B, @R1
MOV @R1, P1
MOV P2, P1
MOV 10H, #30H
MOV 30H, 10H
Solución: Los resultados después de ejecutar cada instrucción son los siguientes: R0=30H, A=40H, R1=40H, B=10H, (40H)=CAH, P2=CAH, (10H)=20H, (30H) =20H .
A partir de esto podemos conocer el contenido de cada unidad tras su ejecución: R0=30H, R1=40H, A=40H, B=10H, P1=CAH, (40H)=CAH, (30H)= 20H, (10H)=20H.
2-4 Supongamos R0=17H, A=83H, (17H)=34H. Después de ejecutar las siguientes instrucciones, A=?
ANL A, #17H
ORL 17H, A
XRL A, @R0
CPL A
Respuesta: Esta pregunta es para familiarizarse con las instrucciones de operación lógica. Los resultados de ejecución de cada instrucción son los siguientes:
A←83H∧17H=10000011∧00010111=03H
(17H) ←34H∨03H=00110100∨00000011=37H p>
A←03H⊕37H=00000011⊕00110111=34H
A←A=00110100=CBH
Entonces, después de ejecutar el programa, A=CBH
2-5 Intente escribir un programa para almacenar el contenido de tres unidades consecutivas 20H, 21H y 22H en la RAM interna en las unidades 2FH, 2EH y 2DH en secuencia.
Solución: Este problema se puede resolver directamente usando el comando de transferencia:
MOV 2FH, 20H
MOV 2EH, 21H
MOV 2DH, 22H
Por supuesto, también puedes usar un programa de bucle para hacerlo:
MOV R0, #20H primera dirección del área de datos de origen
MOV R1, #2FH; destino Primera dirección del área de datos
MOV R3, #03H; longitud del bloque de datos
BUCLE: MOV A, @R0
MOV @ R1, A
INC R0
DEC R1
DJNZ R2, LOOP
SJMP $
2- 6 Escriba un programa para realizar dos restas de 16 dígitos: 6F5DH-13B4H. Los resultados se almacenan en las unidades 30H y 31H de la RAM interna, y 30H almacena los 8 bits inferiores de la diferencia.
Solución: El procedimiento es el siguiente:
MOV A, #5DH
CLR C
SUBB A, #0B4H p>
MOV 30H, A
MOV A, #6FH
SUBB A, #13H
MOV 31H, A
SJMP $
Dado que en el sistema de instrucciones MCS=51, la instrucción de resta solo puede completar la resta con préstamo, por lo que al comenzar a realizar la resta, el bit de acarreo Cy generalmente debe borrarse a 0.
2-7 Escribir un programa Si el contenido del acumulador A cumple las siguientes condiciones, el programa se transferirá a la unidad de almacenamiento LABEL. Supongamos que A contiene números sin signo.
1. A 10
Solución: este problema se puede resolver directamente utilizando la instrucción de transferencia condicional de comparación. Las declaraciones del programa relevantes son las siguientes:
CJNE A. , #0AH , 00H
JNG LABEL
La instrucción de transferencia condicional de comparación posiciona el valor de Cy según el resultado de A-0AH. Siempre que A sea 10, la resta no. Requiere préstamo, es decir, Cy = 0. Se puede utilizar otra instrucción "JNC" para decidir si se transfiere a LABEL. El desplazamiento 00H significa que la siguiente declaración se ejecutará primero independientemente del resultado después de la comparación.
2. Agt; 10
Solución: Si todavía se compara con 0AH en este momento, es imposible distinguir entre A gt 10 (para transferir) y A=. 10 (no transferible). Por supuesto, se pueden agregar otras instrucciones (como declaraciones de transferencia condicional cero de juicio del acumulador, etc.) para completar las funciones requeridas, pero esto aumentará la cantidad de declaraciones y hará que el programa no sea lo suficientemente conciso. Es mejor comparar directamente con 0BH (número decimal 11). Después de la comparación, A 11 hará Cy = 0, lo que equivale a Agt 10 hará Cy = 0; Aún puedes completar las funciones requeridas con solo dos declaraciones
CJNE A, #0BH, 00H
JNG LABEL
3, A 10
Solución: Esta situación es similar a la pregunta (2) y se puede comparar directamente con 11, pero esta vez la transferencia ocurre cuando Cy=1.
CJNE A, #0BH, 00H
JC LABEL
4.Alt; y simplemente compare 10, similar a la pregunta (1):
CJNE A, #0AH, 00H
JC LABEL
2-8 SP conocido= 25H, PC=2345H, (24H)=12H, (25H)=34H, (26H)=56H. Pregunta: Después de ejecutar la instrucción RET en este momento, SP=? PC=?
Solución: En el sistema MCS-51, la pila crece hacia arriba, por lo que el puntero de la pila debe reducirse durante la operación pop.
El proceso de ejecución de la instrucción RET es el siguiente:
PC15-8 (SP), es decir, PC15-8=(25H)=34H
SP SP-1, es decir, SP=24H
PC7-0 (SP) Es decir, PC7-0=(24H)=12H
SP SP-1 Es decir, SP=23H
El resultado es: SP=23H, PC=3412H
2-9 Si SP=25H, PC=2345H y la dirección de la etiqueta LABEL es 3456H, ¿qué sucede con el puntero de la pila y el contenido de la pila después? el ejecutivo llama a la instrucción LCALL LABEL? ¿A qué es igual el valor de la PC?
Explicación: La instrucción de llamada larga realiza dos funciones: apilar la dirección de la siguiente instrucción en la pila y asignar la dirección de entrada de la subrutina llamada al contador de programas de la PC. El proceso es el siguiente:
PC PC 3 Entonces PC=2345H 3=2348H
SP SP 1 Entonces SP=26H
(SP) PC7-0 Entonces (26H )=48H
SP SP 1 Entonces SP=27H
(SP) PC15-8 Entonces (27H)=23H
PC ETIQUETA Entonces PC =3456H
El resultado debe ser: SP=27H, (26H)=48H, (27H)=23H, PC=3456H.
2-10 ¿Se puede reemplazar directamente la instrucción LCALL en la pregunta anterior por la instrucción ACALL? Si se utiliza la instrucción ACALL, ¿cuál es el rango de direcciones invocables?
Solución: La instrucción ACALL solo se puede llamar dentro del rango de 2K bytes. Específicamente, se requiere que después de la PC 2, los 5 bits superiores de la PC sean los mismos que los 5 bits superiores de la ETIQUETA de la dirección de llamada. En otras palabras, el valor de la PC y la dirección de llamada después de ejecutar ACALL deben estar en la misma página (el rango de direcciones de cada página es de 2K bytes). En esta pregunta:
PC 2=2345 2=2347H, los 5 bits superiores son 00100
Y LABEL=3456H, los 5 bits superiores son 00110
Los dos no son iguales, no están en la misma página, por lo que no pueden ser reemplazados directamente por la instrucción ACALL
Si se usa la instrucción ACALL, el valor mínimo de la dirección invocable es 2000H y el valor máximo es 27FFH. Es decir, la dirección superior de 5 bits permanece sin cambios en 00100 y la dirección inferior de 11 bits puede cambiar de 0 a 1. El rango de direcciones es de 2K bytes.
2-11 Intente escribir un programa para encontrar si hay datos 0AAH en la unidad 20H-50H de la RAM interna. Si lo hay, configure la unidad 51H en 01H; si no se encuentra, configure la unidad 51H en 0.
Solución: Hay dos soluciones básicas a esta pregunta.
Una es calcular primero la longitud del bloque de datos y luego realizar un bucle y comparar. El programa es el siguiente:
CLR C
MOV R0, # 20H es el primero. dirección del bloque de datos
MOV A, #50H dirección final del bloque de datos
SUBB A, R0
INC A
MOV R1, A; R1 Longitud del bloque de datos de almacenamiento
LOOP1: CJNE @R0, #0AAH, LOOP2
MOV 51H, #01H busque la configuración (51H) = 01H
SJMP LOOP3
LOOP2: ING R0
DJNZ R1, LOOP1
MOV 51H, #00H no encontrado, configurado (51H) = 01H
LOOP3: SJMP $
La segunda solución es utilizar directamente la instrucción de transferencia condicional de comparación para determinar si se ha completado la última comparación. Ésta es una de las características del sistema de mando MCS-51. El programa es el siguiente:
MOV R0, #20H; R0 almacena la primera dirección del bloque de datos
LOOP1: CJNE @R0, #0AAH, LOOP2; >
MOV 51H, #01H; encontrado, establecido (51H) = 01H
SJMP LOOP3
LOOP2: ING R0
DJNZ R0, #51H , LOOP1; comparación no completada Luego bucle
MOV 51H, #00H; si no se encuentra, establezca (51H) = 01H
LOOP3: SJMP $
2 -12 Intente escribir un programa y busque la cantidad de veces que aparece 00H en las unidades 20H-50H de la RAM interna, y los resultados de la búsqueda se almacenan en la unidad 51H.
Solución: La solución a este problema es similar a la anterior. Se utiliza la segunda solución. El procedimiento es el siguiente:
MOV R0, #1FH
<. p>MOV R1, # 00H; R1 se usa como contadorLOOP1: ING R0
CJNE @R0, #00H, LOOP2
INC R1; a 00H, el contador aumenta en 1
LOOP2: CJNE @R0, #50H, LOOP1; bucle si la comparación no se completa
MOV 51H, R1; >
SJMP $
2-13 Intente escribir un programa para encontrar el valor absoluto de la diferencia entre los dos números de complemento en la unidad 20H y la unidad 21H, es decir. El resultado queda en A. Si el resultado del cálculo se desborda, configure la unidad 22H en 0FFH; de lo contrario, 22H debería ser 00H.
Solución: puedes usar directamente la instrucción de resta para completar la resta y luego encontrar el valor absoluto según el signo de la diferencia. Si la diferencia es un número positivo, la diferencia es el valor absoluto que tienes. desear. Si la diferencia es un número negativo, entonces suma uno al inverso para obtener el valor absoluto. Por supuesto, después de la resta, primero debes determinar si se desborda.
Si se desborda, simplemente configure el indicador de desbordamiento: make (22H) = 0FFH. El programa es el siguiente:
CLR C
MOV 22H, #0FFH
MOV A, 20H
SUBB A, 21H
JB OV, NEXT
JNB ACC.7, NEXT1; La diferencia es una transferencia regular
CPL A; valor absoluto
ING A
NEXT1: MOV 22H., #00H
NEXT: SJMP $
2-14 Intente escribir un programa para encontrar las unidades 20H, 21H, 22H El valor absoluto de la diferencia entre los números en complemento a tres es, es decir. El resultado queda en A. Si ocurre un desbordamiento en la operación, configure la unidad 23H en 0FFH; de lo contrario, configure la unidad 23H en 00H;
Solución: La solución a este problema es similar a la anterior. Es solo que debes juzgar si se produce un desbordamiento después de cada resta, en lugar de juzgar el desbordamiento después de dos restas. Porque es posible que el desbordamiento haya ocurrido después de la primera resta, pero no haya desbordamiento después de la siguiente resta, y el resultado en este momento es realmente incorrecto. Por ejemplo, 64-(-64)-(-1)=129. El resultado se ha desbordado, pero cuando se calcula en dos pasos, es primero
64-(-64)=01000000-11000000=10000000
En este momento, se ha producido un desbordamiento , OV=1. Si se realiza la segunda resta, el resultado es:
10000000-11111111=10000001
En su lugar, se borra el indicador de desbordamiento (porque los números negativos menos los números negativos no pueden desbordarse), pero el resultado real El resultado no es correcto. Por lo tanto, es necesario verificar el indicador de desbordamiento cada vez que se completa una operación de resta. El programa es el siguiente:
CLR C
MOV 23H, #0FFH; establezca primero el indicador de desbordamiento
MOV A, 20H
SUBB A, 21H; Primera resta
JB OV, NEXT; Finalizar si se desborda
CLR C; Preparar para la segunda resta
SUBB A, 22H; resta
JB OV, NEXT; finalizar si se desborda
JNB ACC.7, NEXT1; la diferencia es transferencia regular
CPL A; >
ING A
NEXT1: MOV 23H., #00H
NEXT: SJMP $
2-15 Hay un número binario de 16 bits, los 8 bits altos se almacenan en la unidad 21H y los 8 bits bajos se almacenan en la unidad 20H. Déjame preguntar: (1) ¿Qué función lógica se logrará al ejecutar el siguiente segmento del programa? (2) ¿Se puede utilizar la instrucción MOV para reemplazar la instrucción XCH sin cambiar la función lógica del programa? Escriba el segmento de programa correspondiente.
(3) ¿Los resultados de ejecución de estos dos segmentos del programa son exactamente iguales? ¿Cuál es la diferencia?
CLR C
XCH A, 21H
RRC A
XCH A, 21H
XCH A, 20H
RRC A
Desplaza un bit y establece el bit más alto en 0, lo que generalmente se denomina desplazamiento lógico a la derecha de un bit.
(2) Puede utilizar la instrucción MOV. El segmento de programa modificado es el siguiente:
CLR C
MOV A, 21H
<. p> RRC AMOV 21H, A
MOV A, 20H
RRC A
MOV 20H, A
( 3) Hay una diferencia. Aunque las funciones de los dos son las mismas en términos de la función de desplazamiento a la derecha de 16 bits, después de la ejecución del primer segmento del programa, el contenido del acumulador A aún mantendrá el valor original, mientras que el valor en A cambiará después. la ejecución del segundo segmento del programa.
2-16 Analice la función lógica de los siguientes segmentos del programa. Si desea utilizar la instrucción MOV para reemplazar la instrucción de intercambio sin cambiar la función lógica del programa, ¿cómo debe modificarla? Suponga que en 20H se almacenan dos números binarios de cuatro dígitos.
MOV R1, #20H
XCHD A, @R1
AÑADIR A, #01H
XCHD A, @R1 p> p>
XCH A, @R1
ADD A, #01H
Suma 1 a cada uno de los dos números binarios de cuatro dígitos en y descarta cualquier posible acarreo bits. Por ejemplo, (20H) = 6AH, el bit después de la ejecución del programa (20H) = 7BH. Otro ejemplo es (20H) = 9FH, luego de la ejecución (20H) = A0H.
Para realizar la misma función sin utilizar instrucciones de intercambio, existen muchos métodos de modificación. El siguiente es sólo un ejemplo:
MOV R1, #20H
XCHD A, @R1
ADD A, #01H suma 1 a los 4 inferiores; bits
JB AC, NEXT; Determina si hay acarreo en los cuatro bits inferiores
ADD A, #01H Suma 1 a los cuatro bits superiores
>SIGUIENTE: MOV @R1, A; Enviar Regresar a la unidad 20H
2-17 Analice los resultados de ejecución de los siguientes segmentos del programa.
Si se cancela el comando DA A, ¿cuál será la diferencia en el resultado?
CLR C
MOV 20H, #99H
MOV A, 20H
AÑADIR A, #01H
DA A
MOV 20H, A
Solución: El resultado de la ejecución del programa es A=00H, Cy=1, (20H)=00H.
Después de cancelar el comando DAA, el resultado de la ejecución es A=9AH, Cy=0, (20H)=9AH.
2-18 En los siguientes dos segmentos del programa, lo que se almacena en R2 son números hexadecimales de dos dígitos. ¿Cuántas veces se debe repetir cada uno de estos dos segmentos del programa?
MOV R2, #60H
BUCLE:...
...
DJNZ R2, BUCLE
SJMP $
MOV R2, #60H
BUCLE:……