2017-09-11 65 views
1

当我们有这样的代码:MSP430交换字节解释装配

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 

什么是落后在这个例子做SWPB R7的原因/意思?我阅读文档并了解它交换低/高端字节;在一些文档中,它说它乘以256.这是唯一的原因,还是我在这里错过了更深的东西?代码应该添加一个寄存器的元素。

+0

我不写MIPS,但如果'R7'持有低字节和高字节代表两个数字,并且要输出到低字节' P1OUT“,然后将高字节输出到”P2OUT“,则需要在两者之间有一个”SWPB“输出高位字节(因为'MOV.B'正在移动低位字节),因此您的MOV.B R7 ,P2OUT'呼叫。 –

回答

2

MOV.B只能访问低位字节。 因此,为了能够将高位字节复制到其他地方,必须先将其移动到低位字节。 (之前的低位字节在交换后的高位字节是一个不重要的副作用)。

会有其他效率较低的机制来获取高位字节,例如将寄存器右移八次:

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

或存放16位值到一个临时变量,然后直接访问该变量的两个字节:

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 

对于较新的MSP430家庭,端口寄存器被布置成使得可以以单身访问两个端口E 16位访问:

​​