第十三讲 PSoC汇编语言指令集
(完整word版)汇编语言指令集合-吐血整理,推荐文档

8086/8088指令系统记忆表数据寄存器分为:AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据.BH&BL=BX(base):基址寄存器,常用于地址索引;CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器.DH&DL=DX(data):数据寄存器,常用于数据传递。
他们的特点是,这4个16位的寄存器可以分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。
这2组8位寄存器可以分别寻址,并单独使用。
另一组是指针寄存器和变址寄存器,包括:SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置;BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。
指令指针IP(Instruction Pointer)标志寄存器FR(Flag Register)OF(overflow flag)DF(direction flag)CF(carrier flag)PF(parity flag)AF(auxiliary flag)ZF(zero flag)SF(sign flag)IF(interrupt flag)TF(trap flag)段寄存器(Segment Register)为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。
汇编指令集

一、指令的寻址方式:1、立即寻址:在这种方式中,指令中直接给出参与操作的8位或16位二进制常数,并在此常数前面加“#”作为标识。
该常数是没有存放地点的数,称为立即数,应立即取走。
例如:MOV A,#3AHMOV DPTR,#1000H2、直接寻址:这在种寻址方式中,指令直接给出操作数所在的存储单元地址。
例如:MOV A,34H就是把内存地址为34H的单元中的数送到A中去。
3、寄存器寻址:寄存器寻址是指操作数放在指令中的工作寄存器中。
例如:MOV A,R1 ;将R1中的内容送到A中。
4、寄存器间接寻址:MOV A,@R0 ;将R0中的值作为地址,到这个地址中取数,然后送到A中。
以下是解决上面问题的例子:MOV R7,#20 (1) ;将立即数20送到R7中,执行完后R7中的值应是20。
MOV R0,#30H (2) ;将立即数30H送到R0中,执行完后R0中的值应是30H。
LOOP:MOV A,@R0 (3) ;取出R0单元中值,把这个值作为地址,取这个地址单元中的内容送入A中。
INC R0 (4) ;把R0中的值加1。
这条指令执行完后,R0中的值变成31H。
DJNZ R7,LOOP (5) ;将R7中的值减1,然后判断该值是否等于0。
如不等于0则转去标号LOOP处继续执行第3条指令,就相当于执行:MOV A,31H此时R0中的值已是31H了,对R7中的值再次减1,并判断是否等于0。
若等于0,以转去执行第3条指令……如此不断循环,直到R7中的值经过逐次相减后等于0为止。
也就是说,第第3、4、5这3条指令一共被执行了20次,实现了上述要求:将从30H单元开始的20个数据送入A中。
这样,仅用了5条指令,就代替了20行的程序。
这里,R0有用来存放“有数据的内存单元的地址”的,称之为“间址寄存器”。
注意:在寄存器间址寻址方式中,只能用R0和R1作为间址寄存器。
5、变址寻址(基址寄存器+变址寄存器间接寻址):变址寻址也称基址变址寻址,即寻找的地址有一个固定的偏移量。
汇编语言基本指令详解

汇编语言基本指令详解在计算机科学和计算机工程领域,汇编语言是一种计算机底层编程语言,用于直接控制计算机硬件。
它是机器语言的文本形式,使用符号和助记符来代表机器指令,相对于高级编程语言来说更加底层。
汇编语言基本指令是使用汇编语言进行编程时必不可少的内容。
下面将详细介绍汇编语言中常用的基本指令。
1. 数据传送指令数据传送指令用于在寄存器之间传递数据,常见的指令有MOV、ADD、SUB、MUL等。
MOV指令用于将数据从一个位置传送到另一个位置,格式为MOV 目标操作数, 源操作数。
例如,MOV AX, BX可以将BX的值传送给AX。
ADD指令用于将两个操作数相加,并将结果保存到目标操作数中。
格式为ADD 目标操作数, 源操作数。
例如,ADD AX, BX可以将AX与BX的值相加,并将结果保存在AX中。
SUB指令用于将源操作数的值从目标操作数中减去,并将结果保存到目标操作数中。
格式为SUB 目标操作数, 源操作数。
例如,SUB AX, BX可以将BX的值从AX中减去,并将结果保存在AX中。
MUL指令用于将两个操作数相乘,并将结果保存到目标操作数中。
格式为MUL 目标操作数, 源操作数。
例如,MUL AX, BX可以将AX与BX的值相乘,并将结果保存在AX中。
2. 算术逻辑指令算术逻辑指令用于进行各种算术和逻辑运算,例如加法、减法、乘法、除法、与、或、非等。
ADD指令在前面已经提到,用于将两个操作数相加。
SUB指令在前面已经提到,用于将源操作数的值从目标操作数中减去。
MUL指令在前面已经提到,用于将两个操作数相乘。
DIV指令用于将目标操作数除以源操作数,并将商保存到目标操作数,余数保存在DX中。
格式为DIV 操作数。
例如,DIV BX可以将AX的值除以BX,并将商保存在AX中,余数保存在DX中。
AND指令用于对两个操作数进行按位与运算,并将结果保存到目标操作数中。
格式为AND 目标操作数, 源操作数。
例如,AND AX,BX可以将AX与BX的值按位与,并将结果保存在AX中。
汇编语言指令集合

操作数符号含义(寻址方式)ac 8位操作:AL;16位操作:AXport 一个输入/输出(I/O)端口,用数字或表达式来表示,端口号≤255dst目的操作数src源操作数reg 任意一个8位通用寄存器AH, AL, BH, BL, CH, CL, DH, DL;任意一个16位通用寄存器AX, BX, CX, DX, SI, DI, BP, SPdata88位立即数指令格式* 数据传送(10)– MOV、XCHG、XLAT、PUSH、POP– LEA、IN、OUT、PUSHF、POPF* 算术运算(17)– ADD、SUB、ADC、SBB、CMP、INC、DEC– MUL、IMUL、DIV、IDIV– CBW、CWD– DAA、DAS、AAA、AAS* 逻辑运算与移位操作(13)– AND、OR、XOR、NOT、TEST– SHL、SHR、SAL、SAR– ROL、ROR、RCL、RCR* 控制转移(27)– JMP、Jcc– JCXZ 、LOOP、LOOPZ、LOOPNZ– CALL、RET、INT n、IRET* 串操作(5)– MOVS、CMPS、SCAS、LODS、STOS– REP、REPZ、REPNZ* 处理器控制(9)– CLC、STC、CMC、CLD、STD、CLI、STI– NOP、HLT数据传送指令通用传送指令–MOV、XCHG、XLAT、PUSH、POP 输入输出指令–IN、OUT地址传送指令–LEA、LDS、LES标志传送指令–LAHF SAHF PUSHF POPF通用传送指令mov mov dst, src pop pop dst push push srcxchg xchg dst, srcxlat xlat src_table ;xlat; xlat Table;xlat es:Table(重设段寄存器)输入输出指令in in ac,port out out port,ac 地址传送指令lea lea reg, src lds lds reg,src les les reg,src 标志位传送指令lahfsahfpushfpopf算术运算指令加法指令–ADD、ADC、INC减法指令–SUB、SBB、DEC、NEG、CMP乘除法指令–MUL、IMUL、DIV、IDIV符号扩展指令–CBW、CWD十进制调整指令–AAA、DAA、AAS、DAS、AAM、AAD加法指令add ADD dst,src adc ADC dst,src inc INC dst减法指令sub SUB dst,src sbb SBB dst,src dec DEC dstneg NEG dstcmp CMP dst,src 乘除法指令mul MUL srcimul IMUL srcdiv DIV srcidiv IDIV src符号扩展指令cbw cbwcwd cwd十进制调整指令未组合BCD码加减法调整未组合BCD码乘除法调整组合BCD码加减法调整未组合BCD码加减法调整AAA aaa AAS aas 未组合BCD码乘除法调整AAM aam AAD aad 组合BCD码加减法调整DAA daa DAS das逻辑运算与移位指令逻辑运算指令–AND、OR、NOT、XOR、TEST 移位指令–SHL、SHR、SAL、SAR循环移位指令–ROL、ROR、RCL、RCR逻辑运算指令and AND dst,src test TEST dst,src or OR dst,src xor XOR dst,src not NOT dst移位指令shl SHL dst,1或CL shr SHR dst,1或CL sal SAL dst,1或CL sar SAR dst,1或CL 循环移位指令不带进位的循环移位-小循rol ROL dst,1或CL ror ROR dst,1或CL 带进位的循环移位-大循环rcl RCL dst,1或CL rcr RCR dst,1或CL控制转移指令* 无条件转移指令– JMP* 条件转移指令– JZ/JNZ、JC/JNC、JS/JNS、JP/JNP、JO/JNO– JA/JNA、JB/JNB、JG/JNG、JL/JNL* 循环控制指令– LOOP、LOOPZ、LOOPNZ、JCXZ * 过程调用与返回指令– CALL、RET* 中断指令– INT n、INTO、IRET无条件转移指令jmp JMP label 条件转移指令Jcc label *JZ/JE Jump on Zero/Equal*JNZ/JNE Jump on Not Zero/Equal *JS Jump on Sign*JNS Jump on Not Sign*JP/JPE Jump on Parity/Parity Even*JNP/JPO Jump on NotParity/Parity Odd*JO Jump on Overflow*JNO Jump on Not Overflow *JC/JB/JNAE Jump onCarry/Below/Not Above or Equal *JNC/JNB/JAE Jump on NotCarry/Not Below/Above or Equal *JBE/JNA Jump on Below or Equal/Not Above*JNBE/JA Jump on Not Below or Equal/Above*JL/JNGE Jump on Less/Not Greater or Equal*JNL/JGE Jump on NotLess/Greater or Equal*JLE/JNG Jump on Less orEqual/Not Greater*JNLE/JG Jump on Not Less or Equal/Greater循环控制指令loop LOOP labeljcxz JCXZ labelLOOPZ/LOOPE labelLOOPNZ/LOOPNE label 过程调用与返回指令call CALL labelret RET [ n ]中断指令INT nIRETINTO串操作指令*MOVS *STOS *LODS *CMPS *SCAS *REP *REPZ *REPNZmovs MOVS 目的串,源串MOVSBMOVSWcmps CMPS 源串,目的串scas SCAS 目的串lods LODS 源串stos STOS 目的串rep REPREPZ/REPEREPNZ/REPNE处理器控制指令–控制状态标志位–空操作–暂停控制状态标志位*CLC ; 置CF=0 *STC ; 置CF=1 *CMC ; CF取反*CLD ; 置DF=0 *STD ; 置DF=1 *CLI ; 置IF=0 *STI ; 置IF=1空操作NOP 暂停HLT功能除sahf和popf对标志位有影响外,其余均无影响(dst)<--(src)将sp指示的栈顶两字节数据传送到目的操作数dst中将16位的源操作数压入堆栈(dst)<-->(src)可以写操作数也可不写,表示将bx和al的值相加作为地址找到值放入al(port)-->(ac)将指定源操作数src(必须为存储器寄存器)的16为偏移地址传送到目的操作数(reg)指定的16为通用寄存器中从src指定的存储单元开始,在4个连续存储单元中取出前2字节送到reg,取出后2字节送到DS中。
汇编教程汇编指令详解

汇编教程汇编指令详解
汇编语言可以说是机器语言的一种直观形式,是与硬件直接相关的低
级程序设计语言。
它是一种以简洁的汇编指令来表达操作码机器指令的程
序设计语言,汇编语言的指令代码一般比机器语言的指令代码要短,是编
写高效、可移植的机器级程序的理想语言。
汇编语言的基本构成:
(1)指令集:汇编语言的指令集是机器的最基本和最重要的组成部分,也是机器的指令集,描述了机器所做的操作。
(2)操作数:汇编语言的指令集中涉及到的操作数有多种,比如寄
存器操作数、立即数、内存操作数等。
(3)运算和转移指令:汇编语言中的运算和转移指令包括算术运算
指令、比较指令、逻辑运算指令、移位指令等,它们是机器执行的基本操作。
(4)转移指令:汇编语言中的转移指令可以改变机器指令的执行顺序,并实现分支程序设计。
(5)I/O指令:汇编语言中的I/O指令可以实现与外部设备的通信,获取外部设备提供的数据。
(6)汇编指令:汇编指令用于移植各种汇编程序到不同的处理器上,从而实现程序的机器无关性。
一、MOV指令:
MOV指令用于把操作数的值赋给另一个操作数。
PowerPC汇编指令集简析

PowerPC汇编指令集简析在了解PowerPC汇编指令前,需要先看下编程所用的寄存器模型,PowerPC 系统结构为大多数运算指令都定义了Register-Register的操作,这些操作的源操作数从寄存器取得,或作为嵌入指令操作码中的立即数提供。
这里的e300核可分为用户编程模型和管理员编程模型,该模型有32个GPR、32个FPR、特殊目的寄存器SPR和一些功能寄存器,下图为二者的示意图:上面这些寄存器可能不太好理解,因为名字和Intel汇编不一样,其实,可以这样理解,GPR就相当于EAX/EBX/ECX,而CTR则完全就是ECX的功能,是吧?区别就是没有堆栈而已咯。
CR被分为8段,每段4位,分别代表LT、GT、EQ和SO(小于、大于、等于和溢出);LR用于记录跳转地址;特殊寄存器XER用于记录溢出和进位标志;FPSCR用于记录浮点运算类型和异常等。
再看下指令集,大部分的CPU指令集可分为:数据读写、数值计算、流程控制和设备管理四个部分,由于PowerPC使用RISC,指令字长为32bit,Endian一般是可调的,默认为大端,另外,PowerPC没有栈,所以程序需要自己实现相关操作。
首先为运算和逻辑指令,列举如下:它们与通用寄存器有关,源数据来自GPR 或16 位立即数,目的是GPR 寄存器,操作为32 位,GPR 中存放32 位更新数据。
大多数指令都可以根据字面意思理解其作用,注意还有一个“cntlzw”指令,意为计算字中的第一个0,用于在一个字中找到1时将一个指令中的0的数量找出,它在决定例外寄存器中最高优先服务时有用。
下面是数据读写指令,它们对数据在存储器中核通用寄存器中的传送很有用,若数据小于传送长度(单字,半字或字节),指令会使数据变位为32位,将不同位填0或符号扩展。
指令列举如下:这里需要注意的是上面列举的lbz和lhz两个指令并不完全等同于moval,[ebx]和mov ax,[ebx+10]这两个,因为前面两个是将字节和半字加载到r3时还清空了高位,而后两条指令只是加载数据到eax,并不会清空高位。
汇编语言指令详解大全

汇编语言指令详解大全助记符指令说明字节数周期数(数据传递类指令)MOV A,Rn 寄存器传送到累加器 1 1MOV A,direct直接地址传送到累加器2 1MOV A,@Ri 累加器传送到外部RAM(8 地址)1 1MOV A,#data 立即数传送到累加器 2 1 MOV Rn,A 累加器传送到寄存器 1 1MOV Rn,direct直接地址传送到寄存器2 2MOV Rn,#data累加器传送到直接地址2 1MOV direct,Rn寄存器传送到直接地址2 1MOV direct,direct直接地址传送到直接地址3 2MOV direct,A累加器传送到直接地址2 1MOV direct,@Ri间接RAM 传送到直接地址2 2MOV direct,#data立即数传送到直接地址3 2MOV @Ri,A 直接地址传送到直接地址1 2MOV @Ri,direct直接地址传送到间接RAM2 1MOV @Ri,#data立即数传送到间接RAM2 2MOV DPTR,#data1616 位常数加载到数据指针3 1MOVC A,@A+DPTR代码字节传送到累加器1 2MOVC A,@A+PC 代码字节传送到累加器1 2MOVX A,@Ri 外部RAM(8 地址)传送到累加器1 2MOVX A,@DPTR 外部RAM(16 地址)传送到累加器1 2MOVX @Ri,A 累加器传送到外部RAM(8 地址)1 2MOVX @DPTR,A 累加器传送到外部RAM(16 地址)1 2PUSH direct 直接地址压入堆栈 2 2 POP direct 直接地址弹出堆栈 2 2 XCH A,Rn 寄存器和累加器交换 1 1XCH A,direct直接地址和累加器交换2 1XCH A, @Ri 间接RAM 和累加器交换1 1XCHD A, @Ri间接RAM 和累加器交换低4 位字节1 1 (算术运算类指令)INC A 累加器加1 1 1 INC Rn 寄存器加1 1 1 INC direct 直接地址加1 2 1 INC @Ri 间接RAM 加1 1 1 INC DPTR 数据指针加1 1 2 DEC A 累加器减1 1 1 DEC Rn 寄存器减1 1 1 DEC direct 直接地址减1 2 2 DEC @Ri 间接RAM 减1 1 1MUL AB 累加器和B 寄存器相乘1 4DIV AB 累加器除以B 寄存器 1 4 DA A 累加器十进制调整 1 1ADD A,Rn 寄存器与累加器求和 1 1ADD A,direct 直接地址与累加器求和2 1ADD A,@Ri 间接RAM 与累加器求和1 1ADD A,#data 立即数与累加器求和 2 1ADDC A,Rn 寄存器与累加器求和(带进位)1 1ADDC A,direct 直接地址与累加器求和(带进位)2 1ADDC A,@Ri 间接RAM 与累加器求和(带进位)1 1ADDC A,#data 立即数与累加器求和(带进位)2 1SUBB A,Rn 累加器减去寄存器(带借位)1 1SUBB A,direct 累加器减去直接地址 2 1(带借位)SUBB A,@Ri 累加器减去间接RAM(带借位)1 1SUBB A,#data累加器减去立即数(带借位)2 1 (逻辑运算类指令)ANL A,Rn 寄存器“与”到累加器1 1ANL A,direct 直接地址“与”到累加器2 1ANL A,@Ri 间接RAM“与”到累加器1 1ANL A,#data 立即数“与”到累加器2 1ANL direct,A 累加器“与”到直接地址2 1ANL direct, 立即数“与”到直接 3 2#data 地址ORL A,Rn 寄存器“或”到累加器1 2ORL A,direct 直接地址“或”到累加器2 1ORL A,@Ri 间接RAM“或”到累加器1 1ORL A,#data 立即数“或”到累加器2 1ORL direct,A 累加器“或”到直接地址2 1ORL direct,#data立即数“或”到直接地址3 1XRL A,Rn 寄存器“异或”到累加器1 2XRL A,direct 直接地址“异或”到累加器2 1XRL A,@Ri 间接RAM“异或”到累加器1 1XRL A,#data 立即数“异或”到累加器2 1XRL direct,A 累加器“异或”到直接地址2 1XRL direct,#data立即数“异或”到直接地址3 1CLR A 累加器清零 1 2 CPL A 累加器求反 1 1 RL A 累加器循环左移 1 1RLC A 带进位累加器循环左移1 1RR A 累加器循环右移 1 1RRC A 带进位累加器循环右移1 1SWAP A 累加器高、低4 位交 1 1换(控制转移类指令)JMP @A+DPTR 相对DPTR 的无条件间接转移1 2JZ rel 累加器为0 则转移2 2JNZ rel 累加器为1 则转移2 2CJNE A,direct,rel 比较直接地址和累加器,不相等转移3 2CJNE A,#data,rel 比较立即数和累加器,不相等转移3 2CJNE Rn,#data,rel 比较寄存器和立即数,不相等转移2 2CJNE @Ri,#data,rel 比较立即数和间 3 2接RAM,不相等转移DJNZ Rn,rel 寄存器减1,不为0 则转移3 2DJNZ direct,rel 直接地址减1,不为0 则转移3 2NOP 空操作,用于短暂延时1 1ACALL add11 绝对调用子程序 2 2 LCALL add16 长调用子程序 3 2 RET 从子程序返回 1 2RETI 从中断服务子程序返回1 2AJMP add11 无条件绝对转移 2 2 LJMP add16 无条件长转移 3 2 SJMP rel 无条件相对转移 2 2(布尔指令)CLR C 清进位位 1 1 CLR bit 清直接寻址位 2 1 SETB C 置位进位位 1 1 SETB bit 置位直接寻址位 2 1 CPL C 取反进位位 1 1 CPL bit 取反直接寻址位 2 1ANL C,bit 直接寻址位“与”到进位位2 2ANL C,/bit 直接寻址位的反码“与”到进位位2 2ORL C,bit 直接寻址位“或”到进位位2 2ORL C,/bit 直接寻址位的反码“或”到进位位2 2MOV C,bit 直接寻址位传送到进位位2 1MOV bit, C 进位位位传送到直接 2 2寻址JC rel 如果进位位为1 则转移2 2JNC rel 如果进位位为0 则转移2 2JB bit,rel如果直接寻址位为1则转移3 2JNB bit,rel如果直接寻址位为0则转移3 2JBC bit,rel直接寻址位为1 则转移并清除该位2 2(伪指令)ORG 指明程序的开始位置DB 定义数据表DW 定义16 位的地址表EQU 给一个表达式或一个字符串起名DATA 给一个8 位的内部RAM起名XDATA 给一个8 位的外部RAM 起名BIT 给一个可位寻址的位单元起名END 指出源程序到此为止(指令中的符号标识)Rn 工作寄存器R0-R7Ri 工作寄存器R0 和R1@Ri 间接寻址的8 位RAM 单元地址(00H-FFH)#data8 8 位常数#data16 16 位常数addr16 16 位目标地址,能转移或调用到64KROM 的任何地方addr11 11 位目标地址,在下条指令的2K 范围内转移或调用Rel 8 位偏移量,用于SJMP 和所有条件转移指令,范围-128~+127Bit 片内RAM 中的可寻址位和SFR 的可寻址位Direct 直接地址,范围片内RAM 单元(00H-7FH)和80H-FFH$ 指本条指令的起始位置。
汇编语言指令集

汇编语言指令集汇编语言程序设计1.1 8086微处理器的寻址方式为了找到操作数所存放的位置的操作成为寻址方式。
8086汇编语言共有四种寻址方式。
8086CPU内部寄存器可用助记符表示如下:8位寄存器名称;AL,AH,BL,BH,CL,CH,DL,DH.16位寄存器名称;AX, BX, CX,DX, SI, DI,SP,BP.段寄存器名称:CS,DS,ES,SS。
3. 2.1 立即数寻址立即数寻址方式指令中包含有操作数,此类指令一般用于对CPU 中的寄存器赋值。
例如:MOV AL,8 ;将8位数据送到寄存器AL中MOV AX,16H ;将16位的数据0016H送到寄存器AX中,因为AX寄存器;是16位的,它由AH和AL组成,执行这条指令后AH 中内;容为00,AL中内容为16H。
所以(AX)= 0016H立即数寻址的特点是数据直接在指令中给出,操作直接在CPU中进行,不需要总线周期。
3.2.2寄存器寻址寄存器寻址指操作数在指令的寄存器中。
此类指令的操作都在CPU内部的寄存器中进行,所以执行时间短。
例如:ADD AL,BL ;把寄存器AL中内容和寄存器BL中内容相加的结果送AL寄存器寄存器寻址的特点是,操作在CPU的寄存器间进行,不需要总线周期。
3.2.3直接寻址直接寻址指操作数在CPU外部的存储器中.需要通过数据总线才能把数据取出进行操作。
例如:MOV AL,[2010] ;把内存2010单元中的内容送到CPU的AL 寄存器中直接寻址的特点是指令中有个操作数在内存中,指令执行时需要总线周期操作。
3.2.4寄存器间接寻址寄存器间接寻址指操作数以寄存器中的内容作为地址指向内存的某一单元。
例如:MOV AL,[BX] ;以BX中的内容作为内存单元的地址,把该内存单元中的可用于寄存器间接寻址的寄存器为BX,BP,DI,SI.3.3 8086汇编指令系统3.3.1 可执行指令1,传送类指令传送指令用于实现CPU个寄存器之间,CPU的各寄存器和存储器之间,CPU 的各寄存器和输入/输出的个端口之间进行数据传递。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十三讲PSoC汇编语言指令集微处理器能执行的所有指令的集合称为指令系统。
所谓机器语言就是指令的二进制编码表示,而汇编语言则是指令的符号表示。
微处理器只能识别二进制数,因此只有用二进制表示的机器语言,微处理器能直接执行,用机器语言编写的程序称手编程序。
鉴于机器语言具有程序长、不易书写、难于阅读和维护、容易出错且不容易查找等缺点,为此使用带有一定意义的符号来表示指令,通常把表示指令的符号称之为助记符。
以助记符表示的指令就是汇编语言,使用汇编语言编写的程序称汇编程序。
指令系统是由生产厂商定义的,不同厂商针对不同的微处理器所定义的专用指令系统不同,PSoC也一样,因此这类用汇编语言编写的程序没有通用性,无法直接移植。
由于PSoC 是采用M8C内核,不同于Intel ×86处理器,因此要掌握和应用PSoC,用户必须学习它的指令系统,区别它与Intel×86以及其它处理器指令系统的不同。
M8C指令集中共包含136条指令,按其功能划分为6类:分别是算术运算类指令、逻辑运算类指令、移位类指令、数据传送类指令、转移控制类指令以及处理器类指令。
13.1 算术运算类指令1. 不带进位加法指令ADD功能:计算两个操作数的和,并将结果替代第一个操作数。
如果它们的和大于255,那么标志寄存器CF位置1;如果它们的和等于0,那么标志寄存器中的ZF位将置1。
指令ADD SP,expr(表达式)在任何情况下均不影响标志寄存器。
相关指令格式如表13.1所示。
表13.1ADD指令例1: mov A, 0x0A ;初始化累加器A = 0x0Aadd A, 0xF0 ;结果A=0xF0add A, 0x06 ;结果A=0, CF=1, ZF=1例2: mov A, 0x0A ;初始化累加器A= 0x0Aadd A, 0xF0 ;结果A=0xF0add A, 0x07 ;结果A=1, CF=1, ZF=0add A, 0x05 ;结果A=6, CF=0, ZF=0例3: mov A, 0x0A ;初始化累加器A =0x0Aswap A, SP ; SP= 0x0Aadd SP, 0xF0 ;结果SP=0xF0add SP, 0x06 ;结果SP=0, CF不变, ZF不变2. 不带进位减法指令SUB功能:第一个操作数减去第二个操作数,结果代替第一个操作数中的值。
如果结果为0,那么ZF位将置1,否则清零;如果结果小于0,CF位将被置1。
相关指令格式如表13.2所示。
表13.2SUB指令例1: mov A, 0 ;累加器A清零or F, 0x04 ;设置CFsub A, 0x0C ;A= 0xF3例2: mov [0x39], 2 ;初始化ram[0x39]=0x02mov [0x40],0xFF ;初始化ram[0x40]=0xffinc [0x40] ;ram[0x40]=0x00, CF=1sub [0x39], 0 ;ram[0x39]=0x023. 带进位加法指令ADC功能:计算两个操作数的和,同时加上标志寄存器F中的进位标志CF,然后将结果放在其中一个操作数中。
如果和的结果超过255,那么进位标志CF置1;如果和的结果为0,那么标志寄存器F中的零标志ZF位置1。
相关指令格式如表13.3所示。
表13.3ADC指令例1: mov A, 0 ;累加器A清零or F, 0x04 ;设置CF位adc A, 0x12 ;累加器值0x13例2: mov [0x39], 0 ;初始化ram[0x39]=0x00mov [0x40], FFh ;初始化ram[0x40]=0xFFinc [0x40] ;ram[0x40]=0x00, CF=1, ZF=1adc [0x39], 0 ;ram[0x39]=0x01, CF=0, ZF=04. 带进位减法指令SBB功能:第一个操作数减去第二个操作数与进位CF之和,结果将代替第一个操作数中的值。
如果结果为0,那么ZF位置1,否则清零;如果结果小于0,则CF位置1。
相关指令格式如表13.4所示。
表13.4SBB指令例1: mov A, 0 ;累加器A清零or F, 0x04 ;设置CFsbb A, 0x0C ;A= 0xF2例2: mov [0x39], 2h ;初始化ram[0x39]=0x02mov [0x40], FFh ;初始化ram[0x40]=0xffinc [0x40] ;ram[0x40]=0x00, CF=1sbb [0x39], 0 ;ram[0x39]=0x015. 增量指令INC功能:操作数中的值被加1,如果其结果为0(起始值为0xFF),那么ZF和CF位将置1。
相关指令格式如表13.5所示。
表13.5INC指令例1: mov A, 0x00 ;初始化累加器A= 0or F, 0x06 ;将CF和ZF 置1inc A ;A=0x01, CF=0, ZF=0例2: mov A, 0xFF ;初始化累加器A = 0and F, 0x00 ;所有标志为清零inc A ;A=0x00, CF=1, ZF=16. 减量指令DEC功能:操作数被减1,如果他们的结果为-1(起始值为0),那么CF置1。
如果结果为0(起始值为1),那么ZF位置1。
相关指令格式如表13.6所示。
表13.6DEC指令例: mov [0xEB], 3loop2: ;循环将被执行3次dec [0xEB]jnz loop2 ;当零标志位ZF由DEC指令置1时,程序将不会发生跳转,即循环计数器[oxEB]减至0时。
7. 比较指令CMP功能:第一个操作数减去第二个操作数,如果差值小于0则CF位置1,如果他们的差值等于0,那么ZF位被置1。
该指令不更改操作数的值。
相关指令格式如表13.7所示。
表13.7CMP指令例: mov A, 34 ;初始化累加器A= 34cmp A, 33 ;A>=34 CF = 0, A != 33 ZF =0cmp A, 34 ;A=34 CF= 0, ZF =1cmp A, 35 ;A<35 CF = 1, A != 35 ZF =013.2 逻辑运算类指令1. 逐位逻辑与指令AND功能:两个变量进行逐位逻辑与,结果将替代第一操作数中的值。
其中只有AND F, expr 才会影响标志寄存器中零位和进位。
注意AND、OR和XOR以及类似指令是读写指令,当用这个指令操作寄存器时,要确保该寄存器是可读可写的,否则会产生异常。
相关指令格式如表13.8所示。
表13.8AND指令例1: and A, 0x00 ;A=0, CF不变, ZF=1例2: and F, 0x00 ;F=0 ,CF=0, ZF=02. 逐位逻辑或指令OR功能:两个变量进行逐位逻辑或,其结果将替代第一操作数的值。
其中只有OR F,expr 才会影响标志寄存器中零标志位ZF和进位CF。
相应指令格式如表13.9所示。
表13.9OR指令例1: mov A, 0x00or A, 0xAA ;A=0xAA, CF不变, ZF=0例2: and F, 0x00or F, 0x01 ;F=1 因此CF=0, ZF=03. 逐位逻辑异或指令XOR功能:将两个操作数进行逻辑异或操作。
如果结果为0,则ZF位置1,否则清零。
只有XOR F,expr才会影响CF位。
相关指令格式如表13.10所示。
表13.10XOR指令例1: mov A, 0x00xor A, 0xAA ;A=0xAA, CF不变, ZF=0例2: and F, 0x00 ;F=0xor F, 0x01 ;F=1 ,CF=0, ZF=0例3: mov A, 0x5Axor A, 0xAA ;A=0xF0, CF不变, ZF=04. 累加器求反指令CPL功能:将累加器A中的值逐位求反,然后将结果存储在累加器中。
CF位不受影响,如果结果为0,则ZF位被置1。
相关指令格式如表13.11所示。
表13.11CPL指令例1: mov A, 0xFFcpl A ;A=0x00, ZF=1例2: mov A, 0xA5cpl A ;A=0x5A, ZF=0例3: mov A, 0xFEcpl A ;A=0x01, ZF=05. 屏蔽测试指令TST功能:将两个变量进行逻辑与操作,但变量1的值不受指令的影响。
如果其结果是0,则ZF位将置1,否则清零。
CF位不受该指令的影响。
相关指令格式如表13.12所示。
表13.12TST指令例: mov [0x00], 0x03tst [0x00], 0x02 ;CF=0, ZF=0tst [0x00], 0x01 ;CF=0, ZF=0tst [0x00], 0x03 ;CF=0, ZF=0tst [0x00], 0x04 ;CF=0, ZF=113.3 移位类指令1. 算术左移指令ASL功能:将变量所有位依次左移一位,第7位被载入到标志寄存器F的进位标志CF中,第0位用0来补充,如图13.1所示。
图13.1算术左移如果左移结果为0,那么ZF就置1,否则清零。
相关指令格式如表13.13所示。
例1: mov A, 0x7F ;初始化累加器A =0x7Fasl A ;A=0xFE, CF=0, ZF=0例2: mov A,0xAAmov [0xEB], A ;初始化RAM[0xEB]= 0xAAasl [0xEB] ;ram[0xEB]=0x54, CF=1, ZF=02. 算术右移指令ASR功能:将变量中的所有位依次右移一位,第7位保持不变,而第0位将被移到标志寄存器F的进位标志CF中,如图13.2所示。
图13.2算术右移如果右移结果为0,那么ZF就置1,否则为0。
如果在右移之前操作数的最低位为1,那么CF就置1。
相关指令格式如表13.14所示。
例1: mov A, 0x00 ;初始化累加器A = 0and F, 0x00 ;确定清除所有的标志位asr A ;A=0, CF=0, ZF=1例2: mov A, 0xFF ;初始化累加器A = 255and F, 0x00 ;确定清除所有的标志位asr A ;A=0xFF, CF=1, ZF=0例3: mov A, 0xAA ;初始化A =0xAAand F, 0x00 ;确定清除所有的标志位asr A ;A=0xD5, CF=0, ZF=03. 带进位左循环移位指令RLC功能:变量中所有位依次左移一位,同时0位由CF位中的值代替,最高位则移入标志寄存器F的进位标志CF中,如图13.1所示。
图13.3带进位左循环移位相关指令格式如表13.15所示。
例: and F, 0xFB ;清除CF位mov A, 0x7F ;初始化A = 0x7Frlc A ;A=0xFE, CF=0, ZF=04. 带进位右循环移位指令RRC功能:变量中所有位依次右移一位,同时最高位由CF位中的值代替,最低位则移入F 的进位标志CF中。