-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path28
129 lines (106 loc) · 2.87 KB
/
28
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
--28
// Descripción: Establecer, borrar y alternar bits en un número.
.data
msg_menu: .string "\nManipulación de bits\n"
.string "1. Establecer bit (SET)\n"
.string "2. Borrar bit (CLEAR)\n"
.string "3. Alternar bit (TOGGLE)\n"
.string "4. Salir\n"
.string "Seleccione una opción: "
msg_num: .string "Ingrese el número: "
msg_pos: .string "Ingrese la posición del bit (0-31): "
msg_resultado: .string "Resultado: %d\n"
msg_binario: .string "En binario: "
msg_bit: .string "%d"
msg_newline: .string "\n"
formato_int: .string "%d"
opcion: .word 0
numero: .word 0
posicion: .word 0
.text
.global main
.align 2
main:
// Prólogo
stp x29, x30, [sp, -16]!
mov x29, sp
menu_loop:
// Mostrar menú
adr x0, msg_menu
bl printf
// Leer opción
adr x0, formato_int
adr x1, opcion
bl scanf
// Verificar salida
adr x0, opcion
ldr w0, [x0]
cmp w0, #4
b.eq fin_programa
// Leer número
adr x0, msg_num
bl printf
adr x0, formato_int
adr x1, numero
bl scanf
// Leer posición
adr x0, msg_pos
bl printf
adr x0, formato_int
adr x1, posicion
bl scanf
// Cargar valores
adr x0, numero
ldr w1, [x0] // Número original
adr x0, posicion
ldr w2, [x0] // Posición
adr x0, opcion
ldr w0, [x0] // Opción
// Seleccionar operación
cmp w0, #1
b.eq set_bit
cmp w0, #2
b.eq clear_bit
cmp w0, #3
b.eq toggle_bit
b menu_loop
set_bit:
mov w3, #1 // Crear máscara
lsl w3, w3, w2 // Desplazar 1 a la posición
orr w1, w1, w3 // OR con la máscara
b mostrar_resultado
clear_bit:
mov w3, #1 // Crear máscara
lsl w3, w3, w2 // Desplazar 1 a la posición
mvn w3, w3 // Invertir bits
and w1, w1, w3 // AND con la máscara
b mostrar_resultado
toggle_bit:
mov w3, #1 // Crear máscara
lsl w3, w3, w2 // Desplazar 1 a la posición
eor w1, w1, w3 // XOR con la máscara
mostrar_resultado:
// Guardar resultado
mov w19, w1
// Mostrar en decimal
adr x0, msg_resultado
bl printf
// Mostrar en binario
adr x0, msg_binario
bl printf
mov w20, #32
mostrar_bits:
sub w20, w20, #1
lsr w21, w19, w20
and w1, w21, #1
adr x0, msg_bit
bl printf
cmp w20, #0
b.ne mostrar_bits
adr x0, msg_newline
bl printf
b menu_loop
fin_programa:
mov w0, #0
ldp x29, x30, [sp], 16
ret