|  | 
 
| 9.4  交换指令 
 交换指令是load/Store指令的一种特殊形式。该指令将一个存储器单元内容与指定的寄存器内容相交换。交换指令为进程间同步提供了一种方便的解决途径。该指令产生一对原子Load/Store操作(an atomic load and store operation),该操作发生在一个连续的总线操作中,在操作期间阻止其他任何指令对该存储单元的读/写。
 
 表9.3总结了ARM的交换指令。
 表9.3       交换指令
 
 | 助  记  符 
 | 含    义 
 | 操    作 
 |  | SWP 
 | 寄存器和存储器字数据交换 
 | Rd←[Rd],[Rn]←[Rm](Rn≠Rd或Rm) 
 |  | SWPB 
 | 寄存器和存储器字节数据交换 
 | Rd←[Rd],[Rn]←[Rm](Rn≠Rd或Rm) 
 | 
 
 9.4.1  寄存器和存储器字数据交换指令SWP
 
 1.指令编码格式
 
 寄存器和存储器字交换指令SWP(Swap)用于将一个内存单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元中。
 
 指令的编码格式如图9.10所示。
 
 
         图9.10  SWP指令编码格式 
 2.指令的语法格式
 
 SWP{<cond>}   <Rd>,<Rm>,[<Rn>]
 
 ① <cond>
 为指令编码中的条件域。它指示指令在什么条件下执行。当<cond>忽略时,指令为无条件执行(cond=AL(Alway))。
 
 ② <Rd>
 确定指令的目标寄存器。
 
 ③ <Rm>
 该寄存器包含将要被存储到内存单元中的数据。
 
 ④ <Rn>
 内存单元地址寄存器。
 
 3.指令操作的伪代码
 
 指令操作的伪代码如下面程序段所示。
 
 If  ConditionPassed{cond}  then
 If  Rn[1:0]==0b00  then
 Temp=memory[Rn,4]
 Else if  Rn[1:0]==0b01  then
 Temp= memory[Rn,4]  Rotate_Right 8
 Else if  Rn[1:0]==0b10  then
 Temp= memory[Rn,4]  Rotate_Right 16
 Else   /*  Rn[1:0]==0b01  then  */
 Temp= memory[Rn,4]  Rotate_Right 24
 
 Memory[Rn,4]=Rm
 Rd=temp
 
 4.指令举例
 
 (1)将r1的内容与r0指向的存储单元的内容进行交换。
 
 SWP    r1,r1,[r0]
 
 (2)使用SWP指令进行信号量操作。
 
 SEM        EQU        0x10002000
 ……
 WAIT_SEM
 MOV    r0,#0             ;
 LDR    r0,=SEM            ;
 SWP    r1,r1,[r0]         ;取出信号量
 CMP    r1,#0             ;判断是否有信号
 BEQ    WAIN_SEM            ;若没有,继续等待
 
 9.4.2  寄存器和存储器字节数据交换指令SWPB
 
 1.指令编码格式
 
 寄存器和存储器字节交换指令SWPB(Swap Byte)。将内存单元中一个字节的内容和寄存器内容进行交换。详情请参见SWP指令。
 
 指令的编码格式如图9.11所示。
 
 
         图9.11  SWPB指令编码格式 
 2.指令的语法格式
 
 SWP{<cond>}B   <Rd>,<Rm>,[<Rn>]
 
 ① <cond>
 为指令编码中的条件域。它指示指令在什么条件下执行。当<cond>忽略时,指令为无条件执行(cond=AL(Alway))。
 
 ② <Rd>
 确定指令的目标寄存器。
 
 ③ <Rm>
 该寄存器包含将要被存储到内存单元中的数据。
 
 ④  <Rn>
 内存单元地址寄存器。
 
 3.指令操作的伪代码
 
 指令操作的伪代码如下面程序段所示。
 
 If  ConditionPassed{cond}  then
 Temp=Memory[Rn,1]
 Memory[Rn,1]=Rm[7:0]
 Rd=temp
 
 4.指令举例
 
 参见SWP指令。
 | 
 |