Acceso a vector en ensamblador ARM

Поділитися
Вставка
  • Опубліковано 7 лис 2024

КОМЕНТАРІ • 20

  • @marioc7698
    @marioc7698 Рік тому

    muy buen video, dias sin saber hacer una practica de la universidad y este video me la ha resuelto, gracias paquito te quiero

  • @sitto797
    @sitto797 Рік тому

    GOD

  • @miguelalejandrocontreraspe6074
    @miguelalejandrocontreraspe6074 3 роки тому +9

    pal lobby arqui

  • @joacog8891
    @joacog8891 4 місяці тому

    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

    • @FranciscoCorbera
      @FranciscoCorbera  4 місяці тому

      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
      @marcovalentin695 День тому

      O sea ciclar hasta encontrar un byte con valor 0 no?​@@FranciscoCorbera

    • @FranciscoCorbera
      @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.

    • @marcovalentin695
      @marcovalentin695 День тому +1

      @@FranciscoCorbera similar a datos .asciz
      Muchas gracias !

  • @teamerrecemadrid4931
    @teamerrecemadrid4931 3 роки тому +1

    Buenas, una duda, si el vector fuese de números en hexadecimal?, es decir, {0x3f, 0x06..etc}....se haría igual todo?

    • @FranciscoCorbera
      @FranciscoCorbera  3 роки тому +4

      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).

    • @teamerrecemadrid4931
      @teamerrecemadrid4931 3 роки тому

      @@FranciscoCorbera muchas gracias!

  • @danimartin6929
    @danimartin6929 3 роки тому

    Buenas, si deseas usar hw o byte como sería?

    • @FranciscoCorbera
      @FranciscoCorbera  3 роки тому

      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)

  • @juanperezgutierrez6897
    @juanperezgutierrez6897 Рік тому

    y cómo se podría calcular el nº de veces q aparece un número en el vector?

    • @FranciscoCorbera
      @FranciscoCorbera  Рік тому

      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).

    • @juanperezgutierrez6897
      @juanperezgutierrez6897 Рік тому

      @@FranciscoCorbera muchas gracias! lo intentaré así

  • @tellez750
    @tellez750 4 роки тому

    en la etiqueta exit:, en el ldr , no es necesario poner "[=sum]"?¿

    • @FranciscoCorbera
      @FranciscoCorbera  4 роки тому +3

      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 ;)