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.
- 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.
- 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?
- 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'initialiserr4
à point pour le premier caractère, puis la charge de chaque personnage avecldrb r7,[r4],#1
dans une boucle. Leldrb
instruction implicitement zéro s'étend. Si vous vouliez l'extension du signe que vous auriez à utiliserldrsb
. - 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".
Vous devez vous connecter pour publier un commentaire.
Si vous voulez le bit de poids fort d'un mot de 32 bits, puis obtenir le MSB d'un mot de 32 bits:
Tout le reste est confus et complètement portables entre les systèmes de différents endianness - en essayant d'adresse de l'octet mots en supposant que LE brise sur un système. Ce qui fonctionne sur l'ÊTRE-8 pauses si jamais il se trouve sur une ancienne SOIT-32 système.
En fait, si le chargement d'un octet de
[word ptr - #3]
vous donne vraiment le MSB plutôt que le deuxième octet le moins significatif du mot précédent alors je pense que vous sont sur un ÊTRE-32 système de* - donc cela ne peut pas fonctionner correctement sur quelque chose de moderne.* ou peut-être SERA-8 - la supercherie de la mémoire de stockage vs bus boutisme et mot vs octet d'adressage est très confus et je ne prétends pas avoir pleinement grapsed il.
LDRB
est l'accès à d'autres composants matériels où ils vous ont bytewise accès depuis la lecture à partir d'une adresse pourrait signifier autre chose (comme une fifo). Donc, en bref ne pas faire LDRB sur la mémoire.