Hola, en ensamblador al igual que en C, de los vectores tan solo se conoce su tipo (entero, byte, ..) y su dirección (dirección de memoria del primer elemento). Para poder operar con ellos (recorrerlos), es necesario saber su tamaño a priori (si estás haciendo una función a la que se le pasa la dirección del vector, también te tienen que pasar su tamaño) o se recorre hasta que se produce una condición sobre el dato leído (por ejemplo, las cadenas de caracteres en ensamblador/C son realmente vectores de caracteres (byte) y no se conoce a priori si tamaño, sino que la cadena/vector termina cuando se lee un byte 0 de la misma, es decir, para recorrerla leeríamos uno a uno los bytes de la cadena hasta leer un 0 y ahí terminaríamos).
@@marcovalentin695 Efectivamente, para las cadenas de caracteres, se irían leyendo bytes (caracteres) en bucle hasta lee un byte = 0 que indica fin de la cadena.
Hola, si los números del vector son de tipo ".word" (vector: .word 0x3f, 0x06, ...), es decir, ocupan 32 bits (4 bytes) cada uno como los del vídeo, sería exactamente igual. Si por el contrario fueran de tipo byte (vector: .byte 0x3f, 0x06, ...) entonces el load que hacemos en el bucle tendría que leer solo un byte cada vez (ldrb r0, [r4], #1) usando ldrb en vez de ldr y sumando 1 en vez de 4 (ya que ahora la dirección del siguiente elemento es 1 más que la del elemento actual y no 4 como en el vídeo).
Cambiaría el load del bucle (ldr r0, [r4], #4). Para tamaño tipo hw se utilizaría la instrucción ldrh que lee media palabra y le sumaríamos sólo 2 (en vez de 4, ya que ahora cada dato del vector ocupa 2 bytes o media palabra) al registro r4 (quedaría como ldrh r0, [r4], #2) (evidentemente el vector tendría que estar declarado con la directiva .hword en vez de con .word). Tara tamaño byte, además de declarar el vector con la directiva .byte, el ldr del bucle quedaría como ldrb r0, [r4], #1, donde usamos ldrb que lee bytes de memoria y le sumaríamos solo 1 a r4 (ya que ahora los elementos del vector solo ocupan 1 byte)
Hola Juan, pues básicamente, en la parte que hacemos la suma acumuluativa en el código original (add r5, r5, r0), en el caso que propones, habría que ver si el valor leído (r0) es igual al valor buscado (que tendría que estar almacenado en otro registro, por ejemplo r6 => cmp r0, r6). Y en caso de que fueran iguales, añadir 1 a un registro que utilizarías de contador de ocurrencias (por ejemplo r5 => addeq r5, r5, #1). Si te fijas, ahora la suma SOLO se hace si se cumple la condición EQ (igualdad), que viene determinada por la comparación que se hace previamente (cmp r0, r6).
Hola Alejandro, lo que queremos hacer a partir de la etiqueta "exit:" es salvar el resultado que está en el registro "r5" en la posición de memoria representada por la etiqueta "sum". Para hacer eso te recuerdo que necesito dos instrucciones: 1ª- Tengo que cargar la dirección en la que quier escribir ("sum") en un registro (yo he elegido r0), y eso se hace con: ldr r0, =sum 2ª- Ya podemos almacenar en memoria (str) el valor de r5 en la posición "sum" (ya que esta posición está en r0): str r5, [r0] No se puede poner ldr r0, [=sum], cuando usamos corchetes [ ], dentro debemos poner un registro y opcionalmente un desplazamiento. Cuando ponemos "=etiqueta", se pone sin [ ] e indica cargar la dirección de memoria asociada a dicha etiqueta (no su contenido). Espero haberte solucionado la duda ;)
muy buen video, dias sin saber hacer una practica de la universidad y este video me la ha resuelto, gracias paquito te quiero
GOD
pal lobby arqui
confirmo
se pasa
Hola. Muy buen video, mi consulta es: como recorrer el vector si a priori no sabes su largo, o sea no se sabe cuantos elementos tiene. Saludos
Hola, en ensamblador al igual que en C, de los vectores tan solo se conoce su tipo (entero, byte, ..) y su dirección (dirección de memoria del primer elemento). Para poder operar con ellos (recorrerlos), es necesario saber su tamaño a priori (si estás haciendo una función a la que se le pasa la dirección del vector, también te tienen que pasar su tamaño) o se recorre hasta que se produce una condición sobre el dato leído (por ejemplo, las cadenas de caracteres en ensamblador/C son realmente vectores de caracteres (byte) y no se conoce a priori si tamaño, sino que la cadena/vector termina cuando se lee un byte 0 de la misma, es decir, para recorrerla leeríamos uno a uno los bytes de la cadena hasta leer un 0 y ahí terminaríamos).
O sea ciclar hasta encontrar un byte con valor 0 no?@@FranciscoCorbera
@@marcovalentin695 Efectivamente, para las cadenas de caracteres, se irían leyendo bytes (caracteres) en bucle hasta lee un byte = 0 que indica fin de la cadena.
@@FranciscoCorbera similar a datos .asciz
Muchas gracias !
Buenas, una duda, si el vector fuese de números en hexadecimal?, es decir, {0x3f, 0x06..etc}....se haría igual todo?
Hola, si los números del vector son de tipo ".word" (vector: .word 0x3f, 0x06, ...), es decir, ocupan 32 bits (4 bytes) cada uno como los del vídeo, sería exactamente igual.
Si por el contrario fueran de tipo byte (vector: .byte 0x3f, 0x06, ...) entonces el load que hacemos en el bucle tendría que leer solo un byte cada vez (ldrb r0, [r4], #1) usando ldrb en vez de ldr y sumando 1 en vez de 4 (ya que ahora la dirección del siguiente elemento es 1 más que la del elemento actual y no 4 como en el vídeo).
@@FranciscoCorbera muchas gracias!
Buenas, si deseas usar hw o byte como sería?
Cambiaría el load del bucle (ldr r0, [r4], #4).
Para tamaño tipo hw se utilizaría la instrucción ldrh que lee media palabra y le sumaríamos sólo 2 (en vez de 4, ya que ahora cada dato del vector ocupa 2 bytes o media palabra) al registro r4 (quedaría como ldrh r0, [r4], #2) (evidentemente el vector tendría que estar declarado con la directiva .hword en vez de con .word).
Tara tamaño byte, además de declarar el vector con la directiva .byte, el ldr del bucle quedaría como ldrb r0, [r4], #1, donde usamos ldrb que lee bytes de memoria y le sumaríamos solo 1 a r4 (ya que ahora los elementos del vector solo ocupan 1 byte)
y cómo se podría calcular el nº de veces q aparece un número en el vector?
Hola Juan, pues básicamente, en la parte que hacemos la suma acumuluativa en el código original (add r5, r5, r0), en el caso que propones, habría que ver si el valor leído (r0) es igual al valor buscado (que tendría que estar almacenado en otro registro, por ejemplo r6 => cmp r0, r6). Y en caso de que fueran iguales, añadir 1 a un registro que utilizarías de contador de ocurrencias (por ejemplo r5 => addeq r5, r5, #1). Si te fijas, ahora la suma SOLO se hace si se cumple la condición EQ (igualdad), que viene determinada por la comparación que se hace previamente (cmp r0, r6).
@@FranciscoCorbera muchas gracias! lo intentaré así
en la etiqueta exit:, en el ldr , no es necesario poner "[=sum]"?¿
Hola Alejandro,
lo que queremos hacer a partir de la etiqueta "exit:" es salvar el resultado que está en el registro "r5" en la posición de memoria representada por la etiqueta "sum". Para hacer eso te recuerdo que necesito dos instrucciones:
1ª- Tengo que cargar la dirección en la que quier escribir ("sum") en un registro (yo he elegido r0), y eso se hace con: ldr r0, =sum
2ª- Ya podemos almacenar en memoria (str) el valor de r5 en la posición "sum" (ya que esta posición está en r0): str r5, [r0]
No se puede poner ldr r0, [=sum], cuando usamos corchetes [ ], dentro debemos poner un registro y opcionalmente un desplazamiento. Cuando ponemos "=etiqueta", se pone sin [ ] e indica cargar la dirección de memoria asociada a dicha etiqueta (no su contenido).
Espero haberte solucionado la duda ;)