2017-09-11 11 views
1

Lorsque nous avons un code comme ceci:MSP430 SWAP octets ensemble d'explication

main: MOV  #SFE(CSTACK), SP  ; set up stack 
    ;;; some instructions ....... 
    ; load the starting address of the array1 into the register R4 
    MOV.W #arr1, R4    
    ; load the starting address of the array1 into the register R5 
    MOV.W #arr2, R5 
;  Sum arr1 and display 
     CLR  R7      ; Holds the sum 
     MOV  #8, R10     ; number of elements in arr1 
lnext1: ADD  @R4+, R7    ; get next element 
     DEC  R10 
     JNZ  lnext1 
     MOV.B R7, P1OUT    ; display sum of arr1 
     SWPB R7 
     MOV.B R7, P2OUT 

Quelle est la raison/sens derrière R7 faire SWPB dans cet exemple? Je lis les docs et comprends qu'il échange des octets bas/haut de gamme; Dans certains documents, il est dit qu'il multiplie par 256. Est-ce la seule raison ou est-ce que je manque quelque chose de plus profond ici? Le code censé ajouter les éléments d'un registre.

+0

Je ne vous écris pas MIPS, mais si 'R7' est titulaire d'un faible octet et octet haut représentant deux chiffres, et que vous voulez à la sortie du faible octet à' P1OUT », puis la sortie de l'octet haut à« P2OUT », vous auriez besoin d'un« SWPB »entre la sortie de l'octet haut (puisque« MOV.B »déplace l'octet faible) avant votre« MOV.B R7 , Appel P2OUT. –

Répondre

2

MOV.B ne peut accéder qu'à l'octet le plus bas. Donc, pour pouvoir copier l'octet supérieur ailleurs, il doit d'abord être déplacé vers l'octet inférieur. (L'octet inférieur précédent est dans l'octet supérieur après que l'échange soit un effet secondaire sans importance.)

Il y aurait d'autres mécanismes moins efficaces pour atteindre l'octet supérieur, comme le décalage du registre à droite huit fois:

MOV.B R7, P1OUT 
    RRA R7 
    RRA R7 
    RRA R7 
    RRA R7 
    RRA R7 
    RRA R7 
    RRA R7 
    RRA R7 
    MOV.B R7, P2OUT 

Ou stocker la valeur 16 bits dans une variable temporaire, puis accéder aux deux octets de cette variable directement:

MOV.W R7, temp_low  ; writes both bytes 
    MOV.B temp_low, P1OUT 
    MOV.B temp_high, P2OUT 

    .bss 
    .align 2 
temp_low: .space 1 
temp_high: .space 1 

Avec les familles MSP430 plus récents, les registres de port sont disposés de telle sorte que vous pouvez accéder à deux ports avec un singl e 16 bits accès:

MOV.W R7, PAOUT