Red de conocimiento informático - Programación de la red - Preguntas de programación en sistemas de aplicaciones informáticas

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>

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

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

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 contador

LOOP1: 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 A

MOV 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>

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:……