飞思卡尔汇编指令集
- 格式:pdf
- 大小:786.98 KB
- 文档页数:29


单片机指令集的汇编语言编程方法介绍汇编语言是一种低级语言,它直接与计算机硬件进行交互,被广泛应用于单片机编程中。
本文将介绍单片机指令集的汇编语言编程方法。
一、简介单片机指令集是特定型号单片机支持的操作指令的集合。
每个指令都对应着特定的功能,通过组合和调用这些指令,可以实现复杂的计算和控制任务。
二、基本指令1. 数据传送指令数据传送指令用于将数据从一个位置传送到另一个位置。
常见的指令有MOV(将源操作数传送到目的操作数)、LDR(将存储器位置的数据传送到寄存器)和STR(将寄存器中的数据传送到存储器位置)等。
2. 算术指令算术指令用于进行数学运算,包括加法、减法、乘法和除法等。
常见的指令有ADD(将两个操作数相加并将结果存储到目的操作数中)、SUB(将目的操作数减去源操作数并将结果存储到目的操作数中)等。
3. 逻辑指令逻辑指令用于进行逻辑运算,包括与、或、非和异或等。
常见的指令有AND(将两个操作数进行按位与运算并将结果存储到目的操作数中)、ORR(将两个操作数进行按位或运算并将结果存储到目的操作数中)等。
4. 控制指令控制指令用于控制程序的执行流程,包括无条件跳转、条件跳转和中断等。
常见的指令有B(无条件跳转到指定的地址执行)、BEQ (当条件满足时跳转到指定的地址执行)等。
三、编程方法1. 熟悉指令集编程前需要详细了解所使用的单片机的指令集,包括指令的功能、操作数的类型和寻址方式等。
只有深入了解指令集,才能灵活运用指令编写程序。
2. 设计算法在开始编程之前,需要分析问题,设计出解决问题的算法。
算法应考虑输入、处理和输出等方面,合理利用指令集中的指令实现算法的逻辑。
3. 编写汇编程序根据算法,以汇编语言的格式编写程序。
程序的编写过程需要遵循指令的语法规则和寻址方式,并注意程序的可读性和效率。
4. 调试和优化程序编写完成后,需要进行程序的调试和优化。
通过单步执行程序,观察和检查程序执行过程中的中间结果,确保程序能够正确地执行。
INTEL汇编指令集INTEL 汇编指令集Intel Assemble Instruction SetCONTENTIntel 8086 Family ArchitectureInstruction Clock Cycle Calculation8088/8086 Effective Address (EA) Calculation Task State CalculationFLAGS - Intel 8086 Family Flags Register MSW - Machine Status Word (286+only)8086/80186/80286/80386/80486 Instruction Set AAA - Ascii Adjust forAddition AAD - Ascii Adjust for DivisionAAM - Ascii Adjust for Multiplication AAS - Ascii Adjust forSubtraction ADC - Add With Carry ADD - Arithmetic Addition AND- Logical AndARPL - Adjusted Requested Privilege Level of Selector (286+ PM) BOUND- Array Index Bound Check (80188+) BSF - Bit Scan Forward (386+) BSR- Bit Scan Reverse (386+) BSWAP - Byte Swap (486+) BT - BitTest (386+)BTC - Bit Test with Compliment (386+) BTR - Bit Test with Reset (386+) BTS - Bit Test and Set (386+) CALL - Procedure CallCBW - Convert Byte to WordCDQ - Convert Double to Quad (386+) CLC - Clear CarryCLD - Clear Direction FlagCLI - Clear Interrupt Flag (disable)CLTS - Clear Task Switched Flag (286+ privileged) CMC - ComplementCarry Flag CMP - CompareCMPS - Compare String (Byte, Word or Doubleword) CMPXCHG - Compareand Exchange CWD - Convert Word to DoublewordCWDE - Convert Word to Extended Doubleword (386+) DAA - DecimalAdjust for Addition DAS - Decimal Adjust for SubtractionDEC - Decrement DIV - DivideENTER - Make Stack Frame (80188+) ESC - Escape HLT - Halt CPUIDIV - Signed Integer Division IMUL - Signed MultiplyIN - Input Byte or Word From Port INC - IncrementINS - Input String from Port (80188+) INT - InterruptINTO - Interrupt on Overflow INVD - Invalidate Cache (486+)INVLPG - Invalidate Translation Look-Aside Buffer Entry (486+)IRET/IRETD - Interrupt Return Jxx - Jump Instructions TableJCXZ/JECXZ - Jump if Register (E)CX is Zero JMP - Unconditional JumpLAHF - Load Register AH From FlagsLAR - Load Access Rights (286+ protected) LDS - Load Pointer Using DS LEA - Load Effective AddressLEAVE - Restore Stack for Procedure Exit (80188+) LES - Load PointerUsing ESLFS - Load Pointer Using FS (386+)LGDT - Load Global Descriptor Table (286+ privileged) LIDT - LoadInterrupt Descriptor Table (286+ privileged) LGS - Load Pointer Using GS(386+)LLDT - Load Local Descriptor Table (286+ privileged) LMSW - LoadMachine Status Word (286+ privileged) LOCK - Lock BusLODS - Load String (Byte, Word or Double) LOOP - Decrement CX andLoop if CX Not ZeroLOOPE/LOOPZ - Loop While Equal / Loop While ZeroLOOPNZ/LOOPNE - Loop While Not Zero / Loop While Not Equal LSL - Load Segment Limit (286+ protected) LSS - Load Pointer Using SS (386+)LTR - Load Task Register (286+ privileged) MOV - Move Byte or WordMOVS - Move String (Byte or Word) MOVSX - Move with Sign Extend (386+) MOVZX - Move with Zero Extend (386+) MUL - Unsigned MultiplyNEG - Two's Complement NegationNOP - No Operation (90h)NOT - One's Compliment Negation (Logical NOT) OR - Inclusive LogicalOR OUT - Output Data to PortOUTS - Output String to Port (80188+) POP - Pop Word off StackPOPA/POPAD - Pop All Registers onto Stack (80188+) POPF/POPFD - PopFlags off Stack PUSH - Push Word onto StackPUSHA/PUSHAD - Push All Registers onto Stack (80188+) PUSHF/PUSHFD -Push Flags onto Stack RCL - Rotate Through Carry Left RCR - RotateThrough Carry Right REP - Repeat String OperationREPE/REPZ - Repeat Equal / Repeat ZeroREPNE/REPNZ - Repeat Not Equal / Repeat Not Zero RET/RETF - ReturnFrom Procedure ROL - Rotate Left ROR - Rotate RightSAHF - Store AH Register into FLAGSSAL/SHL - Shift Arithmetic Left / Shift Logical Left SAR - ShiftArithmetic RightSBB - Subtract with Borrow/CarrySCAS - Scan String (Byte, Word or Doubleword)SETAE/SETNB - Set if Above or Equal / Set if Not Below (386+)SETB/SETNAE - Set if Below / Set if Not Above or Equal (386+) SETBE/SETNA- Set if Below or Equal / Set if Not Above (386+) SETE/SETZ - Set ifEqual / Set if Zero (386+)SETNE/SETNZ - Set if Not Equal / Set if Not Zero (386+)SETL/SETNGE - Set if Less / Set if Not Greater or Equal (386+)SETGE/SETNL - Set if Greater or Equal / Set if Not Less (386+)SETLE/SETNG - Set if Less or Equal / Set if Not greater or Equal (386+) SETG/SETNLE - Set if Greater / Set if Not Less or Equal (386+) SETS - Set if Signed (386+)SETNS - Set if Not Signed (386+) SETC - Set if Carry (386+)SETNC - Set if Not Carry (386+) SETO - Set if Overflow (386+)SETNO - Set if Not Overflow (386+)SETP/SETPE - Set if Parity / Set if Parity Even (386+) SETNP/SETPO - Set if No Parity / Set if Parity Odd (386+) SGDT - Store GlobalDescriptor Table (286+ privileged) SIDT - Store Interrupt DescriptorTable (286+ privileged) SHL - Shift Logical LeftSHR - Shift Logical RightSHLD/SHRD - Double Precision Shift (386+)SLDT - Store Local Descriptor Table (286+ privileged) SMSW - Store Machine Status Word (286+ privileged) STC - Set CarrySTD - Set Direction FlagSTI - Set Interrupt Flag (Enable Interrupts)STOS - Store String (Byte, Word or Doubleword) STR - Store Task Register (286+ privileged) SUB - SubtractTEST - Test For Bit PatternVERR - Verify Read (286+ protected) VERW - Verify Write (286+ protected) WAIT/FWAIT - Event WaitWBINVD - Write-Back and Invalidate Cache (486+) XCHG - ExchangeXLAT/XLATB - Translate XOR - Exclusive OR TEXTIntel 8086 Family ArchitectureGeneral Purpose Registers Segment RegistersAH/AL AX (EAX) Accumulator CS Code Segment BH/BLBX (EBX) Base DS Data Segment CH/CL CX (ECX)Counter SS Stack Segment DH/DL DX (EDX) Data ES Extra Segment (FS)386 and newer (Exx) indicates 386+ 32 bit register (GS) 386 andnewerPointer Registers Stack RegistersSI (ESI) Source Index SP (ESP) Stack Pointer DI(EDI) Destination Index BP (EBP) Base Pointer IPInstruction PointerStatus RegistersFLAGS Status Flags (see FLAGS) Special Registers (386+ only)CR0 Control Register 0 DR0 Debug Register 0 CR2Control Register 2 DR1 Debug Register 1 CR3 ControlRegister 3 DR2 Debug Register 2DR3 Debug Register 3 TR4 Test Register 4 DR6 DebugRegister 6 TR5 Test Register 5 DR7 Debug Register 7TR6 Test Register 6 TR7 Test Register 7Register Default Segment Valid Overrides BPSS DS, ES, CS SI or DI DS ES,SS, CS DI strings ES NoneSI strings DS ES, SS, CS - see CPUDETECTING Instruction TimingInstruction Clock Cycle CalculationSome instructions require additional clock cycles due to a \Instruction Component\ clock cycle listings. This is due to theprefetch queue being purge on a control transfers. Below is thegeneral rule for calculating \88/86 not applicable286 \386 \ (the instruction coding (each byte), plus the dataand the displacement are all considered components)8088/8086 Effective Address (EA) CalculationDescription Clock Cycles Displacement 6 Base or Index (BX,BP,SI,DI) 5Displacement+(Base or Index) 9 Base+Index(BP+DI,BX+SI) 7 Base+Index (BP+SI,BX+DI) 8 Base+Index+Displacement (BP+DI,BX+SI) 11Base+Index+Displacement (BP+SI+disp,BX+DI+disp) 12- add 4 cycles for word operands at odd addresses - add 2 cyclesfor segment override- 80188/80186 timings differ from those of the 8088/8086/80286Task State Calculation\ the following:+---------------------------------------+| New Task | +-------+-------+-------+-------+-------+ +---------------+486 TSS|486 TSS|386TSS|386 TSS|286 TSS|感谢您的阅读,祝您生活愉快。
ARM汇编指令集汇编指令集的介绍,包括指令和伪指令。
指令和概念指令指令指的是CPU机器指令的助记符,是由CPU的指令集提供的,经过编译之后,会以机器码的形式由CPU读取执⾏伪指令伪指令本质上不是指令,和CPU的机器指令没有任何关系,只是和指令⼀起写在代码中⽽已,是由环境提供的,其⽬的是⽤于指导编译过程,伪指令经过编译后不会⽣成⼆进制机器码,仅仅在编译阶段有效果指令编程风格ARM官⽅风格官⽅风格指令⼀般使⽤⼤写,例如:LDR R0,[R1],Windows中常使⽤这种风格GUN Linux风格指令⼀般使⽤⼩写字母,例如:ldr r0,[r1],Linux环境中常⽤这种风格ARM汇编特点LDR/STR架构1. 采⽤RISC架构,CPU本⾝不能直接读取内存,⽽需要把内存中的数据加载到CPU的通⽤寄存器中,才能被CPU处理2. ldr(load register)将内存中的数据加载到通⽤寄存器3. str(store register)将寄存器内容存⼊内存空间4. ldr和str组合,可以实现ARM CPU和内存的数据交换8种寻址⽅式1. 寄存器寻址:move r1,r2:把r2的值赋值到r1寄存器中2. ⽴即寻址:move r0,#0xFF00:把⽴即数0xFF00赋值给r0寄存器3. 寄存器移位寻址:move r0,r1,lsl #3:把r1左移三位(*8)之后的值赋值给r0寄存器4. 寄存器间接寻址:ldr r1,[r2]:寄存器有中括号,表⽰内存地址对应的数据,所以这⾥r2表⽰⼀个内存地址,[]表⽰取r2指针对应的数据,这句代码的意思是把r2对应的内存中的数据赋值给r15. 基址变址寻址:ldr r1,[r2,#4]:将指针r2的值(内存地址)+4之后指向的数据赋值给r16. 多寄存器寻址:ldmia r1!,{r2 - r7,r12}:这种情况下,r1是⼀个指针,⾥边存放的内存地址,然后以r1⾥边的内存地址为基地址,向后以此加1得到{}⾥的寄存器数量个内存地址,然后将刚才得到的这些内存地址指向的变量的值赋值给{}⾥的对应位置的寄存器,类似从内存中读取数组,然后把数组的元素依次赋值给这些寄存器7. 堆栈寻址:stmfd sp!,{r2 - r7,lr}:和多寄存器类似,区别是将栈SP中连续访问{}数量个字节,然后依次赋值给{}⾥的寄存器8. 相对寻址:beq flag::flag:标号⽤于标记标号后⾯那句指令的地址,常⽤来表⽰⼊⼝点,函数名就是⼀个标号,C语⾔中的goto就可以跳转到⼀个标号,在ARM汇编中⽤指令b flag:就可以跳转到flag:对应的标号处执⾏,和beq flag:是⼀样的,其原理是相对于PC程序位置寄存器做⼀个偏移指令后缀1. ARM中的指令可以带后缀,从⽽丰富该指令的功能,这种形式叫做指令族,常⽤的后缀有:2. B(byte):功能不变,操作长度变为8位(依赖CPU位数,以下相同)3. H(Halfword):功能不变,操作长度变为16位3. H(Halfword):功能不变,操作长度变为16位4. S(signed):功能不变,操作数变为有符号数5. S(S标识):影响CPSR⾥的NZCV标识位,6. 举例:1. ldr指令族:ldrb,ldrh,ldrsb ldrsh,从内存中加载指定长度的数据2. mov指令族:movs r0,#0,结果是0,赋值会影响CPSR的NZCV标识,将Z位置为1条件执⾏后缀1. 条件执⾏后缀⽤于限制该执⾏执⾏的,只有在符合条件之后才能够执⾏该指令2.3. 举例:moveq r0,r1,如果eq成⽴,执⾏mov r0,r1,不成⽴则该条不执⾏,和C语⾔中的条件判断类似4. 条件后缀成⽴与否,不是取决于本条指令,⽽是取决于之前指令运⾏后的结果5. 条件后缀决定了本条指令是否执⾏,不会影响之前和之后指令6. 条件后缀和CPSR的NZCV位相关,例如,如果上⼀句代码执⾏的结果将Z置为1,下⼀句带有eq条件后缀的语句就会被执⾏多级指令流⽔线1. 多级流⽔线⽤于增加处理器处理指令的速度,2. 允许CPU同时异步的执⾏多条指令,⽽⾮上⼀条指令全部执⾏完毕之后才会执⾏下⼀条指令3. 多级可以简单那理解为把⼀条指令分为多个步骤来异步执⾏,例如:1. CPU把⼀条指令分为[取址,解码,执⾏]3个步骤,则为3级指令流⽔线2. 第⼀条指令进⾏取值操作3. 第⼀条指令取值完毕,进⼊解码操作,第⼆条指令紧随其后就开始执⾏取值操作4. 第⼀条指令解码完毕,进⼊执⾏操作,第⼆条指令紧接着进⼊解码操作,同时第三条指令进⼊取值操作5. 第⼀条指令执⾏完毕,第⼆条指令进⼊执⾏操作,第三条指令进⼊解码操作,第四条指令进⼊取值操作,依次类推4. 可见,多级流⽔线可以提⾼同时执⾏指令的数量,从⽽加速指令执⾏5. 需要注意的是,PC指向的是正在取值的指令,⽽⾮正在执⾏的指令,之间的差值就是流⽔线级数和单字节长度的乘积,在中断返回到PC的时候需要注意这个问题ARM指令数据处理指令数据传输指令mov:move,在两个寄存器之间或者⽴即数和寄存器之间传递数据,将后⼀个寄存器上的值或者⽴即数赋值给前⼀个寄存器 例如:mov r1,r0mov r1,#0xFF:将⽴即数0xFF赋值给寄存器r1mvn:和mov⽤法⼀致,区别是mvn会把后⼀个寄存器的值或者⽴即数按位取反后赋值给前⼀个寄存器 例如:mvn r0,#0xFF,则r0的值为0xffffff00(32位数据)算术运算指令add:加法运算sub:减法运算rsb:反减运算adc: 带进位的加法运算sbc: 带进位的减法运算rsc:带进位的反减指令逻辑指令and:与操作orr:或操作eor:异或操作bic:位清除操作⽐较指令cmp:⽐较⼤⼩cmn:取反⽐较tst:按位与运算teq:按位异或运算乘法指令mvl: mla: umull: umlal: smull: smlal:前导0计数clz:统计⼀个数的⼆进制位前⾯有⼏个0CPSR访问指令mrs⽤于读取CPSR和SPSRmsr⽤于写CPSR和SPSRCPSR和SPSRCPSR是程序状态寄存器,整个Soc只有⼀个SPSR在五种异常模式下各有⼀个,⽤于从普通模式进⼊异常模式的时候,保存普通模式下的CPSR,在返回普通模式时可以恢复原来的CPSR跳转分⽀指令b指令: ⽆条件直接跳转,没打算返回bl指令:跳转前把返回地址放⼊lr中,以便返回,常⽤在函数中bx指令:跳转同时切换到ARM模式,⽤于异常处理的跳转内存访问指令ldr:加载指定内存地址的数据到寄存器,按照字节访问str:加载指定寄存器数据到内存地址中,按照字节访问ldm:和ldr功能⼀样,⼀次多字节多寄存器访问stm:和str功能⼀样,⼀次多字节多寄存器访问swp:内存和寄存器互换指令,⼀边读⼀边写,例如:swp r1,r2,[r0]:读取指针r0的数据到r1中,同时把r2的数据赋值给r0指针指向的变量软中断指令swi(software interrupt),在软件层模拟产⽣⼀个中断,这个中断会传送给CPU,常⽤于实现系统调⽤⽴即数⾮法与合法ARM指令都是32为,除了指令标记和操作标记外,只能附带少位数的⽴即数,所以有⾮法与合法之分⾮法⽴即数:合法⽴即数:经过任意位数的移位后,⾮0部分可以⽤8位表⽰就是合法⽴即数协处理器与指令协处理器协处理器属于Soc中另外⼀颗核⼼,⽤于协助主CPU实现某些功能,被主CPU调⽤来执⾏任务,协处理器和MMU,Cache,TLB有功能和管理上的联系ARM设计可以⽀持多达16个协处理器,但是⼀般只实现其中的CP15协处理器指令mrc:读取CP15中的寄存器mcr:向CP15中的寄存器写数据指令⽤法:mcr{<”cond”>} p15,<”opcode_1”>,<”Rd”>,<”Crn”>,<”Crm”>,{<”opcode_2”>} opcode_1:对于CP15永远为0Rd:ARM通⽤寄存器Crn:CP15寄存器,取值范围c0~c15Crm:CP15寄存器,⼀般为c0opcode_2:省略或者为0ldm,stm和栈ldm,stmldr与str只能访问4个字节,当数据较⼤的时候,就会明显的降低效率,这时就需要使⽤到ldm和stm,ldm与stm是⼤量的从寄存器与内存交换数据的⽅式,常⽤于在内存和寄存器之间⼤量读取和写⼊数据:stmia sp {r0 - r12}:stm表⽰进⾏批量数据操作,ia的意思是将r0存⼊SP的内存地址处,然后SP内存地址+4(32位),将r1存⼊该地址,内存地址再+4,存⼊r2,依次存到r12,这就是⼀个寄存器和内存交换⼤量数据的⽰例,在⼀个周期内完成了多个内存地址和多个寄存器的操作。