C51汇编指令


C51汇编指令

8中常用伪指令

①. ORG 16位地址

此指令用在原程序或数据块的开始,指明此语句后面目标程序或数据块存放的起始地址。

ORG 000H

②. [标号:] DB 字节数据项表

将项表中的字节数据存放到从标号开始的连续字节单元中。

SEG: DB 88H,100,“7”,“C”

③. [标号: ] DW 双字节数据项表

定义16 位地址表, 16 地址按低位地址存低位字节,高位地址存高位字节。

TAB: DW 1234H,7BH

④. 名字 EQU 表达式 或 名字=表达式

用与给一个表达式赋值或给字符串起名字。之后名字可用做程序地址,数据地址或立即数地址使用。名字必须是一字母开头的字母数字串。

COUNT=10 或 SPACE EQU 10H

⑤. 名字 DATA 直接字节地址

给8 位内部RAMm单元起个名字,名字必须是一字母开头的字母数字串。同一单元可起多个名字。

ERROR DATA 80H

⑥. 名字 XDATA 直接字节地址

给8 位外部RAM起个名字,名字规定同DATA 伪指令。

IO_PORT XDATA 0CF04H

⑦. 名字 BIT 位指令

给一可位寻址的位单元起个名字,规定同DATA伪指令。

SWT BIT 30H

⑧. [标号:] END

指出源程序到此结束,汇编对其后的程序语句不予理睬.源程序只在主程序最后使用一个END。

定义指令符号

符号 说明
Rn 目前所选定的寄存器组中的R0-R7 寄存器
Ri 当前选中的寄存器区中可作为地址寄存器的两个寄存器R0 和R1(i=0,1 )
Direct 8 位直接寻址地址,可以是内存RAM地址( 00H—7FH )或SFR(80H—FFH )
@Ri 通过R0 或R1 做间接寻址内部RAM的地址( 00H—FFH )的前缀
#data 8 位立即数
#data16 16 位立即数,只有DPTR 中才用到
Addr16 只用在LCALL(长指令调用,三字节)和LJMP(无条件长转移指令)指令中的16位目的地地址,可寻址64K 存储器中的任何地址
Addr11 使用在ACALL (绝对调用指令,双字节)和AJMP(无条件绝对转移指令)指令中的11 位目的地地址, 可寻址下一个指令算起2K 内的任何地址, 即目的地址必须放在与下条指令第一个字节同一个2kB 程序存储器空间
DPTR 数据指针
rel 有符号的8 位偏移地址( Offset Address ),其范围是从下一个指令算起的-128到+128 字节中。负值表示地址向前推算,正值表示地址向后推算。使用在SJMP和所有条件式跳转指令中
bit 可直接位寻址的内部数据RAM(20H—2FH ),其中地址范围为( 00H—7FH )或特殊功能积存器( 80H—FFH )
A 累加器
B 累加器,用于乘法和除法
(X) 某地址单元X中的内容
((X)) 某地址单元X内存放一地址信息,此命令为寻址地址信息所指地址中存放的数据

汇编指令

指令格式(助记符) 指令功能说明
MOV A,direct (direct) →(A)
直接单元地址中的数据→累加器A
MOV A,#data #data → (A)
8 位立即数→累加器A
MOV A,Rn (Rn) →(A)
Rn 寄存器中的数据→累加器A
MOV A,@Ri ((Ri)) →(A)
Ri 中的数据指向的地址单元中的数据→累加器A
MOV Rn,direct (direct) →(Rn)
直接寻址单元中的数据—> 寄存器Rn
MOV Rn,#data #data → (Rn)
8 位立即数—> 寄存器Rn
MOV Rn,A (A) →(Rn)
累加器A 中的数据—> 寄存器Rn
MOV direct,direct (direct) →(direct)
直接地址单元中的数据→直接地址单元direct
MOV direct,#data #data → (direct)
立即数→直接地址单元direct
MOV direct,A (A) →(direct)
累加器A中的数据→直接地址单元direct
MOV direct,Rn (Rn) →(direct)
寄存器Rn 中的数据→直接地址单元direct
MOV direct,@Ri ((Ri)) →(direct)
寄存器Ri 中的数据指定的地址单元中数据→直接地址单元direct
MOV @Ri,direct (direct) →((Ri))
直接地址单元中的数据→以Ri 中的内容为地址的RAM单元
MOV @Ri,#data #data → ((Ri))
立即数→以Ri 中的内容为地址的RAM单元
MOV @Ri,A (A) →((Ri))
累加器A 中的数据→以Ri 中的内容为地址的RAM单元
MOVC A,@A+DPTR ((A))+(DPTR) →(A)
表格地址单元中的数据→累加器A
MOVC A,@A+PC ((A))+(PC) →(A)
表格地址单元中的数据→累加器A
MOVX @DPTR,A (A) →((DPTR))
累加器中的数据→ 数据指针指向片RAM地址中
MOVX A, @DPTR (A) →((DPTR))
累加器中的数据→ 数据指针指向片RAM地址中
MOVX A, @Ri ((Ri)) →(A)
寄存器Ri 指向片外RAM 地址中的数据→累加器A中
MOVX @Ri,A (A) →((Ri))
累加器中的数据→ 寄存器Ri 指向片外RAM地址中
PUSH direct (SP) +1→(SP) ,(direct) →(SP)
堆栈指针首先加1,直接寻址单元中的数据送到堆栈指针SP 所指的单元中
PUSH A 将累加器A 中的数据→堆栈顶端
POP direct (SP) →(direct) (SP)- 1→(SP)
堆栈指针SP 所指的单元数据送到直接寻址单元中,堆栈指针SP 再进行减1操作
POP A 将堆栈顶端的数据→累加器A
XCH A,Rn (A) ←→(Rn)
累加器与工作寄存器Rn 中的数据互换
XCH A,@Ri (A) ←→((Ri))
累加器与工作寄存器Ri 所指的存储单元中的数据互换
XCH A, direct (A) ←→(direct)
累加器与直接地址单元中的内容互换
XCHD A,@Ri (A 3-0 ) ←→((Ri) 3-0 )
累加器与工作寄存器Ri 所指的存储单元中的数据低半字节互换
SWAP A (A 3-0 ) ←→(A 7-4 ) 累加器中的内容高低半字节互换
MOV DPTR,#data16 #dataH → (DPH) , #dataL → (DPL)
16 位常数的高8 位送到DPH,低8 位送到DPL
ADD A,#data (A) +#data → (A)
累加器A 中的数据与立即数#data 相加,结果存在A 中
ADD A,direct (A)+ (direct) →(A)
累加器A 中的数据与直接地址单元中的数据相加,结果存在A 中
ADD A,Rn (A)+(Rn) →(A)
累加器A 中的数据与工作寄存器Rn 中的数据相加,结果存在A 中
ADD A,@Ri (A)+((Ri)) →(A)
累加器A 中的数据与工作寄存器Ri 所指向地址单元中的数据相加,结果存在A 中
ADDC A,direct (A)+(direct)+(C) →(A)
累加器A 中的数据与直接地址单元的数据连同进位位相加,结果存在A 中
ADDC A,#data (A)+#data +(C) →(A)
累加器A 中的数据与立即数连同进位位相加,结果存在A 中
ADDC A,Rn (A)+Rn+(C) →(A)
累加器A 中的数据与工作寄存器Rn 中的数据、连同进位位相加,结果存在A 中
ADDC A,@Ri (A)+((Ri))+(C) →(A)
累加器A 中的数据与工作寄存器Ri 指向地址单元中的数据、连同进位位相加,结果存在A 中
SUBB A,direct (A) - (direct) -(C) →(A)
累加器A 中的数据与直接地址单元中的数据、连同借位位相减,结果存在A 中
SUBB A,#data (A) - (Rn) - (C) →(A)
累加器A 中的数据与工作寄存器中的数据、连同借位位相减,结果存在A 中
SUBB A,Rn (A) - (Rn) - (C) →(A)
累加器A 中的数据与工作寄存器中的数据、连同借位位相减,结果存在A 中
SUBB A,@Ri (A) - ((Ri)) - (C) →(A)
累加器A 中的数据与工作寄存器Ri 指向的地址单元中的数据、连同借位位相减,结果存在A 中
MUL AB (A) × (B) →(A) 和(B)
累加器A 中的数据乘以寄存器B 中的数据,结果高字节存入寄存器B,底字节存入累加器A
DIV AB (A) ÷ (B) →(A) 和(B)
累加器A 中的数据除以寄存器B 中的数据,结果的商存入累加器A,余数存入寄存器B 中
INC A 累加器A 中的数据加1,结果存在A 中
INC direct (direct) +1→(direct)
直接地址单元中的数据加1,结果送回原地址单元中,如果直接地址是I/O ,其功能是先读入I/O 锁存器的内容,然后在CPU进行加1 操作,再输出到I/O 上,这就是“读—修改—写”操作
INC @Ri ((Ri)) +1→((Ri))
寄存器的数据指向的地址单元中的数据加1,结果送回原地址单元中
NC Rn (Rn) +1→(Rn)
寄存器Rn 的数据加1,结果送回原地址单元
INC DPTR (DPTR) +1→(DPTR)
数据指针的数据加1,结果送回数据指针中
DEC A (A)- 1→(A)
累加器A 中的数据减1,结果送回累加器A
DEC direct (direct)- 1→(direct)
直接地址单元中的数据减1 ,结果送回直接地址单元中
DEC @Ri ((Ri))- 1→((Ri))
寄存器Ri 指向的地址单元中的数据减1,结果送回原地址单元中
DEC Rn (Rn)- 1→(Rn)
寄存器Rn 中的数据减1,结果送回寄存器Rn 中
DA A 累加器A中的数据做BCD调整
RL A 累加器A中的数据左移一位
RR A 累加器A中的数据右移一位
RLC A 累加器A中的数据连同进位标志位CY左移一位
RRC A 累加器A中的数据连同进位CY 位CY右移一位
SWAP A 累加器中的数据高低半字节互换
CPL A 累加器中的数据按位取反
CLR A 累加器中的数据清0
ANL A,direct 累加器A 中的数据和直接地址单元中的数据执行与操作。结果存在寄存器A中
ANL direct,#data 直接地址单元中的数据和立即数执行与操作。结果存在直接地址单元中
NL A,#data 累加器A的数据和立即数执行与操作。结果存在累加器A中
NL A,Rn 累加器A的数据和寄存器Rn中的数据执行与操作。结果存在累加器A中
ANL direct,A 直接地址单元中的数据和累加器A 的数据执行与操作。结果存在直接地址单元中
ANL A,@Ri 累加器A的数据和工作寄存器Ri指向的地址单元中的数据执行与操作。结果存在累加器A中
ORL A,direct 累加器A中的数据和直接地址单元中的数据执行逻辑或操作。结果存在寄存器A中
ORL direct,#data 累加器A中的数据和直接地址单元中的数据执行逻辑或操作。结果存在寄存器A中
ORL A,#data 累加器A 的数据和立即数执行逻辑或操作。结果存在累加器
ORL A,Rn 累加器A 的数据和寄存器Rn 中的数据执行逻辑或操作。结果存在累加器A 中
ORL direct,A 直接地址单元中的数据和累加器A 的数据执行逻辑或操作。结果存在直接地址单元中
ORL A,@Ri 累加器A 的数据和工作寄存器Ri 指向的地址单元中的数据执行逻辑或操作。结果存在累加器A 中
XRL A,direct 累加器A 中的数据和直接地址单元中的数据执行逻辑异或操作。结果存在寄存器A 中
XRL direct,#data 直接地址单元中的数据和立即数执行逻辑异或操作。结果存在直接地址单元中
XRL A,#data 累加器A 的数据和立即数执行逻辑异或操作。结果存在累加器A中
XRL A,Rn 累加器A 的数据和寄存器Rn 中的数据执行逻辑异或操作。结果存在累加器A 中
XRL data,A 直接地址单元中的数据和累加器A 的数据执行逻辑异或操作。结果存在直接地址单元中
XRL A,@Ri 累加器A 的数据和工作寄存器Ri 指向的地址单元中的数据执行逻辑异或操作。结果存在累加器A 中
CLR C 清除进位标志CY 为0
CLR bit 清除bit 为0
SETB C 设定进位标志CY 为1
SETB bit 设定bit 为1
CPL C 将进位标志CY 反相
CPL bit 将bit 反相
ANL C,bit 将进位标志CY AND bit 值进位标志位CY
ANL C ,/bit 将进位标志CY AND bit 反相值进位标志位CY
ANL A ,#data 将累加器A 的各位与立即数的相对位置做AND累加器
ORL C ,bit 将进位标志CY OR bit 值进位标志位CY
ORL C , /bit 将进位标志CY OR bit 反相值进位标志位CY
ORL A ,#data 将累加器A 的各位与立即数的相对位置做OR累加器
MOV C,bit 将bit 值进位标志位CY
MOV bit ,C 将进位标志位CY →bit 值
JC rel 当进位标志位CY=1 就跳至rel ,否则执行下一条指令
JNC rel 当进位标志位CY=0 就跳至rel ,否则执行下一条指令
JB bit rel 当进bit=1 就跳至rel ,否则执行下一条指令
JNB bit rel 当进bit=0 就跳至rel ,否则执行下一条指令
JBC bit rel 当进bit=1 跳至rel ,并且清除此bit 为0 ,否则执行下一条指令
ACALL addr11 2K 范围内子程序调用
LCALL addr16 64K 范围内子程序调用
RET 子程序返回
RET1 中断服务程序结束返回
AJMP addr11 2K 范围内无条件跳转
LCALL addr16 64K 范围内子程序调用
RET 子程序返回
AJMP addr11 2K 范围内无条件跳转
LJMP addr16 64K 范围内无条件跳转
SJMP rel 在此指令的前128 或后128 范围内无条件跳转
JMP @A+DPTR 跳至@A+DPTR所指定的地址
JZ rel 如A 的内容为0,则短跳转,负责执行下一条指令
JNZ rel 如A 的内容不为0,则短跳转,负责执行下一条指令
CJNE A , direct ,rel 如A 的内容与直接地址内的数据不同,则短跳转
CJNE A , #data ,rel 如A 的内容与立即数不同,则短跳转
CJNE Rn , #data ,rel 如Rn 寄存器中的数据与立即数不同,则短跳转
CJNE @Ri,#data ,rel 如间接地址的数据与立即数不同,则短跳转
DJNZ Rn ,rel Rn 寄存器中的数据减1 ,若不为0,则短跳转, 否则执行下条指令
DJNZ direct,rel 直接地址中的数据减1,若不为0,则短跳转,负责执行下条指令
NOP CPU仅仅作取指令,不动作

文章作者: Mat Jenin
文章链接: http://matjenin.xyz
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Mat Jenin !
  目录