-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path21
142 lines (116 loc) · 4.34 KB
/
21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
--21
.arch armv8-a // Especifica la arquitectura ARMv8-A
.data
// Matriz original 3x3
matriz: .quad 1, 2, 3
.quad 4, 5, 6
.quad 7, 8, 9
// Matriz transpuesta 3x3
transpuesta: .zero 72 // 9 elementos * 8 bytes = 72 bytes
// Dimensiones de la matriz
filas: .quad 3
columnas: .quad 3
// Mensajes para imprimir
msg_original: .string "\nMatriz Original:\n"
msg_trans: .string "\nMatriz Transpuesta:\n"
msg_elemento: .string "%3ld " // Formato para long int en Linux
msg_newline: .string "\n"
.text
.global main
.type main, %function
.align 2
main:
// Prólogo
stp x29, x30, [sp, -16]! // Guardar registros de enlace y base
mov x29, sp // Actualizar el puntero de pila
// Mostrar matriz original
adr x0, msg_original // Dirección del mensaje de matriz original
bl printf // Llamada a printf para mostrar mensaje
adr x0, matriz // Dirección de la matriz original
bl imprimir_matriz // Llamada a función para imprimir la matriz
// Transponer matriz
bl transponer_matriz // Llamada a función de transposición
// Mostrar matriz transpuesta
adr x0, msg_trans // Dirección del mensaje de matriz transpuesta
bl printf // Llamada a printf para mostrar mensaje
adr x0, transpuesta // Dirección de la matriz transpuesta
bl imprimir_matriz // Llamada a función para imprimir la matriz
// Epílogo y retorno
ldp x29, x30, [sp], 16 // Restaurar registros de enlace y base
mov w0, 0 // Retornar 0
ret
// Función para transponer matriz
transponer_matriz:
stp x29, x30, [sp, -64]! // Guardar registros de enlace y base
mov x29, sp // Actualizar el puntero de pila
// Inicializar contadores
mov x19, #0 // i = 0
adr x20, filas
ldr x20, [x20] // Cargar número de filas
adr x21, columnas
ldr x21, [x21] // Cargar número de columnas
bucle_i:
cmp x19, x20 // Comparar i con filas
b.ge fin_transposicion
mov x22, #0 // j = 0
bucle_j:
cmp x22, x21 // Comparar j con columnas
b.ge siguiente_i
// Calcular índice matriz original [i][j]
mul x23, x19, x21 // i * columnas
add x23, x23, x22 // + j
lsl x23, x23, #3 // * 8 (tamaño de quad)
// Calcular índice matriz transpuesta [j][i]
mul x24, x22, x20 // j * filas
add x24, x24, x19 // + i
lsl x24, x24, #3 // * 8
// Cargar elemento de matriz original
adr x25, matriz
ldr x26, [x25, x23]
// Guardar en matriz transpuesta
adr x27, transpuesta
str x26, [x27, x24]
add x22, x22, #1 // j++
b bucle_j
siguiente_i:
add x19, x19, #1 // i++
b bucle_i
fin_transposicion:
ldp x29, x30, [sp], 64 // Restaurar registros
ret
// Función para imprimir matriz
imprimir_matriz:
stp x29, x30, [sp, -48]! // Guardar registros de enlace y base
mov x29, sp // Actualizar el puntero de pila
str x0, [sp, 16] // Guardar dirección de la matriz
mov x19, #0 // i = 0
adr x20, filas
ldr x20, [x20] // Cargar número de filas
adr x21, columnas
ldr x21, [x21] // Cargar número de columnas
bucle_imprimir_ext:
cmp x19, x20
b.ge fin_imprimir
mov x22, #0 // j = 0
bucle_imprimir_int:
cmp x22, x21
b.ge nueva_linea
// Calcular offset
mul x23, x19, x21
add x23, x23, x22
lsl x23, x23, #3
// Imprimir elemento
adr x0, msg_elemento
ldr x24, [sp, 16]
ldr x1, [x24, x23]
bl printf
add x22, x22, #1
b bucle_imprimir_int
nueva_linea:
adr x0, msg_newline
bl printf
add x19, x19, #1
b bucle_imprimir_ext
fin_imprimir:
ldp x29, x30, [sp], 48 // Restaurar registros
ret