Parcial 2 Flashcards
(33 cards)
Elija el trozo de código que contiene error:
—————————-
SUB R1, R5, R6
MOVLT R1, R6
MOVGE R1, R5
—————————–
MOV R2, 0x05
MOV R1, 0x02
ADD R2, R1, R2
ADD R2, R1, R2
MOV R5, #0x20
STRB R2, [R5]
—————————–
MOV R2, #0x05
MOV R5, #0x20
STRB R2, [R5]
—————————–
CMP R5, R6
MOVLT R1, R6
MOVGE R1, R5
MOV R2, 0x05
MOV R1, 0x02
ADD R2, R1, R2
ADD R2, R1, R2
MOV R5, #0x20
STRB R2, [R5]
FALTA EL NUMERAL (#)
Sí, R2 = 2 y R3 = 12. ¿Cuál es el valor final de R2?
SUB R2, R3, R2, LSL #2
4
R2 = R3 - (R2 «_space;2)
Donde «_space;es desplazamiento lógico a la izquierda (LSL), que multiplica por potencias de 2.
R2 «_space;2 = 2 «_space;2 = 2 * 2^2 = 2 * 4 = 8
R3 - (R2 «_space;2) = 12 - 8 = 4
Todos los procesadores ARM tienen las instrucciones para multiplicar y dividir.
V/F
Falso
Se tienen dos números almacenados en R5 y R6, 0x06 y 0x04 respectivamente, determine el valorde R1 después de ejecutar el siguiente trozo de código:
SUB R1, R5, R6
MOVLT R1, R6
MOVGE R1, R5
0x02
R5 = 0x06 (6 en decimal)
R6 = 0x04 (4 en decimal)
6-4=2 → 0x02
Si se tienen dos números almacenados en R5 y R6, elija la porción de código que coloca el mayor de los dos en R1:
CMP R5, R6
MOVLT R6, R1
MOVGE R5, R1
—————————————
CMP R1, R6
MOVLT R1, R6
MOVGE R1, R5
—————————————
CMP R5, R6
MOVLT R1, R5
MOVGE R1, R6
—————————————
CMP R5, R6
MOVLT R1, R6
MOVGE R1, R5
CMP R5, R6
MOVLT R1, R6
MOVGE R1, R5
CMP R5, R6 compara los valores de R5 y R6 (sin guardarlos) y actualiza los flags.
MOVLT R1, R6: si R5 < R6, significa que R6 es el mayor, así que se guarda en R1.
MOVGE R1, R5: si R5 ≥ R6, entonces R5 es el mayor, y se guarda en R1.
Para el siguiente número con signo 00000011, si se realiza rotamiento a la derecha de un bit el resultado será:
10000001
El último bit (1) pasa al principio.
Los demás se mueven a la derecha.
00000011 → 10000001
A continuación, se le presentan 4 bloques de instrucciones, elija el bloque que es completamentecorrecto.
MOV R0, R2, LSL #2 //Multiplicar R2 por 2
CMP R5, R6
MOVlt R1, R6
MOVge R1, R5
MOV R1, #0xFFFFFFFF
MOV R2 #0x05
MOV R1, #0x02
CMP R5, R6
MOVlt R1, R6
MOVge R1, R5
Opciones incorrectas:
MOV R0, R2, LSL #2 //Multiplicar R2 por 2
→ ❌ Multiplicar por 4, no por 2. Y los comentarios // no son válidos en asm puro.
MOV R1, #0xFFFFFFFF
→ ⚠️ En algunas arquitecturas ARM no podés cargar directamente ese valor porque no es un inmediato válido (es muy largo). Necesitás otra instrucción como MVN R1, #0x0.
MOV R2 #0x05
→ ❌ Falta una coma. Debería ser: MOV R2, #0x05
Después de ejecutar esta porción de código, ¿Cuál es el valor de R4?
MOV R4, #2
_repetir:
MOV R1, #1
SUBS R4, #1
BEQ _repetir
1
Si R2 contiene el valor de 6 ¿Cuál es su valor después de ejecutar las siguientes instrucciones:
ADD R0, R2, #3
AND R3, R2, #1
ADD R1, R2, R2, LSL #1
6
ADD R0, R2, #3
➤ R0 = 6 + 3 = 9
(pero R2 no cambia)
AND R3, R2, #1
➤ AND lógico entre 6 (110) y 1 (001) = 000
→ R3 = 0
(R2 sigue igual)
ADD R1, R2, R2, LSL #1
➤ Esto es: R1 = R2 + (R2 «_space;1)
➤ (6 «_space;1 = 12), así que: R1 = 6 + 12 = 18
(pero, R2 sigue igual)
¿Cuál es el valor de R0 después de ejecutar el siguiente código?
MOV R1, #5
SUBS R2, R1, #5
ADDLE R0, R1, #3
ADDGE R0, R1, #5
10
MOV R1, #5
→ R1 = 5
SUBS R2, R1, #5
→ R2 = 5 - 5 = 0
→ El resultado es 0, así que se activan las condiciones LE (menor o igual) y GE (mayor o igual).
ADDLE R0, R1, #3
➤ Solo se ejecuta si el resultado anterior fue “menor o igual” (LE = Less or Equal).
Pero como fue igual a 0, sí califica como LE.
Entonces: R0 = 5 + 3 = 8
ADDGE R0, R1, #5
➤ También se ejecuta si el resultado fue mayor o igual (GE).
Como 0 sí es igual, también se ejecuta:
➤ Ahora: R0 = 5 + 5 = 10 → esto sobrescribe el 8 anterior.
Después de ejecutar la instrucción ADDS , ¿Bajo qué condición el valor de la bandera Z se pondrá en 1?
Cuando el resultado sea igual a cero
Sí
msj: .asciz “%d”
Al ejecutar el siguiente código:
MOV R1, #5
SUBS R1, #5
ADDLE R1, #8
SUBGE R1, #12
LDR R0, =msj
BL printf
¿Qué valor mostrará al llamar la función printf de la última línea?
-4
MOV R1, #5 ; R1 = 5
SUBS R1, #5 ; R1 = 5 - 5 = 0 → se activan flags (Z = 1)
ADDLE R1, #8 ; como el resultado fue 0 (LE se cumple), R1 = 0 + 8 = 8
SUBGE R1, #12 ; también se cumple GE → R1 = 8 - 12 = -4 (con signo)
LDR R0, =msj ; Carga la dirección del string “%d”
BL printf ; Imprime R1 como entero
Expresión matemática que representa la sintaxis de la siguiente instrucción “ADC Rd, Rn, Op2”
Rd = Rn + Op2 + C
Si la variable
mensaje
contiene el valor de “Hola mundo”. ¿Qué porción de código mostraría esemensaje en pantalla?
MOV R7, #4
MOV R0, #0
LDR R1, =mensaje
MOV R2, #11
SWI 0
MOV R7, #4
MOV R0, #0
MOV R1, =mensaje
MOV R2, #11
SWI 0
MOV R7, #3
MOV R0, #0
LDR R1, =mensaje
MOV R2, #11
SWI 0
MOV R7, #4
MOV R0, #0
LDR R1, =mensaje
MOV R2, #5
SWI 0
MOV R7, #4
MOV R0, #0
LDR R1, =mensaje
MOV R2, #11
SWI 0
MOV R7, #4 ; syscall: write
MOV R0, #0 ; stdout
LDR R1, =mensaje ; dirección del string
MOV R2, #11 ; longitud completa (“Hola mundo”)
SWI 0 ; llamada al sistema
MOV R1, =mensaje ; ❌ MOV no carga direcciones (usa LDR)
MOV R7, #3 ; ❌ 3 es syscall para leer, no escribir
MOV R2, #5 ; ❌ Solo imprime “Hola “, mensaje incompleto
Se tienen dos números almacenados en R5 y R6, 0x06 y 0x04 respectivamente, determine el valorde R1 después de ejecutar el siguiente trozo de código
SUBS R1, R5, R6
MOVLT R1, R6
MOVGE R1, R5
0x06
SUBS R1, R5, R6 ; R1 = 6 - 4 = 2 → actualiza flags
MOVLT R1, R6 ; Si el resultado fue negativo → R1 = R6
MOVGE R1, R5 ; Si fue cero o positivo → R1 = R5
Si R2=2 y R3=4. Indique qué valor tendrá R2 después de ejecutar el siguiente código
CMP R3, #0
BNE _E
MOV R2, R2, ASR #1
B _E2
_E:
ADD R2, R2, R2, LSL #2
ADD R2, #1
_E2:
11
R2 + (R2 «_space;2) →
2 + (2 × 4) = 2 + 8 = 10
ADD R2, #1 →
10 + 1 = 11
¿Qué hace “STRB R1, [R2]”?
Copia los 8 bits menos significativos de R1 en la dirección apuntada por R2
Después de ejecutar el siguiente código ¿Cuál es el valor de R3?
MOV R1, #5
CMP R1, #7
ADDLE R3, R1, #3
ADDGT R3, R1, #5
8
MOV R1, #5 ; R1 = 5
CMP R1, #7 ; Compara 5 con 7
ADDLE R3, R1, #3 ; Si 5 ≤ 7 → R3 = 5 + 3 = 8
ADDGT R3, R1, #5 ; Si 5 > 7 → no se ejecuta
5 ≤ 7 es cierto, así que se ejecuta:
R3 = 5 + 3 = 8
5 > 7 es falso, así que esta línea se salta
Se tienen dos números almacenados en R5 y R6, 0x06 y 0x04 respectivamente, determine el valorde R1 después de ejecutar el siguiente trozo de código
SUB R2, R5, R6
MOVLT R1, R6
MOVGE R1, R5
No se puede determinar con el trozo de código mostrado
Tomando en cuenta la última instrucción del siguiente bloque de código ¿Qué valor y en quédirección de memoria se almacena el resultado?
MOV R2, #0x05
MOV R1, #0x02
ADD R2, R1, R2
ADD R2, R1, R2
MOV R5, #0x20
STRB R2, [R5]
Se almacena 0x09 en #0x20
MOV R2, #0x05 ; R2 = 5
MOV R1, #0x02 ; R1 = 2
ADD R2, R1, R2 ; R2 = 2 + 5 = 7
ADD R2, R1, R2 ; R2 = 2 + 7 = 9
MOV R5, #0x20 ; R5 = dirección 0x20
STRB R2, [R5] ; Guarda el valor de R2 (9) en la dirección 0x20 (1 byte)
Después de ejecutar el siguiente código ¿Cuál es el valor de R3?
MOV R1, #7
CMP R1, #5
ADDLE R3, R1, #3
ADDGT R3, R1, #5
12
MOV R1, #7 ; R1 = 7
CMP R1, #5 ; Compara R1 con 5 → 7 > 5
ADDLE R3, R1, #3 ; NO se ejecuta porque 7 no es menor o igual a 5
ADDGT R3, R1, #5 ; SÍ se ejecuta porque 7 > 5 → R3 = 7 + 5 = 12
¿Cuál es el valor que se guarda en memoria después de ejecutar las siguientes instrucciones?(Escriba solamente el valor, sin ninguna palabra adicional)
MOV R1, =0x99
MOV R6, =0x92
STRB R1, [R6]
0x99
MOV R1, =0x99 ; R1 = 0x99
MOV R6, =0x92 ; R6 = 0x92 → dirección de memoria
STRB R1, [R6] ; Guarda solo 1 byte (el valor 0x99) en la dirección 0x92
línea Instrucción
El siguiente trozo de código contiene un error, indique el número de línea que contiene el error
20 MOV R7, #4
21 MOV R0, #0
22 MOV R1, =mensaje
23 MOV R2, #100
24 SVC 0
22
20 MOV R7, #4 ; syscall: write
21 MOV R0, #0 ; stdout
22 MOV R1, =mensaje ; ❌ ❗ ERROR AQUÍ
23 MOV R2, #100 ; cantidad de bytes a escribir
24 SVC 0 ; llamada al sistema
MOV R1, =mensaje intenta cargar una dirección de memoria literal.
MOV NO puede cargar direcciones si el valor no cabe en un inmediato.
¿Qué acción realiza el siguiente trozo de código?
MOV R7, #3
MOV R0, #0
LDR R1, =var
MOV R2, #10
SVC 0
Lee 10 caracteres del teclado y los guarda en la variable var
R7 = 3 → syscall read
R0 = 0 → origen: teclado (stdin)
R1 = dirección de “var” → destino: dónde guardar lo leído
R2 = 10 → cuántos bytes quiere leer
SVC 0 → ejecuta la llamada al sistema