2017-08-24 3 views
0

J'essaie de comprendre ce examble au sujet des instructions LDM et STM, mais j'ai un problème avec le résultat final, voici l'exemple:ARM STM/instructions LDM d'émission

PRE 
    r0 = 0x00009000 
    r1 = 0x00000009 
    r2 = 0x00000008 
    r3 = 0x00000007 

    STMIB r0!, {r1 - r3} 

    MOV r1, #1 
    MOV r2, #2 
    MOV r3, #3 

PRE(2) 

    r0 = 0x0000900C 
    r1 = 0x00000001 
    r2 = 0x00000002 
    r3 = 0x00000003 

    LDMDA r0!, {r1 - r3} 

POST 
    r0 = 0x00009000 
    r1 = 0x00000009 
    r2 = 0x00000008 
    r3 = 0x00000007 

Je le faire et j'obtenir que:

r0 = 0x00009000 
r1 = 0x00000007 
r2 = 0x00000008 
r3 = 0x00000009 

Je ne sais pas où je me trompe, la seule possibilité que je peux penser est sur le point que l'instruction STM commence dans R3 et non à R1

+0

Les registres sont toujours transférés dans l'ordre numérique des adresses faibles à élevées. – Jester

+0

@Jester Merci! Donc le '{r1 - r3}' ne spécifie aucun ordre? Suivez simplement l'ordre numérique des adresses? – Hector

+0

Oui. Notez également que c'est plus facile si vous pensez à ces opérations lorsque les opérations de pile sont lancées (tant que les modes correspondants sont utilisés). Le 'stmib/ldmda' implémente une pile" full ascending ", donc ils sont alias à' stmfa/ldmfa'. Voir aussi [Implémentation de pile avec LDM et STM] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0801e/dom1359731152499.html) – Jester

Répondre

0

comment il est acte ually implémenté est dans le code source auquel la plupart des gens n'ont pas accès et il n'y a aucune raison de supposer que du noyau/implémentation à l'autre il le fait de la même manière. malgré le pseudo-code, ils peuvent parcourir la liste de registre de haut en bas plutôt que de bas en haut ou avoir une table, etc. Ils peuvent faire un magasin de 8 ou 4 mots plutôt que de gaspiller une tonne de cycles en 1 mot à la fois. Comment ils le font réellement dans la logique n'est pas important, ou ne devrait pas être pour la compréhension. Comment ça finit dans la mémoire est.

incrément stmib avant

start_address = Rn + 4 
end_address = Rn + (Number_Of_Set_Bits_In(register_list) * 4) 
if ConditionPassed(cond) and W == 1 then 
    Rn = Rn + (Number_Of_Set_Bits_In(register_list) * 4) 

puis

if ConditionPassed(cond) then 
address = start_address 
for i = 0 to 15 
if register_list[i] == 1 
Memory[address,4] = Ri 
address = address + 4 
assert end_address == address - 4 

lorsque vous utilisez les paires appropriées ib et da (incrément avant et décrémentation après) ou ia et db avec la même liste de registre, il est essentiellement la pile push et pop (push et pop sont des codes en psuedo pour stmdb et ldmia). vous avez commencé avec r1-r3 vous avez fait des instructions compsary stm/ldm et vous avez récupéré ce que vous avez commencé, cela a parfaitement fonctionné. Quant à savoir s'il semble avoir fait r3 en premier ou r1 en premier est dans l'oeil du spectateur et le ia/ib/da/db est utilisé sur le stm.