¡Descarga Ejercicios basicos en Ensamblador y más Ejercicios en PDF de Ingeniería Infórmatica solo en Docsity! Problemas de Arquitectura del Repertorio de Instrucciones - ARM 1. Indica cuál es el resultado de ejecutar las siguientes instrucciones, dando el contenido final de los registros y posiciones de memoria para cada instrucción. Se supone que para cada instrucción a ejecutar el contenido de los registros y posiciones de memoria es el siguiente: Registros r0 0x00000016 r1 0x00000054 r2 0xFFFFFFFF r3 0x00000000 r4 0x00000004 Memoria 0x00000000 0x03393826 0x00000004 0xEA0063AF 0x00000008 0x17FA8912 0x0000000C 0xBC983304 0x00000010 0x7845F34A 0x00000014 0x534B4AAA 1. add r3, r0, r1 2. add r2, r2, #1 3. sub r4, r1, r0 4. sub r4, r0, r1 5. mul r4, r0, r1 6. or r3, r1, r0 1. mov r4, #0 2. lsr r2, r0, r4 3. ldr r0, [r4] 4. ldr r0, [r4,#-4] 5. str r2, [r4,r3] 6. str r2, [r0] RESPUESTA 1 1. r3 0x0000006A r4 0x00000000 2. r2 0x00000000 r2 0x00000001 3. r4 0x0000003E r0 0xEA0063AF 4. r4 0xFFFFFFC2 r0 0x03393826 5. r4 0x00000738 0x00000004 - 0xFFFFFFFF 6. r3 0x00000056 Dirección no múltiplo de 4 2. Codifica en ensamblador la siguiente condición IF-THEN: if (x >= y) { x = x+2; y = y-2; } RESPUESTA 2. ldr r1, =x ldr r2, =y ldr r3, [r1] ldr r4, [r2] cmp r3, r4 blt Salir add r3, r3, #2 str r3, [r1] sub r4, r4, #2 str r4, [r2] Salir: 3. Codifica en ensamblador la siguiente condición IF-THEN-ELSE: if (x >= y) { x = x+2; y = y+2; } else { x = x-2; y = y-2; } RESPUESTA 3. ldr r0, =x ldr r1, =y ldr r2, [r0] ldr r3, [r1] cmp r2, r3 blt Op2 b Op Op2: sub r2,r2,#2 sub r3,r3,#2 str r2, [r0] str r3,[r1] Op: add r2,r2,#2 add r3,r3,#2 str r2,[r0] END: str r0,[r2] b . .end 5. Codifica en ensamblador el siguiente bucle WHILE-DO: n = 5; fant = 1; f = 1; i = 2; while (i <= n) { faux = f; f = f + fant; fant = faux; i = i+1; } RESPUESTA 5. n: .word 5 fant: .word1 f: .word 1 c: .word 2 ldr r0, = n ldr r1, = fant ldr r2, = f ldr r3, = i ldr r4, [r0] ldr r5, [r1] ldr r6, [r2] ldr r7, [r3] LOOP: cmp r7, r4 bgt Salir ldr r8, =faux ldr r9, [r8] mov r9, r6 add r6, r6, r5 str r6, [r2] mov r5, r9 str r5, [r1] str r9, [r8] add r7, r7, #1 str r7, [r3] b LOOP Salir: Solución profesor: .global start .data n: .word 81 fant: .word 18 f: .word 1 i: .word 2 .text start: ldr r0,=n ldr r0,[r0] ldr r1,=fant ldr r1,[r1] ldr r2,=f ldr r2,[r2] ldr r3,=i ldr r3,[r3] WHILE: cmp r3,r0 bgt END mov r4,r2 add r2,r2,r1 mov r1,r4 add r3,r3,#1 b WHILE END: ldr r2,=f str r2,[r2] b . .end 6. Codifica en ensamblador el siguiente bucle FOR: for (i=2; i<=n; i++) { f=f+f; } RESPUESTA 6. mov r1, #2 ldr r2, =n ldr r3, [r2] ldr r4, =f ldr r5, [r4] LOOP: cmp r1,r3 bgt Salir add r5, r5, r5 add r1, r1, #1 b LOOP Salir: str r5, [r4] Solución profesor: .global start .data n: .word 8 f: .word 10 .text start: ldr r0,=n ldr r0,[r0] mov r1=#2 ldr r2,=f ldr r2,[r2] FOR: cmp r1,r0 bgt END add r2,r2,r2 add r1,r1,#1 b FOR END: ldr r1,=f str r2,[r1] b . .end 7. El siguiente programa calcula el máximo común divisor de dos números a y b según el algoritmo de restas de Euclides.Traducirlo a ensamblador del ARM: C(i) = |A(i) + B(9-i)|, i = 0,...,9. Escriba un programa en lenguaje de alto nivel que construya el vector C. Traduzca el programa al lenguaje ensamblador del ARM. RESPUESTA 12. const int N = 10 typedef int tVector[N]; tVector A, B, C; for (int i = 0; i < N; i++){ C[ i ] = A[ i ] + B[N - 1 - i ]; } .global start .data .equ N, #10 A: .word 1 2 3 4 5 6 7 8 9 10 11 B: .word 10 9 8 7 6 5 4 3 2 11 13 .bss C: .space 4 * N .text start: ldr r0, =A ldr r1, =B ldr r2, =C mov r3, #0 mov r4, #N sub r4, r4, #1 mov r8,#0 FOR: cmp r3, N bge SALIR ldr r5, [r0, r3, LSL #2] ldr r6, [r1, r4, LSL #2] add r7, r5, r6 cmp r7,r8 bge SALTAR sub r7,r8,r7 SALTAR: str r7, [r2, r3, LSL #2] add r3, r3, #1 sub r4, r4, #1 b FOR Salir: b. .end 13. Traduce el siguiente programa escrito en un lenguaje de alto nivel a lenguaje ensamblador. La órden swap(a, b) intercambia los valores de las variables a y b. int a=13, b=16; While (a>10){ a=a-1; b=b+2; } if (a<b) swap (a, b); else b= a-1; RESPUESTA 13. .global start .data a: .word 13 b: .word 16 .text start: ldr r0,=a ldr r1, [r0] ldr r2,=b ldr r3,[r2] WHILE: cmp r1, #10 ble IF sub r1, r1, #1 add r3, r3, #2 b WHILE IF: cmp r1, r3 bge ELSE mov r4, r1 mov r1, r3 mov r3, r4 b END ELSE: sub r3, r1, #1 END: str r1, [r0] str r3, [r2] b . .end