Adjunto 'anumero2_ex1.s'
Descargar 1 .text
2 .arm
3 .global _start
4 _start:
5 b reset
6 b loop
7 b loop
8 b loop
9 b loop
10 nop
11 b loop
12 b loop
13
14 /* ==============================
15 * Programa principal
16 * ==============================
17 */
18 reset: ldr sp,=STACK
19 ldr r1,TAMANIO
20 ldr r2,=VECTOR
21 ldr r3,=NUMEROS
22
23 otro: ldr r0,[r2],#4 @ bucle que carga el puntero a la cadena
24 bl anumero @ pasa cadena a numero
25 str r0,[r3],#4 @ guarda el resultado
26 subs r1,#1
27 bne otro
28 loop: b loop
29
30 /* Funcion de pase a numero
31 * Transforma una cadena en ascii a un numero.
32 * Esta cadena posee las siguientes características:
33 * * El número en la cadena se encuentra en base 16
34 * * La cadena se supone que solo posee dígitos hexadecimales, donde las letras se encuentran en mayúsculas, puntos de
35 * * El único signo posible es un '-' y como primer byte, indicando que el número es negativo, si este signo no existe el número es positivo.
36 * Entrada
37 * Dirección de la cadena en r0
38 * Salida
39 * Numero resultante en r0
40 */
41
42
43 anumero:
44 push {r1-r6}
45 mov r4,#0
46 ldrb r1,[r0] @ si el primer caracter es '-' se activa la bandera de signo a 1 (r4)
47 cmp r1,#'-'
48 moveq r4,#1
49 addeq r0,#1 @ si es negativo desplazo el puntero para no encontrar de nuevo el signo
50 sub r5,r0,#1 @ calcular r5 para detectar comienzo de cadena
51 anumero_otro:
52 ldrb r1,[r0],#1 @ bucle para encontrar el final de cadena
53 cmp r1,#0
54 bne anumero_otro
55 sub r0,#2
56 mov r2,#1
57 mov r3,#16
58 mov r6,#0
59
60 anumero_otro2:
61 ldrb r1,[r0],#-1 @ carga los elementos desde el menos significativo (último caracter)
62 cmp r0,r5 @ compara si es comienzo de cadena para salir
63 blo anumero_fin
64 cmp r1,#'.'
65 beq anumero_cont
66 cmp r1,#'9' @ si es menos a '9' es un número si es mayor es una letra
67 subls r1,#'0'
68 subhi r1,#('A'-10)
69 mul r1,r2,r1 @ multiplico el dígito con el peso de la posición
70 mul r2,r3,r2 @ recalculo el peso de la posición
71 add r6,r1 @ acumulador con resultado
72 @ ejemplo
73 @ entrada = '3','4','A'
74 @ calculo = (A * 1)+ (4 * 1 * 16) + (3 * 1 * 16 * 16)
75 anumero_cont:
76 b anumero_otro2
77 anumero_fin:
78 mov r0,r6
79 cmp r4,#1 @ verifico signo para negar el número si fuera negativo
80 rsbeq r0,r0,#0
81 pop {r1-r6}
82 mov pc,lr
83
84
85 VECTOR: .word NUM1,NUM2
86 NUMEROS: .word 0,0
87 TAMANIO: .word 2
88 NUM1: .asciz "0.A334"
89 NUM2: .asciz "-98"
90 .balign 4
91 .space(200)
92 STACK:
93
94 .end
Archivos adjuntos
Para referirse a los adjuntos de una página, usa attachment:nombredelarchivo, como se muestra abajo en la lista de archivos. NO uses la URL del enlace [get], ya que puede cambiar fácilmente y dejar de funcionar.No tienes permisos para adjuntar un archivo a esta página.