1、XGate 汇编指令集,清华Freescale单片机应用开发研究中心,XGate CPU结构,XGate 寻址方式隐含寻址,BRK;Break 进入BDM调试方式RTS;Return to Scheduler 结束当前线程,回空闲状态NOP;No OPeration空操作SIF;Set Interrupt Flag向S12X叫中断,XGate 寻址方式立即数寻址,4位:LSL R4,#1 ;R4 = R4 3,R4寄存器右移3位8位:ADDL R1,#1 ;把8位立即数加到R1寄存器SUBL R2,#2 ;从R2寄存器减去8位立即数LDH R3,#3 ;把8位立即数加载到R3寄存器的高字节上C
2、MPLR4,#4 ;对R4寄存器的低字节和8位立即数进行比较16位:LDW R4,#$1234 ;会被拆分成两条指令:LDL R4,#$34; LDH R4,#$12ADD R4,#$5678 ;会被拆分成两条指令:ADDL R4,#$78; ADDH R4,#$56,单、双、三寄存器寻址,单寄存器寻址:JAL R1;Jamp And Link, PC = R1, R1 = PC+2,跳转指令SIF R2 ;触发R2低字节中存放的中断通道号对应的中断双寄存器寻址:LSL R4,R5 ; R4 = R4 R5MOVE RD,RS; RDRS三寄存器寻址:ADC R5,R6,R7 ; R5 = R
3、6 + R7 + CarrySUB R5,R6,R7 ; R5 = R6 - R7,以立即数为偏移量的寄存器间接寻址,把R1+offset地址处的8位数值写入到R4寄存器的低字节中,R4的高字节被清零:LDB R4,(R1,#offset) ;把R4寄存器中的16位数值写入到R1+offset地址处:STW R4,(R1,#offset) ;,偏移量在寄存器中的寄存器间接寻址,目标寄存器是R4,源地址在R1中,偏移量在R2中,以 R1R2 找到相关存储器的地址,取其值写入目的寄存器R4: LDB R4,(R1,R2) STW R4,(R1,R2),带寄存器偏移量和自动加减的寄存器间接寻址,目标
4、寄存器是R4,源地址是R1,偏移量在R2中,执行完指令后R2自动加1或2:LDB R4,(R1,R2+) STW R4,(R1,R2+) 执行指令前R2先减1或2:LDB R4,(R1,-R2) STW R4,(R1,-R2),相对转移寻址,偏移量是9位:BCC REL9 ;PC = PC + 2 + (REL9 1)BEQ REL9 ;PC = PC + 2 + (REL9 1)偏移量是10位:BRA REL10 ;PC = PC + 2 + (REL10 RD;STB RS, (RB, #OFFS5) Store Byte from RS to Mem. RS.L = MRB, #OFFS
5、5LDB RD, (RB, RI) Load Byte from Mem to RD MRB, RI = RD.L; $00 = RD.H;STW RS, (RB, RI) Store Word from RS to Mem. RS = MRB, RILDW RD, (RB, RI+) Load word from Mem to RD MRB, RI = RD; RI+2 = RISTB RS, (RB, RI+) Store Byte from RS to Memory RS.L = MRB, RI ; RI+1 = RILDB RD, (RB, RI) Load Byte from mem
6、ory to RD RI-1 = RI; MRB, RI = RD.L; $00 = RD.H;LDW RD, (RB, RI) Load Word from memory to RD RI-2 = R I; MRB, RI = RDSTB RS, (RB, RI) Store Byte from RS to Memory RI-1 = RI; RS.L = MRB, RI,特殊数据传送指令,读取条件码寄存器CCR的值TFR RD,CCR Transfer CCR to RD写CCR寄存器TFR CCR,RS Transfer RS to CCR 读取当前程序计数器PC的值TFR RD,PCT
7、ransfer PC to RD,立即数算术运算指令,LDL RD, #IMM8 Load Low RD给RD低字节加载8位立即数LDH RD, #IMM8 Load High RD给RD高字节加载8位立即数ADDL RD, #IMM8 Add Low RDRD低字节加上8位立即数ADDH RD, #IMM8 Add High RDRD高字节加上8位立即数SUBL RD, #IMM8 Subtract Low RDRD低字节减去8位立即数SUBH RD, #IMM8 Subtract High RDRD高字节减去8位立即数CMPL RS, #IMM8 Compare RS Low with I
8、mmediate 比较RS低字节和立即数(RS.L立即数)CPCH RS, #IMM8 Compare RS with Carry High 比较RS高字节和立即数(RS.H立即数),操作数为3个寄存器的算术运算指令,SUB RD, RS1, RS2Subtract 减法运算 RDRS1-RS2SBCRD, RS1, RS2Subtract with Carry带借位减法 RDRS1-RS2-CADDRD, RS1, RS2Add 加法运算 RDRS1+RS2ADCRD, RS1, RS2Add with Carry带进位加法 RDRS1+RS2+C,寄存器与立即数逻辑运算指令,ANDL RD
9、, #IMM8 AND Low byte RD RD低字节= RD低字节 与 8位立即数 ANDH RD, #IMM8 AND High byte RD RD高字节= RD高字节 与 8位立即数ORL RD, #IMM8 OR Low bit RD RD低字节= RD低字节 或 8位立即数ORH RD, #IMM8 OR High bit RD RD高字节= RD高字节 或 8位立即数XNORL RD, #IMM8 eXclusive NOR Low RD RD低字节= RD低字节 异或 8位立即数XNORH RD, #IMM8 eXclusive NOR High RD RD高字节= RD高
10、字节 异或 8位立即数,操作数为3个寄存器的逻辑运算指令,AND RD, RS1, RS2 Logical And 逻辑与 RDRS1 与 RS2OR RD, RS1, RS2Logical Or逻辑或 RD= RS1 或 RS2XNOR RD, RS1, RS2 Logical eX clusive NOR逻辑异或 RD= RS1 异或 RS2,用立即数表示移位位数的指令,BFFO RD, RS Bit Field Find First One 找出RS中左边第一个1的位置并存入RD,RS为0时,CCR寄存器中的C位被置位,从而区别RS为0与RS的第0位为1两种情况ASR RD, #IMM4
11、 Arithmetic Shift Right 算术右移RD,符号位不变,移动位数为4位立即数LSL RD, #IMM4 Logical Shift Left 逻辑左移RD,高位进入C,移动位数为4位立即数LSR RD, #IMM4 Logical Shift Right逻辑右移RD,高位进入C,移动位数为4位立即数ROL RD, #IMM4 Logical Shift Left循环逻辑左移RD,移动位数用4位立即数表示ROR RD, #IMM4 Logical Shift Right循环逻辑右移RD,移动位数用4位立即数表示CSL RD, #IMM4 Logical Shift Left w
12、ith Carry循环左移RD,高位进入C,移动位数为4位立即数CSR RD, #IMM4 Logical Shift Right with Carry循环右移RD,高位进入C,移动位数为4位立即数,用寄存器表示移位位数的指令,FFO RD, RSBit Field Find First One 找出RS中第一个1的位置并写入RD,若RS为0,C置位ASR RD, RS Asthmatic shift Right 将RD算术右移若干位,位数在RS中CSL RD, RSLogical Shift Left with Carry含进位借位位的逻辑左移CSR RD, RSLogical Shift
13、Right with Carry含进位借位位的逻辑右移LSL RD, RSLogical Shit Left将RD逻辑左移若干位,位数在RS中LSR RD, RSLogical Shit Right 将RD逻辑右移若干位,位数在RS中ROL RD, RSRotate shift left将RD循环左移若干位,位数在RS中ROR RD, RSRotate Shit Right 将RD循环右移若干位,位数在RS中,转移指令,BCC REL9Branch if Carry Clear 若C = 0,则转移,此时PC + $0002 + (REL9 = 若N V = 0,则转移 =异或BGTREL9B
14、ranch if Greater Than 若Z|(N V) = 0,则转移BLE REL9Branch if Less than or Equal 若Z|(N V) = 1,则转移BLT REL9Branch if Less Than 若N V = 1,则转移BRAREL10Branch Always绝对转移,位测试指令,测试RD低字节,与8位立即数与,影响Z,N标志:BITL RD, #IMM8BIt Test Low测试RD高字节,与8位立即数与,影响Z,N标志: BITH RD, #IMM8 BIt Test High,位操作指令,BFEXT RD, RS1, RS2Bit Field
15、 Extract位提取指令:RS1(n+m):n = RDm:0; 0 = RD15:(m+1)BFINS RD, RS1, RS2Bit Field Insert位插入指令:RS1m:0 = RD(m+n):nBFINSI RD, RS1, RS2Bit Field Insert and Invert位插入并求反指令:!RS1m:0 = RDn+m:nBFINSX RD, RS1, RS2Bit Field Insert and XNOR位插入并异或指令 !(RS1m:0 RDn+m:n) = RDn+m:n m = (RS27:4),n = (RS23:0),信号量操作指令,CSEM IM
16、M3Clear Semaphore 信号量清零,所操作的信号量由3位立即数表述 CSEM RSClear Semaphore信号量清零,所操作的信号量由RS表述SSEM IMM3Set Semaphore信号量置位,所操作的信号量由3位立即数表述SSEM RSSet Semaphore信号量置位,所操作的信号量由RS表述,程序流程控制及其它指令,BRKBreak 软件断点,使 XGate 进入 Debug 模式NOPNo Operation 空操作RTSReturn to Schedule从当前线程返回,XGate 回空闲状态SIFSet Interrupt Flag 置某通道中断标志位,若不
17、带参数,即当前通道,协处理器汇编程序的例子(1),;#;# XGATE DATA #;#CPU XGATE; 使用XGate汇编器ALIGN 1;按字(2B)对齐XGATE_DATA_FLASH EQU* ;当前行,变量参数首地址XGATE_DATA_SCI EQU *-XGATE_DATA_FLASH ;相对地址 0 处DW SCI_REGS ; 定义变量值为 SCI寄存器首地址XGATE_DATA_IDX EQU *-XGATE_DATA_FLASH; 相对地址为 2 处DB XGATE_DATA_MSG ; 定义1B作为字符指针XGATE_DATA_MSG EQU *-XGATE_DAT
18、A_FLASH ; 相对地址为 3 处FCC Hello World! ; 定义ASCII字符串 DB $0D; 定义回车符 CR,协处理器汇编程序的例子(2),;#;# XGATE CODE #;#CPU XGATE; 使用XGate汇编器ALIGN 1XGATE_CODE_FLASH LDW R2,(R1,#XGATE_DATA_SCI); SCI寄存器地址-R2LDB R3,(R1,#XGATE_DATA_IDX); 字符指针 - R3 LDB R4,(R1,R3+) ; 当前字符 - R4,R3+STB R3,(R1,#XGATE_DATA_IDX); 指向下一个待发送字符LDB R0
19、,(R2,#(SCISR1-SCI_REGS); 读SCI状态寄存器STB R4,(R2,#(SCIDRL-SCI_REGS); 写SCI寄存器发送字符CMPL R4,#$0D; 回车符?BEQ XGATE_CODE_DONE; 是则继续RTS; 否则本次中断服务完成XGATE_CODE_DONE LDL R4,#$00 ; R4 清零STB R4,(R2,#(SCICR2-SCI_REGS); 关 SCI 中断LDL R3,#XGATE_DATA_MSG; 恢复字符指针STB R3,(R1,#XGATE_DATA_IDX)XGATE_CODE_FLASH_END RTS ; 中断服务完成,X
20、Gate C语言范例,interrupt void SCI_Thread(tBuffer* Data) /* XGate SCI中断服务 */ if (Data-size 0) SCI0SR1; /* 读状态寄存器,清中断标志位 */ SCI0DRL = Data-characterData-size-1; /* 发送一个字节 */ Data-size-; if (Data-size = 0) SCI0CR2_SCTIE = 0; /* 禁止SCI中断 */ _sif(); /* 向S12X主CPU发中断信号 */ ,CISC与RISC的比较,RISC和CISC 各有各的优势和缺点,不断互相吸
21、取对方的优点,克服各自的缺点,都在发展。CISC 微处理器传统技术,指令多功能强,不要求对齐。一条指令需多个周期。工作时钟频率不易做得很高。有栈结构、函数调用,易接轨高级语言。90年代新技术,指令少,操作码和操作数用1个16/32位数表示,需要位对齐,时钟频率高,辅以流水线技术,多数指令执行时间为1个周期。无栈结构、函数调用。CISC CPU可对存储器直接操作,有存储器到存储器的数据转移。有 读/改/写,i+, 等单指令,在RTOS下避免竞争。RISC CPU,所有存储器操作必须通过CPU寄存器,需要多条指令完成i+,读/改/写,I/O 等操作,用RTOS时,需要用开关中断避免竞争。,END,