LDRB dans les BRAS ASM - questions générales

Je suis en utilisant une architecture ARM et je suis un peu dans le flou sur le concept avec LDRB. LDRB être LDR avec l'option B de la commande, à charge de l'octet le moins significatif du mot de 32 bits. Trois questions.

  1. Ce que je veux c'est les 8 premiers bits, pas les 8 derniers bits (je suis une itération sur un tableau). Est-il un moyen élégant pour ce faire? Je ne pouvais pas trouver une commande pour elle.
  2. Ce que je suis en train de faire maintenant est SUB r4, r4, #3 pour déplacer r4 (mon pointeur je veux charger) le retour de trois octets, de sorte que l'octet le moins significatif est maintenant l'un à l'avant du mot de 32 bits. Est-ce susceptible de provoquer des problèmes de mémoire si je ne fais itération de l'avant?
  3. Je suis en utilisant LDRB r7, r4, ce qui devrait charger l'octet le moins significatif de r4 à r7. Par zéro étendre, cela signifie que ce qui en sortira sera quelque chose comme 00...00010101, ou 10101000...00?
  • (Qui est, le BRAS de la documentation dit que LDRB sera zéro étendre. Il ne précise pas dans quelle direction.)
  • LDRB r7, r4 n'était pas valable instruction de la dernière fois que j'ai vérifié. Zéro extension de remplissage des moyens les N bits les plus significatifs avec des zéros.
  • C'est un peu difficile de savoir comment les données que vous êtes en train de lire est défini (par exemple: pourquoi vous devez soustraire 3 à partir de votre pointeurs). Si un pointeur vers le début d'un mot (c'est à dire le pointeur est mot-alignés), alors si vous LDRB à partir de ce pointeur, vous serez la lecture de l'octet le moins significatif (sur un little-endian machine).
  • Je ne sais pas pourquoi LDRB r7, r4 serait invalide; LDR a une option de préface pour B et nécessite un registre et un deuxième souple opérande. Pourquoi ne serait-ce pas le travail? Aussi, j'ai un tableau de char en C que j'ai besoin pour effectuer une itération sur octet par octet pour vérifier la 00000000 octet (et enregistrer le nombre d'itérations). Et depuis LDRB me donne l'octet le moins significatif, il faut que je la boucle de trois octets à l'avance, de sorte que l'octet le moins significatif est le début du tableau (l'octet le plus significatif).
  • Ah. L'Ofc. LDRB r7, [r4];.
  • Bon, pour le nouveau plan. LDRB r7, [r4, #-3], #1; Ce déplace la charge de 3 octets, puis se déplace en permanence r4 en avant, en supprimant la nécessité de le parcourir en une commande séparée. Yay.
  • Certes je n'ai pas écrit tout BRAS de montage en temps, mais je ne vois pas comment LDRB r7,[r4, #-3], #1 serait de travailler. Vous pouvez spécifier soit un pré-indexation de décalage ou de post-indexation de décalage, pas les deux. Aussi, si vos données est une chaîne de caractères, il me semble que la solution la plus simple serait d'initialiser r4 à point pour le premier caractère, puis la charge de chaque personnage avec ldrb r7,[r4],#1 dans une boucle. Le ldrb instruction implicitement zéro s'étend. Si vous vouliez l'extension du signe que vous auriez à utiliser ldrsb.
  • Pouvez-vous préciser ce que vous entendez par la "première" de l'octet, le "dernier" byte", et "déplacer vers l'avant". Ces termes n'ont aucune signification réelle. Veuillez remplacer les bits (bits[7:0]) ou d'utiliser des termes comme "moins important" et "très important".

InformationsquelleAutor J.Swersey | 2014-01-26