第十三讲 PSoC汇编语言指令集
- 格式:doc
- 大小:649.00 KB
- 文档页数:22
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 系统结构为大多数运算指令都定义了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 的各寄存器和输入/输出的个端口之间进行数据传递。
CPU中的寄存器寄存器是CPU内部重要的数据存储资源,是汇编程序员能直接使用的硬件资源之一。
由于寄存器的存取速度比内存快,所以,在用汇编语言编写程序时,要尽可能充分利用寄存器的存储功能。
CPU中的寄存器主要包括:各寄存器的作用:1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
对低16位数据的存取,不会影响高16位的数据。
这些低16位寄存器分别命名为:AX、BX、CX 和DX,它和先前的CPU中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
寄存器AX和AL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。
累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;寄存器BX称为基地址寄存器(Base Register)。
它可作为存储器指针来使用;寄存器CX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器DX称为数据寄存器(Data Register)。
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
详细内容请见第3.8节——32位地址的寻址方式。
2、变址寄存器32位CPU有2个32位通用寄存器ESI和EDI。
汇编语言指令集 1.算术运算符 ADC:带进位加法 ADD:二进制数加法 DEC:减一DIV:无符号数除法 IDIV:带符号数(整数除法 IMUL:带符号数(整数乘法 INC:加一MUL:无符号书乘法 NEG:求补 SBB:带借位减法 SUB:二进制减法 XADD:交换并相加 2.ASCII-BCD转换 AAA:加后ASCII调整 AAD:除前ASCII调整 AAM:乘后ASCII调整 AAC:减后ASCII调整 DAA:加后十进制调整 DAS:减后十进制调整 3.移位 RCL:带进位循环左移 RCR:带进位循环右移 ROL:循环左移 ROR:循环右移 SAL:算术左移 SAR:算术右移 SHL:逻辑左移 SHR:逻辑右移 SHLD:双精度左移 SHRD:双精度右移 4.比较 BSF/BSR:位扫描 BT/BTC/BR/BB:位测试 CMP:比较 CMPSN:串比较 CMPXCHG:比较交换 CMPXCHG8B:比较并换?lt;br>TEST:测试位 5.数据传送LDS:装如数据段寄存器 LEA:装入有效地址 LES:装入附加段寄存器 LODS:从串取LSS:装入堆栈段寄存器 MOV:传送数据 MOVS:串传送 MOVSX:带符号扩展传送MOVZX:带零扩展传送 STOS:存入串 XCHG:交换 XLAT:换码 6.标志操作 CLC:清除位标志 CLD:清除方向标志 CLI:清除中断标志 CMC:进位标志求反 LAHF:标志送AH POPF:标志出栈 PUSHF:标志进栈 SAHF:AH送标志寄存器 STC:进位标志置1 CTD:方向标志置1 STI:中断标志置1 7.输入/输出 IN:输入字节或字 INSN:串输入OUT:输出字节或字 OUTSN:穿输出 8.逻辑操作 AND:逻辑与 NOT:逻辑非 OR:逻辑或 XOR:异或 9.循环 LOOP:循环直到完成 LOOPE:相等时循环 LOOPZ:为零是循环LOOPNE:不相等时循环 LOOPPNZ:不为零是循环 LOOPPNEW:不相等时循环LOOPNZW:不为零时循环 10.处理器控制 HLT:进入暂停状态 LOCK:封锁总线 NOP:无操作 WAIT:置处理器于等待状态 11.堆栈操作 ENTER:建立堆栈帧 LEAVE:结束堆栈帧 POP:字出栈 POPF:标志出栈 POPA:所有通用寄存器出栈 PUSH:字进栈PUSHA:所有通用积存器进栈 PUSHF:标志进栈 12.串操作 CMPS:串比较 LODS:从串取 MOVS:串传送 REP:串重复 REPE:相等时重复 REPZ:为零时重复 REPNE:不相等时重复 REPNZ:不为零时重复 SCAS:串扫描 STDS:存入串 13.转移(条件 INT溢出中断 JA:高于则转移 JAE:高于或等于则转移 JB:低于则转移 JBE:低于或等于则转移JC:进位为1则转移 JCXZ:CX为零则转移 JE:相等则转移 JG:大于则转移 JGE:大于或等于则转移 JL:小于则转移 JLE:小于或等于 JNC:进位为零则转移 JNE:不相等则转移 JNG:不大于则转移 JNGE:不大于或等于则转移 JNL:不小于则转移 JNLE:不小于或等于则转移 JNA:不高于则转移 JNB:不低于则转移 JNBE:不低于或等于则转移JNAE:不高于或等于则转移 JN不溢出则转移 JNP:奇偶位为0则转移 JNZ:结果不为零则转移 JNS:结果为正则转移 J若溢出则转移 JP:奇偶位为1则转移 JPE:奇偶性为偶则转移 JP奇偶性为奇则转移 JS:结果为负则转移 JZ:结果为零则转移 14.转移(无条件 CALL:调用过程 INT:中断 IRET:中断返回 JMP:无条件转移 RET:返回 RETN/RETF:近返回/远返回 15.类型转换 CBW:字节转换为字 CDQ:双字转换为四字 CWD:字转换为双字CWDE:字转换为扩展的双字。
1. 通用数据传送指令•MOV 传送字或字节•MOVSX 先符号扩展,再传送•MOVZX 先零扩展,再传送•PUSH 把字压入堆栈•POP 把字弹出堆栈•PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI 依次压入堆栈•POPA 把DI,SI,BP,SP,BX,DX,CX,AX 依次弹出堆栈•PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI 依次压入堆栈•POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX 依次弹出堆栈•BSWAP 交换32位寄存器里字节的顺序XCHG 交换字或字节•(至少有一个操作数为寄存器,段寄存器不可作为操作数)CMPXCHG 比较并交换操作数•(第二个操作数必须为累加器AL/AX/EAX )XADD 先交换再累加•(结果在第一个操作数里)XLAT 字节查表转换•――BX指向一张256字节的表的起点,AL为表的索引值(0-255,即0-FFH);返回AL 为查表结果•( [BX+AL]->AL )2. 输入输出端口传送指令•IN I/O端口输入•(语法:IN累加器,{端口号丨DX})OUT I/O端口输出•(语法:OUT {端口号丨DX}累加器)输入输出端口由立即方式指定时,其范围是0-255;由寄存器DX指定时,其范围是0-65535.3. 目的地址传送指令•LEA 装入有效地址•例:LEA DX,stri ng ;把偏移地址存到DX.LDS 传送目标指针,把指针内容装入DS.例:LDS SI,string 把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES.例:LES DI,string 把段地址:偏移地址存到ES:DI.LFS 传送目标指针,把指针内容装入FS.例:LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送目标指针,把指针内容装入GS.例:LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送目标指针,把指针内容装入SS.例:LSS DI,string 把段地址:偏移地址存到SS:DI.4. 标志传送指令•LAHF 标志寄存器传送,把标志装入AH. SAHF 标志寄存器传送,把AH内容装入标心寄存PUSHF 标志入栈•POPF 标志出栈•PUSHD 32位标志入栈•POPD二、算术运算指令32位标志出栈.ADD 加法.ADC 带进位加法.INC 加1.AAA 加法的ASCII码调整.DAA 加法的十进制调整.SUB 减法.SBB 带借位减法.DEC 减1.NEC 求反(以0减之).CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的十进制调整.MUL 无符号乘法.IMUL 整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算), AAM 乘法的ASCII码调整.DIV 无符号除法.IDIV 整数除法.以上两条,结果回送:或商回送AL,余数回送AH,(字节运算); 商回送AX,余数回送DX,(字运算).AAD 除法的ASCII码调整.CBW 字节转换为字.(把AL中字节的符号扩展到AH中去)CWD 字转换为双字.(把AX中的字的符号扩展到DX中去)CWD E 字转换为双字.(把AX中的字符号扩展到EAX中去)CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令AND 与运算.OR 或运算.XOR 异或运算.NOT 取反.TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).SHL 逻辑左移.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移•ROR 循环右移•RCL 通过进位的循环左移RCR 通过进位的循环右移以上八种移位指令,其移位次数可达255次.移位一次时,可直接用操作码. 如SHL AX,1.移位>1次时,则由寄存器CL给出移位次数.女口MOV CL,04SHL AX,CL四、串指令DS:SI 源串段寄存器:源串变址•ES:DI目标串段寄存器:目标串变址•CX 重复次数计数器AL/A X 扫描值•D标志0表示重复操作中SI和DI应自动增量;1表示应自动减量•Z标志用来控制扫描或比较操作的结束MOVS 串传送•(MOVSB 传送字符•MOVSW 传送字•MOVSD 传送双字•)CMPS 串比较•(CMPSB 比较字符•CMPSW 比较字•)SCAS 串扫描•把AL或AX的内容与目标串作比较,比较结果反映在标志位•LODS 装入串•把源串中的元素(字或字节)逐一装入AL或AX中•(LODSB 传送字符• LODSW 传送字• LODSD 传送双字.)STOS 保存串•是LODS的逆过程•REP 当CX/ECX<>0 时重复•REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0 时重复•REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0 时重复•REPC 当CF=1 且CX/ECX<>0 时重复•REPNC 当CF=0 且CX/ECX<>0 时重复•五、程序转移指令1>无条件转移指令(长转移)JMP 无条件转移指令CALL 过程调用RET/RETF过程返回2>条件转移指令(短转移,-128到+127的距离内)(当且仅当(SF XOR OF)=1 时,0P1<0P2 )JA/JNBE不小于或不等于时转移.JAE/JNB大于或等于转移.JB/JNAE 小于转移.JBE/JNA小于或等于转移.以上四条,测试无符号整数运算的结果(标志C和Z).JG/JNLE 大于转移.JGE/JNL大于或等于转移.JL/JNGE 小于转移.JLE/JNG小于或等于转移.以上四条,测试带符号整数运算的结果(标志S,0和Z).JE/JZ 等于转移•JNE/JN Z 不等于时转移•JC 有进位时转移•JNC 无进位时转移•JNO 不溢出时转移•JNP/JP O 奇偶性为奇数时转移•JNS 符号位为"0"时转移•JO 溢出转移•JP/JPE 奇偶性为偶数时转移•JS 符号位为"1"时转移•3>循环控制指令(短转移)LOOP CX不为零时循环LOOPE/LOOPZ CX不为零且标志Z=1时循环.LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.JCXZ CX为零时转移•JECXZ ECX为零时转移•4>中断指令INT 中断指令INTO 溢出中断IRET 中断返回5>处理器控制指令HLT 处理器暂停,直到出现中断或复位信号才继续•WAIT 当芯片引线TEST为高电平时使CPU进入等待状态ESC 转换到外处理器•LOCK 封锁总线•NOP 空操作.STC 置进位标志位•CLC 清进位标志位•CMC 进位标志取反.STD 置方向标志位•CLD 清方向标志位•STI 置中断允许位.CLI 清中断允许位.六、伪指令DW 定义字(2字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段.ASSUM建立段寄存器寻址.EENDS 段结束.END 程序结束.。
8051系列单片机汇编语言指令速查表(汇编语言的111条指令)分类:程序语言编号指令名称指令助记符指令说明数据传送类指令1 一般传送 MOV A, #data 将立即数#data送累加器A2 MOV direct, #data 将立即数#data送片内RAM direct地址单元内3 Mov Rn, #data 将立即数#data送寄存器Rn4 Mov @Ri, #data 寄存器Ri内为RAM地址,将立即数#data送该地址单元内5 Mov direct2, direct1 将direct1地址单元的数据送 direct2地址单元内6 Mov direct, rn 将Rn的数据送 direct地址单元内7 Mov Rn, direct 将direct地址单元内的数据送Rn寄存器8 Mov direct, @Ri 寄存器Ri内为RAM地址,将该地址单元内的数据送direct 地址单元内9 Mov @Ri, direct 寄存器Ri内为RAM地址,将direct地址单元内的数据送该地址单元内10 Mov A, Rn 将寄存器Rn内的数据送累加器A11 Mov Rn, A 将累加器A内的数据送寄存器Rn12 Mov A, direct 将direct地址单元内的数据送累加器A13 Mov direct, A 将累加器A内的数据送direct地址单元内14 Mov A, @Ri 寄存器Ri内为RAM地址,将该地址单元内的数据送累加器A15 Mov @Ri , A 寄存器Ri内为RAM地址,将累加器A的数据送该地址单元内16 目的地址传送 Mov DPTR, #data16 将16位立即数送数据指针DPTR寄存器17 字节交换 SWAP A 累加器A高低4位数据交换18 XCH A, Rn 将累加器A数据和寄存器Rn内的数据交换19 XCH A, direct 将累加器A数据和direct地址单元内的数据交换20 XCH A, @Ri 寄存器Ri内为RAM地址,将该地址单元内的数据与累加器A的数据交换21 XCHD A, @Ri 寄存器Ri内为RAM地址,将该地址单元内的数据低4位与的低4位交换22 与外部RAM传送 MOVX @DPTR, A 将累加器A的数据送数据指针DPTR寄存器所指外部RAM地址单元内23 MOVX A , @DPTR 将DPTR寄存器所指外部RAM地址单元内的数据送累加器A24 MOVX A, @Ri 寄存器Ri内为片外RAM地址,将该地址单元内的数据送累加器A25 MOVX @Ri, A 寄存器Ri内为片外RAM地址,将该地址单元内的数据送累加器A26 与ROM传送 MOVC A, @A+DPTR A+DPTR构成ROM地址,将该地址内的数据送累加器A内27 MOVC A, @A+PC A+PC构成ROM地址,将该地址内的数据送累加器A内28 栈操作 PUSH direct 堆栈指针SP自加1后,将direct地址单元的数据压进堆栈,29 POP direct 堆栈的数据送direct地址单元中,后堆栈指针减1,算术运算指令30 加法指令 ADD A, Rn 将寄存器Rn与累加器A的数据相加后,结果保存到累加器A31 ADD A, direct 将direct地址单元内的数据与累加器A的数据相加后结果保存到累加器A32 ADD A, @Ri 寄存器Ri内位地址,将该地址单元内的数据与累加器A的数据相加后结果保存到累加器A33 ADD A, #data 将立即数与累加器A的数据相加后结果保存到累加器A34 带进位加法 ADDC A, Rn 将寄存器Rn与累加器A的数据相加,再加上进位标志内的值后,结果保存到累加器A35 ADDC A, direct 将direct地址单元内的数据与累加器A的数据相加,再加上进位标志内的值后,结果保存到累加器A36 ADDC A, @Ri 寄存器Ri内为RAM地址,将该地址单元内的数据与累加器A 的数据相加,再加上进位标志内的值后,结果保存到累加器A37 ADDC A, #data 将立即数与累加器A的数据相加,再加上进位标志内的值后结果保存到累加器A38 带借位减法 SUBB A, Rn 将与累加器A的数据减去寄存器Rn的数据,再减去进位标志内的值,结果保存到累加器A39 SUBB A, direct 将与累加器A的数据减去direct地址单元内的数据,再减去进位标志内的值,结果保存到累加器A40 SUBB A, @Ri 寄存器Ri内为RAM地址,将累加器A的数据减去该地址单元内的数据,再减去进位标志内的值后,结果保存到累加器A41 SUBB A, #data 将累加器A的数据减去立即数,再减去进位标志内的值后,结果保存到累加器A42 加1指令 INC A 累加器A的值自加143 INC Rn 寄存器Rn的值自加144 INC direct direct地址单元内值自加145 INC @Ri 寄存器Ri内为RAM地址,该地址单元内的值自加146 INC DPTR 数据指针寄存器DPTR内的值自加147 减1指令 DEC A 累加器A的值自减148 DEC Rn 寄存器Rn的值自减149 DEC direct direct地址单元内的值自减150 DEC @Ri 寄存器Ri内为RAM地址,该地址单元内的值自减151 乘法 MUL AB 累加器A与寄存器B内的值相乘,乘积的高8位保存在B寄存器,低8位保存在累加器A中52 除法 DIV AB 累加器A的值除以寄存器B的值,商保存在累加器A中,余数保存在B寄存器53 二-十进制调整 DA A 对累加器A的结果进行十进制调整逻辑运算指令54 逻辑与 ANL A, Rn 将累加器A的值和寄存器Rn的值进行与操作,结果保存到累加器A中55 ANL A, direct 将累加器A的值和direct地址单元内的值进行与操作,结果保存到累加器A中56 ANL A, @Ri 寄存器Ri内为RAM地址,将累加器A的值和该地址单元内的值进行与操作,结果保存到累加器A中57 ANL A, #data 将累加器A的值和立即数进行与操作,结果保存到累加器A 中58 ANL direct, A 将累加器A的值和direct地址单元内的值进行与操作,结果保存到direct地址单元内59 ANL direct, #data 将立即数和direct地址单元内的值进行与操作,结果保存到direct地址单元内60 逻辑或 ORL A, Rn 将累加器A的值和寄存器Rn的值进行或操作,结果保存到累加器A中61 ORL A, direct 将累加器A的值和direct地址单元内的值进行或操作,结果保存到累加器A中62 ORL A, @Ri 寄存器Ri内为RAM地址,将累加器A的值和该地址单元内的值进行或操作,结果保存到累加器A中63 ORL A, #data 将累加器A的值和立即数进行或操作,结果保存到累加器A 中64 ORL direct, A 将累加器A的值和direct地址单元内的值进行或操作,结果保存到direct地址单元内65 ORL direct, #data 将立即数和direct地址单元内的值进行或操作,结果保存到direct地址单元内66 逻辑异或 XRL A, Rn 将累加器A的值和寄存器Rn的值进行异或操作,结果保存到累加器A中67 XRL A, direct 将累加器A的值和direct地址单元内的值进行异或操作,结果保存到累加器A中68 XRL A, @Ri 寄存器Ri内为RAM地址,将累加器A的值和该地址单元内的值进行异或操作,结果保存到累加器A中69 XRL A, #data 将累加器A的值和立即数进行异或操作,结果保存到累加器A 中70 XRL direct, A 将累加器A的值和direct地址单元内的值进行异或操作,结果保存到direct地址单元内71 XRL direct, #data 将立即数和direct地址单元内的值进行异或操作,结果保存到direct地址单元内72 按位取反 CPL A 累加器A的值按位取反73 累加器清零 CLR A 累加器A清074 逻辑右移 RR A 累加器A的值循环右移1位75 逻辑左移 RL A 累加器A的值循环左移1位76 带进位右移 RRC A 累加器A的值带进位循环右移1位77 带进位左移 RLC A 累加器A的值带进位循环左移1位控制转移指令78 无条件转移 SJMP rel rel为地址偏移量,PC加2后的地址加上rel作为目标地址,程序跳到目标地址继续运行79 AJMP addr11(a10- a0) addr11为11位地址,PC加2后的地址高5位与指令中的低11位地址构成目标地址,程序跳到目标地址继续运行80 LJMP addr16 将addr16的16位地址送程序计数器PC,使机器执行下一条指令时无条件转移到addr16处执行程序81 JMP @A+DPTR 目标地址的基地址放在DPTR中,目标地址对基地址的偏移量放在累加器A中,它们相加构成目标地址82 条件转移 JZ rel If(累加器A=0)则PC加2再加上rel作为目标地址83 JNZ rel If(累加器A!=0)则PC加2再加上rel作为目标地址84 CJNE A, direct, rel If(累加器A!= direct地址单元的值)则PC加2再加上rel作为目标地址85 CJNE A, #data, rel If(累加器A!= 立即数)则PC加2再加上rel作为目标地址86 CJNE Rn, #data, rel If(寄存器Rn的值!= 立即数)则PC加2再加上rel 作为目标地址87 CJNE @Ri, #data, rel 寄存器Ri内为RAM地址,If(该地址单元的值!= 立即数)则PC加2再加上rel作为目标地址88 循环转移 DJNZ Rn, rel 寄存器Rn的值减1后,If(寄存器Rn的值!=0)则PC加2再加上rel作为目标地址89 DJNZ direct, rel Direct地址单元的值减1后,If(该值!=0)则PC加3再加上rel作为目标地址90 布尔条件转移 JC rel If(CY=1)则PC加2再加上rel作为目标地址91 JNC rel If(CY=0)则PC加2再加上rel作为目标地址92 JB bit, rel If(bit位=1)则PC加3再加上rel作为目标地址93 JNB bit, rel If(bit位=0)则PC加3再加上rel作为目标地址94 JBC bit, rel If(bit位=1)则PC加3再加上rel作为目标地址,且bit位清095 调用指令 ACALL addr11 addr11为11位地址,PC加2后的地址PUSH进堆栈,再将PC的地址高5位与指令中的低11位地址构成目标地址,程序跳到目标地址继续运行96 LCALL addr16 PC加3后的地址PUSH进堆栈,再将16位地址送PC作为目标地址,程序跳到目标地址继续运行97 返回指令 RET 子程序返回指令,把堆栈中的地址恢复到PC中使程序回到调用处98 RETI 中断程序返回指令,把堆栈中的地址恢复到PC中使程序回到调用处99 空操作 NOP 空操作位操作指令100 布尔传送 MOV C, bit 将bit位地址中的值送PSW中的进位标志位CY101 MOV bit, C 将PSW中的进位标志位CY的值送bit位地址中102 位清0 CLR C 将进位标志位CY清0103 位清0 CLR bit 将bit位地址内清0104 位置1 SETB C 将进位标志位CY置1105 SETB bit 将bit位地址内置1106 位与 ANL C, bit 将Cy和bit位地址中的值进行与操作后,结果送Cy 107 ANL C, /bit bit位地址中的值取反后再与Cy进行与操作,结构送Cy108 位或 ORL C, bit 将Cy和bit位地址中的值进行或操作后,结果送Cy109 ORL C, /bit bit位地址中的值取反后再与Cy进行或操作,结构送Cy 110 位取反 CPL C 将Cy取反111 CPL bit 将bit位地址的值取反说明:1)Ri, Rn指当前工作寄存器,i,n = 0 – 7,当前工作寄存器由程序状态字寄存器PSW的2个位RS1, RS0决定。
汇编指令集详细解释The assembly instruction set is a fundamental component of computer architecture, consisting of a collection of low-level instructions that directly control the operations of a computer's hardware. Each instruction performs a specific task, such as moving data between memory and registers, performing arithmetic or logical operations, or controlling the flow of execution.汇编指令集是计算机体系结构的基本组成部分,它由一组低级指令组成,直接控制计算机硬件的操作。
每条指令执行特定的任务,例如在内存和寄存器之间移动数据、执行算术或逻辑运算,或控制执行流程。
The assembly language, which utilizes this instruction set, provides a more direct and efficient way for programmers to interact with the machine than high-level languages. It allows fine-grained control over hardware resources, making it particularly useful in low-level system programming, embedded systems, andperformance-critical applications.汇编语言利用这一指令集,为程序员提供了一种比高级语言更直接、更高效的与机器交互的方式。
汇编语言常用指令大全解释汇编语言常用指令大全解释常用汇编指令:MOV指令为双操作数指令,两个操作数中必须有一个是寄存器.MOV DST , SRC // Byte / Word执行操作: dst = src1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器).2.立即数不能直接送段寄存器3.不允许在两个存储单元直接传送数据4.不允许在两个段寄存器间直接传送信息PUSH入栈指令及POP出栈指令: 堆栈操作是以"后进先出"的方式进行数据操作.PUSH SRC //Word入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器.入栈时高位字节先入栈,低位字节后入栈.POP DST //Word出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器.执行POP SS指令后,堆栈区在存储区的位置要改变.执行POP SP 指令后,栈顶的位置要改变.XCHG(eXCHanG)交换指令: 将两操作数值交换.XCHG OPR1, OPR2 //Byte/Word执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp1.必须有一个操作数是在寄存器中2.不能与段寄存器交换数据3.存储器与存储器之间不能交换数据.XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码.XLAT (OPR 可选) //Byte执行操作: AL=(BX+AL)指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码.LEA(Load Effective Address) 有效地址传送寄存器指令LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中.执行操作: REG = EAsrc注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器MOV BX , OFFSET OPER_ONE 等价于LEA BX , OPER_ONEMOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中LDS(Load DS with pointer)指针送寄存器和DS指令LDS REG , SRC //常指定SI寄存器。
第十三讲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中。