文档库 最新最全的文档下载
当前位置:文档库 › 51汇编指令详解

51汇编指令详解

51汇编指令详解
51汇编指令详解

第4章 51汇编指令详解

1.指令的定义

指令是规定计算机进行某种操作的指令。一条指令只能完成有限的功能,为了使计算机完成一定的或者复杂的功能,就需要一系列指令。计算机能够执行各种指令的集合称为“指令系统”。计算机的主要功能也是由指令系统来体现的。

80C51使用了7种寻址方式,共有111条指令。

如果按照字节分:49条单字节,46条双字节,16条3字节。

如果按照运算速度分:单周期指令64条,双周期45条,4周期2条。

用助记符形式来表示的机器指令称为“汇编语言指令”。计算机的指令一般用汇编语言指令来表示。

80C51系列单片机的指令共有111条指令,按照其功能特点分为5大类,即是:数据传送指令类、算术运算类、逻辑运算类、控制转移类和位操作类。

符号定义表符号含义

RnR0~R7寄存器n=0~7

Direct 直接地址,内部数据区的地址RAM(00H~7FH)

SFR(80H~

FFH)B,ACC,PSW,IP,P3,IE,P2,SCON,P1,TCON,P0

@Ri 间接地址Ri=R0或R18051/31RAM地址(00H~7FH)8052/32RAM 地址(00H~FFH)

#data8位常数

#data1616位常数

Addr1616位的目标地址

Addr1111位的目标地址

Rel 相关地址

bit 内部数据RAM(20H~2FH),特殊功能寄存器的直接地址的位指令介绍指令字节周期动作说明一、算数运算指令

2.指令的详解

(字节周期)

1.ADD A,Rn11 将累加8器与寄存器的内容相加,结果存回累加

2.ADD A,direct21 将累加器与直接地址的内容相加,结果存回累加器

3.ADD A,@Ri11 将累加器与间接地址的内容相加,结果存回累加器

4.ADD A,#data21 将累加器与常数相加,结果存回累加器5.ADDC A,Rn11 将累加器与寄存器的内容及进位C相加,结果存回累加器

6.ADDC A,direct21 将累加器与直接地址的内容及进位C相加,结果存回累加器

7.ADDC A,@Ri11 将累加器与间接地址的内容及进位C相加,结果存回累加器

8.ADDC A,#data21 将累加器与常数及进位C相加,结果存回累加器

//减法指令,如下,都是带借位减法,其中A为被减数,即A - Rn-CY=A 9.SUBB A,Rn 11 将累加器的值减去寄存器的值减借位C,结果存回累加器

10.SUBB A,direct21 将累加器的值减直接地址的值减借位C,结果存回累加器

11.SUBB A,@Ri11 将累加器的值减间接地址的值减借位C,结

果存回累加器

12.SUBB A,#data21 将累加器的值减常数值减借位C,结果存回累加器

//INC将操作数所在指定单元内容加一,其中操作除了第一条13指令影响就标志为外,其余指令操作均不影响PSW

13.INC A11 将累加器的值加1;

14.INC Rn11 将寄存器的值加l

15.INC direct21 将直接地址的内容加 1

16.INC @Ri11 将间接地址的内容加 1

17.INC DPTR11 数据指针寄存器值加1说明:将16位的DPTR 加1,当DPTR的低字节(DPL)从FFH溢出至00H时,会使高字节(DPH)加1,不影响任何标志位,此是唯一一条16位加一指令,如果低8位有进位,可以直接向高位进位。

//假发指令与假发指令类似,是将其操作数所指定的调用内容减一。18.DEC A 1 1 将累加器的值减 1

19.DEC Rn 1 1 将寄存器的值减 1

20.DEC direct 21 将直接地址的内容减 1

21.DEC @Ri 1 1 将间接地址的内容减 1

//乘除法指令都是1个字节,4个周期

22.MUL AB 1 4 将累加器的值与B寄存器的值相乘,乘积的低位字节存回累加器,高位字节存回,注意AB中间没有空格。

B寄存器说明:将累加器A和寄存器B内的无符号整数相乘,产生16位的积,低位字节存入A,高位字节存入B寄存器。如果积大于FFH,则溢出标志位(OV)被设定为1,而进位标志位为0 23.DIV AB 1 4 将累加器的值除以B寄存器的值,结果的商存回累加器,余数存回B寄存器说明:无符号的除法运算,将累加器A 除以B寄存器的值,商存入A,余数存入B。执行本指令后,进位位(C)及溢出位(OV)被清除为0

24.DA A 11 将累加器A作十进制调整,若(A) 3-0>9或(AC)=1,则(A) 3-0←(A)3-0+6若(A) 7-4>9或(C)=1,则(A) 7-4←(A)7-4+6二、逻辑运算指令

//汇编指令中的十进制调整指令:

//这条指令在进行BCD码加减法运算时,跟在ADD和ADDC指令之后,用来对压缩BCD码就行结果自动修正,使其仍然为压缩BCD码。在80C51单片机中,DA A不能对减法指令结果进行修正。

//该指令是针对十进制的运算结果进行调整的,其实现的功能如下

*当低4位A0~A3>9或者半进位位AC = =1时,自动执行(A)+6-> A *当结果的高四位A4-A7>9或者进位位CY == 1时,自动执行

(A)+60H->A

*当结果的高四位A4-A7>9,低4位A0~A3>9时,自动执行(A)+66H->A

//这种操作主要用于两个数安位进行逻辑操作,操作结果送至累加器A或者直接寻址单元。主要逻辑操作有“与”,“或”,“非”,以及位移、取反、清除等。

25.ANL A,Rn 11 将累加器的值与寄存器的值做AND的逻辑判断,结果存回累加器

26.ANL A,direct 2 1 将累加器的值与直接地址的内容做AND 的逻辑判断,结果存回累加器

27.ANL A,@Ri 11 将累加器的值与间接地址的内容做AND的逻辑判断,结果存回累加器

28.ANL A,#data 21 将累加器的值与常数做AND的逻辑判断,结果存回累加器

29.ANL direct,A2 1 将直接地址的内容与累加器的值做AND

的逻辑判断,结果存回该直接地址

30.ANL direct,#data3 2 将直接地址的内容与常数值做AND

的逻辑判断,结果存回该直接地址

//29,30两条指令,如果direct为I/O口,则进行“读-改-写”操作。

//逻辑或操作,

31.ORL A,Rn 11 将累加器的值与寄存器的值做OR的逻辑判断,结果存回累加器

32.ORL A,direct2 1 将累加器的值与直接地址的内容做OR的逻辑判断,结果存回累加器

33.ORL A,@Ri 1 1 将累加器的值与间接地址的内容做OR的逻辑判断,结果存回累加器

34.ORL A,#data2 1 将累加器的值与常数做OR的逻辑判断,结果存回累加器

35.ORL direct,A2 1 将直接地址的内容与累加器的值做OR的逻辑判断,结果存回该直接地址

36.ORL direct,#data 32 将直接地址的内容与常数值做OR的逻辑判断,结果存回该直接地址

//逻辑异或操作

37.XRL A,Rn 11 将累加器的值与寄存器的值做XOR的逻辑判断,结果存回累加器

38.XRL A,direct2 1 将累加器的值与直接地址的内容

做XOR 的逻辑判断,结果存回累加器

39.XRL A,@Ri 1 1 将累加器的值与间接地扯的内容做XOR 的逻辑判断,结果存回累加器

40.XRL A,#data2 1 将累加器的值与常数作XOR 的逻辑判断,结果存回累加器

41.XRL direct,A2 1 将直接地址的内容与累加器的值

做XOR 的逻辑判断,结果存回该直接地址

42.XRL direct,#data 32 将直接地址的内容与常数的值

做XOR 的逻辑判断,结果存回该直接地址

43.CLR A 1 1 清除累加器的值为0

44.CPL A 1 1 将累加器的值反相

//RL,RR循环移位指令,RRC,RLC带进位循环以移位指令

45.RL A 1 1 将累加器的值左移一位

46.RLCA 1 1 将累加器含进位 C 左移一位

47.RRA 11 将累加器的值右移一位

48.RRC A 1 1 将累加器含进位 C 右移一位

49.SWAP A 1 1 将累加器的高 4 位与低 4 位的内容交换。(A)3-0←(A)7-4数据转移指令

//内部数据传送指令

50.MOV A,Rn 11 将寄存器的内容载入累加器

51.MOV A,direct 2 1 将直接地址的内容载入累加器52.MOV A,@Ri 1 1 将间接地址的内容载入累加器

53.MOV A,#data 2 1 将常数载入累加器

54.MOV Rn,A1 1 将累加器的内容载入寄存器

55.MOV Rn,direct 2 2 将直接地址的内容载入寄存器56.MOV Rn,gdata 2 1 将常数载入寄存器

57.MOV direct,A2 1 将累加器的内容存入直接地址

58.MOV direct,Rn2 2 将寄存器的内容存入直接地址59.MOV direct1,direct23 2 将直接地址 2 的内容存入直接地址 1

60.MOV direct,@Ri 22 将间接地址的内容存入直接地址61.MOV direct,#data 32 将常数存入直接地址

62.MOV @Ri,A 1 1 将累加器的内容存入某间接地址

63.MOV @Ri,direct 22 将直接地址的内容存入某间接地址

64.MOV @Ri,#data 2 1 将常数存入某间接地址

65.MOV DPTR,#data16 3 2 将16 位的常数存入数据指针寄存器

//查表指令,注意是在程序存储区查表。

66.MOVC A,@A+DPT R1 2(A) ←((A)+(DPTR))累加器的值再加数据

指针寄存器的值为其所指定地址,将该地址的内容读入累加器

67.MOVC A,@A+PC12 (PC)←(PC)+1;(A)←((A)+(PC))累加器的值加程序计数器的值作为其所指定地址,将该地址的内容读入累加器。修正值是从下一条语句开始算起。

//CPU对片外RAM访问(既是外部数据传送指令)

68.MOVX A,@Ri 1 2 将间接地址所指定外部存储器的内容读入累加器(8 位地址)

69.MOVX A,@DPTR1 2 将数据指针所指定外部存储器的内容读入

累加器(16 位地址)

70.MOVX @Ri,A 1 2将累加器的内容写入间接地址所指定的外部存

储器(8位地址)

71.MOVX @DPTR,A1 2将累加器的内容写入数据指针所指定的外部存储器(16位地址)

72.PUSH direct 22将直接地址的内容压入堆栈区

73.POP direct 22从堆栈弹出该直接地址的内容

//调用时有自动入栈出栈操作,而且是PC低位先入栈,高位后入栈。出栈时PC高位先出栈,低位后出栈。

//PC入栈时,低位先入栈,高位后入栈。

74.XCH A,Rn 11将累加器的内容与寄存器的内容互换

75.XCH A,direct 21将累加器的值与直接地址的内容互换76.XCH A,@Ri 1 1将累加器的值与间接地址的内容互换77.XCHD A,@Ri 11将累加器的低4位与间接地址的低4位互换布尔代数运算

78.CLR C 11清除进位C为0

79.CLR bit 2 1清除直接地址的某位为0

80.SET B C 11设定进位C为1

81.SET B bit 2 1设定直接地址的某位为1

82.CPL C 11将进位C的值反相

83.CPL bit 21将直接地址的某位值反相

//注意:在位与与位或运算中,目标操作数只能是C

84.ANL C,bit 2 2将进位C与直接地址的某位做AND的逻辑判断,结果存回进位C

85.ANL C,/bit 2 2将进位C与直接地址的某位的反相值做AND的逻辑判断,结果存回进位C

86.ORL C,bit 2 2将进位C与直接地址的某位做OR的逻辑判断,结果存回进位C

87.ORL C,/bit 22将进位C与直接地址的某位的反相值做OR的逻辑判断,结果存回进位C

88.MOV C,bit 2 1将直接地址的某位值存入进位C

89.MOV bit,C2 2将进位C的值存入直接地址的某位

90.JC rel 2 2若进位C=1则跳至rel的相关地址

91.JNC rel 2 2若进位C=0则跳至rel的相关地址

92.JB bit,rel 32若直接地址的某位为1,则跳至rel的相关地址93.JNB bit,rel 32若直接地址的某位为0,则跳至rel的相关地址94.JBC bit,rel3 2若直接地址的某位为1,则跳至rel的相关地址,并将该位值清除为0程序跳跃

95.ACALL addr11 2 2调用2K程序存储器范围内的子程序(2字节)

96.LCALL addr16 3 2调用64K程序存储器范围内的子程序(3字节)

97.RET 1 2从子程序返回

98.RETI 1 2从中断子程序返回

99.AJMP addr11 22绝对跳跃(2K内)

100.LJMP addr16 3 2长跳跃(64K内)

101.SJMP rel 2 2短跳跃(2K内)-128~+127字节

102.JMP @A+DPTR 1 2跳至累加器的内容加数据指针所指的相关地址

103.JZ rel22累加器的内容为0,则跳至rel所指相关地址104.JNZ rel2 2累加器的内容不为0,则跳至rel所指相关地址

105.CJNE A,direct,rel3 2将累加器的内容与直接地址的内容比较,不相等则跳至rel所指的相关地址(此操作影响进位标志为C,A -direct)

106.CJNE A,#data,rel 3 2将累加器的内容与常数比较,若不相等则跳至rel所指的相关地址

107.CJNE @Rn,#data,rel 32将寄存器的内容与常数比较,若不相等则跳至rel所指的相关地址

108. CJNE Rn,#data,rel 3 2将累加器的内容与常数比较,若不相等则跳至rel所指的相关地址

109. DJNZ Rn,rel

110. DJNZ direct,rel

取反指令:

CPL A ;A= A非

清零指令:

CLR A ;A=0

例:把累加器A中的第四位送入300H单元

MOV DPTR #300H

ANL A,#0FH

MOVX @DPTR,A

例:将累加器A中的低四位的状态通过P1口的高四位输出

ANL A,#0FH

SWAP A

ANL P1,#0FH

ORL P1,A

控制条件转移指令:

这类指令的功能主要是控制程序从原顺序执行地址转移到其他指令

地址上。

计算机在运行过程中,有时因为任务要求,程序不能顺序逐条执行指令,需要改变程序运行的方向,或需要调用子程序,或需要从子程序中返回。此时都需要改变计算器PC中的内容,控制转移类指令可用来实现这一要求。

控制条件转移指令多数不影响程序状态寄存器。

LJMP addr16 ;addr16 ->PC

AJMP addr11 ;(PC)+2->PC,addr11->PC.10~PC0,

SJMP rel ;(PC)+2+rel->PC

第一条指令:称“长转转移指令”。指令执行结果是将16位地址addr16送程序计数器PC。

第二条指令:称“绝对转移指令”,也称“短转移指令”。它吧PC 原来的高5位、操作码的第7~5位以及操作数的低8位合并在一起,构成16位转移地址。因为地址的高5位不变,仅低11位发生变化,因此,寻址范围必须在该指令地址加2后的2KB区域内。

第三条指令:称“无条件转移指令”。该指令是双字节,指令的操作数是相对地址,rel是一个带符号的偏移字节数(2的补码),其范围是-128~+127。负数表示向后转移。正数表示向前转移。该指令执行后的目的地址值的计算公式如下:,如果rel为大于7fH的数,则认为是负数的补码(高位认为是符号位),因为计算机是以补码的形式存储数据的。

目的地址值 = 本指令地址值+2+rel

例:1000H LJMP 3000H

执行后,PC由1003变为3000H

2030H AJMP 60H

执行后,PC由2030H变为2060H

2000H SJMP 7

执行后,PC值有2002变为2009

乘法指令:MUL

除法指令:

CLR A

CPL A

x的补码,加y的补码,等于x+y的补码

DPTR

如果是用c语言编程,可以不必注意这些问题,因为编程软件会自动帮你分配,也不容易出错!!

数据指针DPTR是80C51中一个功能比较特殊的寄存器。从结构DPTR 是一个16位的特殊功能寄存器,其高位字节寄存器用DPH表示,低位字节寄存器用DPL表示,DPTR既可以作为一个16位的寄存器来处理,也可以作为两个独立的8位寄存器来使用。主要功能是存放16位地址,作为片外RAM寻址用的地址寄存器(间接寻址),故称数据指针。

访问片外数据存储器的指令为:

MOVX A,@DPTR 读

MOVX @DPTR,A 写

DPTR的另一个作用是变址寻址,访问程序存储器,做查表指令:如:

以dptr为基址寄存器,将dptr的内容与累加器a的内容相加得到变址地址

movc a, @a+dptr ; (a)<-----((a)+(dptr))

DB、DW

DB:定义字节变量,其后的每一个表达式占一个字节。

DW:定义字变量,其后的每一个表达式的值占二个字节,低字节在低地址,高字节在高地

址。

它们的作用是将所需要的数据放入指定的存储单元中,或者是为程序分配指定数目的存储单元,并根据情况对它们进行初始化

一般的格式为

【单元名称】:DB 表达式(及存储单元内容);【注释】

例如dui 240128写入一个中文字,定义中文字变量为

HZ2000:

DB

000H,000H,000H,001H,003H,006H,00FH,007H,007H,01FH,003H,01FH ,037H,00DH,000H,000H

DB

000H,000H,0C7H,080H,03FH,0FBH,0BEH,078H,0EFH,0FDH,0FFH,0FBH ,0FBH,08EH,00CH,000H;"编",0

【对$NOMOD51的理解】

很多朋友在看asm代码的时候,对下面的语句不是很了解,下面解说一下。

$NOMOD51

$INCLUDE (REG932.INC)

解释:

$NOMOD51,这一指令功能是使A51不识别8051的所有预定义符号。$INCLUDE (REG932.INC),这一指令功能使用用户自定义的符号文件。

这两条语句必须配合使用,使用了$INCLUDE (REG932.INC),就必须使用$NOMOD51,否则回因多重定义而产生错误。

//查表指令

66.MOVC A,@A+DPTR1 2(A) ←((A)+(DPTR))累加器的值再加数据指针寄存器的值为其所指定地址,将该地址的内容读入累加器67.MOVC A,@A+PC12 (PC)←(PC)+1;(A)←((A)+(PC))累加器的值加程序计数器的值作为其所指定地址,将该地址的内容读入累加器//对于66,CPU读取单字节指令后,PC内容自动加1。其功能能为将新的PC内容与累加器A内无符号数据相加形成地址,并取出该地址内容送至累加器A。这种指令表很方便,但是只能查询指令做子啊地址以后256字节范围的代码或者常数。

//对于67,以DPTR为基址进行查表,使用前,先给DPTR赋予某些特定查表地址,其范围可以打整个程序存储器64KB空间。但在此前,如果DPTR已经赋值另作它用,则装入新查表之前必须保存原值,可以用堆栈操作指令PUSH保存。

//对于66,67指令,不改变PC或者DPTR的内容。

例如:

1010H;02H 1011H;04H 1012H;06H 1013H;08H

执行程序如下:

1000H:MOV A,#0DH

1001H: MOVC A,@A+PC

1002H: MOV R0,A

结果:A = 02H,R0 = 02H,PC = 1004H

例如:

7010H:02H

7011H:04H

7012H:06H

7013H:08H

执行如下程序:

1004H: MOV A,#10H

1006H:MOV DPTR,#7000H

1009H:MOVC A,@A+DPTR

结果:A = 02H,PC = 100AH

72.PUSHdirect 22将直接地址的内容压入堆栈区

73.POPdirect 22从堆栈弹出该直接地址的内容

堆栈操作入栈时,先将堆栈指针SP的内容加一,然后将直接寻址单元中的数据送到(也称“压入”)到SP所指向的单元中。如果数据已经推入堆栈,则SP指向最后兑入数据所在的存储单元(既是指向栈顶)。

51单片机汇编指令速查表

51单片机汇编指令速查表 指令格式功能简述字节数周期 一、数据传送类指令 MOV A, Rn 寄存器送累加器 1 1 MOV Rn,A 累加器送寄存器 1 1 MOV A ,@Ri 内部RAM单元送累加器 1 1 MOV @Ri ,A 累加器送内部RAM单元 1 1 MOV A ,#data 立即数送累加器 2 1 MOV A ,direct 直接寻址单元送累加器 2 1 MOV direct ,A 累加器送直接寻址单元 2 1 MOV Rn,#data 立即数送寄存器 2 1 MOV direct ,#data 立即数送直接寻址单元 3 2 MOV @Ri ,#data 立即数送内部RAM单元 2 1 MOV direct ,Rn 寄存器送直接寻址单元 2 2 MOV Rn ,direct 直接寻址单元送寄存器 2 2 MOV direct ,@Ri 内部RAM单元送直接寻址单元 2 2 MOV @Ri ,direct 直接寻址单元送内部RAM单元 2 2 MOV direct2,direct1 直接寻址单元送直接寻址单元 3 2 MOV DPTR ,#data16 16位立即数送数据指针 3 2 MOVX A ,@Ri 外部RAM单元送累加器(8位地址) 1 2 MOVX @Ri ,A 累加器送外部RAM单元(8位地址) 1 2 MOVX A ,@DPTR 外部RAM单元送累加器(16位地址) 1 2 MOVX @DPTR ,A 累加器送外部RAM单元(16位地址) 1 2 MOVC A ,@A+DPTR 查表数据送累加器(DPTR为基址) 1 2 MOVC A ,@A+PC 查表数据送累加器(PC为基址) 1 2 XCH A ,Rn 累加器与寄存器交换 1 1 XCH A ,@Ri 累加器与内部RAM单元交换 1 1 XCHD A ,direct 累加器与直接寻址单元交换 2 1 XCHD A ,@Ri 累加器与内部RAM单元低4位交换 1 1 SWAP A 累加器高4位与低4位交换 1 1 POP direct 栈顶弹出指令直接寻址单元 2 2 PUSH direct 直接寻址单元压入栈顶 2 2 二、算术运算类指令 ADD A, Rn 累加器加寄存器 1 1

51单片机汇编指令集(附记忆方法)

51单片机汇编指令集 一、数据传送类指令(7种助记符) MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送; MOVC(Move Code)读取程序存储器数据表格的数据传送; MOVX (Move External RAM) 对外部RAM的数据传送; XCH (Exchange) 字节交换; XCHD (Exchange low-order Digit) 低半字节交换; PUSH (Push onto Stack) 入栈; POP (Pop from Stack) 出栈; 二、算术运算类指令(8种助记符) ADD(Addition) 加法; ADDC(Add with Carry) 带进位加法; SUBB(Subtract with Borrow) 带借位减法; DA(Decimal Adjust) 十进制调整; INC(Increment) 加1; DEC(Decrement) 减1; MUL(Multiplication、Multiply) 乘法; DIV(Division、Divide) 除法; 三、逻辑运算类指令(10种助记符) ANL(AND Logic) 逻辑与; ORL(OR Logic) 逻辑或; XRL(Exclusive-OR Logic) 逻辑异或; CLR(Clear) 清零; CPL(Complement) 取反; RL(Rotate left) 循环左移; RLC(Rotate Left throught the Carry flag) 带进位循环左移; RR(Rotate Right) 循环右移; RRC (Rotate Right throught the Carry flag) 带进位循环右移; SWAP (Swap) 低4位与高4位交换; 四、控制转移类指令(17种助记符) ACALL(Absolute subroutine Call)子程序绝对调用; LCALL(Long subroutine Call)子程序长调用; RET(Return from subroutine)子程序返回; RETI(Return from Interruption)中断返回; SJMP(Short Jump)短转移; AJMP(Absolute Jump)绝对转移; LJMP(Long Jump)长转移; CJNE (Compare Jump if Not Equal)比较不相等则转移;

单片机汇编指令大全

单片机汇编指令一览表 作者:乡下人 助记符指令说明字节数周期数 (数据传递类指令) MOV A,Rn 寄存器传送到累加器 1 1 MOV A,direct 直接地址传送到累加器 2 1 MOV A,@Ri 累加器传送到外部RAM(8 地址) 1 1 MOV A,#data 立即数传送到累加器 2 1 MOV Rn,A 累加器传送到寄存器 1 1 MOV Rn,direct 直接地址传送到寄存器 2 2 MOV Rn,#data 累加器传送到直接地址 2 1 MOV direct,Rn 寄存器传送到直接地址 2 1 MOV direct,direct 直接地址传送到直接地址 3 2 MOV direct,A 累加器传送到直接地址 2 1 MOV direct,@Ri 间接RAM 传送到直接地址 2 2 MOV direct,#data 立即数传送到直接地址 3 2 MOV @Ri,A 直接地址传送到直接地址 1 2 MOV @Ri,direct 直接地址传送到间接RAM 2 1 MOV @Ri,#data 立即数传送到间接RAM 2 2 MOV DPTR,#data16 16 位常数加载到数据指针 3 1 MOVC A,@A+DPTR 代码字节传送到累加器 1 2 MOVC A,@A+PC 代码字节传送到累加器 1 2 MOVX A,@Ri 外部RAM(8 地址)传送到累加器 1 2 MOVX A,@DPTR 外部RAM(16 地址)传送到累加器 1 2 MOVX @Ri,A 累加器传送到外部RAM(8 地址) 1 2 MOVX @DPTR,A 累加器传送到外部RAM(16 地址) 1 2 PUSH direct 直接地址压入堆栈 2 2 POP direct 直接地址弹出堆栈 2 2 XCH A,Rn 寄存器和累加器交换 1 1 XCH A, direct 直接地址和累加器交换 2 1 XCH A, @Ri 间接RAM 和累加器交换 1 1 XCHD 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

51单片机汇编指令集(附记忆方法)

51 单片机汇编指令集 一、数据传送类指令( 7 种助记符) MOV(英文为Move :对内部数据寄存器RAM 和特殊功能寄存器SFR 的数据进行 传送; MOV Q Move Code )读取程序存储器数据表格的数据传送; MOVX (Move External RAM) 对外部 RAM 勺数据传送; XCH (Exchange) 字节交换; XCHD (Exchange low-order Digit) 低半字节交换; PUSH (Push onto Stack) 入栈; POP (Pop from Stack) 出栈; 二、算术运算类指令( 8 种助记符) ADD(Addition) 加法; ADDC(Add with Carry) 带进位加法; SUBB(Subtract with Borrow) 带借位减法; DA(Decimal Adjust) 十进制调整; INC(Increment) 加 1; DEC(Decrement) 减 1; MUL(Multiplication 、Multiply) 乘法; DIV(Division 、Divide) 除法; 三、逻辑运算类指令( 10 种助记符) ANL(AND Logic) 逻辑与; ORL(OR Logic) 逻辑或; XRL(Exclusive-OR Logic) 逻辑异或; CLR(Clear) 清零; CPL(Complement) 取反; RL(Rotate left) 循环左移; RLC(Rotate Left throught the Carry flag) RR(Rotate Right) 循环右移; RRC (Rotate Right throught the Carry flag) SWAP (Swap) 低 4 位与高 4 位交换; 四、控制转移类指令( 17 种助记符) ACALL ( Absolute subroutine Call )子程序绝对调用; LCALL ( Long subroutine Call )子程序长调用; RET ( Return from subroutine )子程序返回; RETI ( Return from Interruption )中断返回; SJMP ( Short Jump )短转移; AJMP ( Absolute Jump )绝对转移; LJMP( Long Jump )长转移; CJNE (Compare Jump if Not Equal) 比较不相等则转移; DJNZ (Decreme nt Jump if Not Zero) 减1后不为0则转移; JZ (Jump if Zero) 结果为0则转移; JNZ (Jump if Not Zero) 结果不为0则转移; JC (Jump if the Carry flag is set) 有进位则转移; JNC (Jump if Not Carry) 无进位则转移; JB (Jump if the Bit is set) 位为1则转移; JNB (Jump if the Bit is Not set) 位为0则转移; 带进位循环左移; 带进位循环右移;

MCS-51汇编语言指令集

MCS-51汇编语言指令集 符号定义表 符号 含义 Rn R0~R7寄存器n=0~7 Direct 直接地址,内部数据区的地址RAM(00H~7FH) SFR(80H~FFH) B,ACC,PSW,IP,P3,IE,P2,SCON,P1,TCON,P0 @Ri 间接地址Ri=R0或R1 8051/31RAM地址(00H~7FH) 8052/32RAM地址(00H~FFH) #data 8位常数 #data16 16位常数 Addr16 16位的目标地址 Addr11 11位的目标地址 Rel 相关地址 bit 内部数据RAM(20H~2FH),特殊功能寄存器的直接地址的位 2指令介绍 指令 字节 周期 动作说明 算数运算指令 1.ADD A,Rn 1 1 将累加器与寄存器的内容相加,结果存回累加器 2.ADD A,direct 2 1 将累加器与直接地址的内容相加,结果存回累加器 3.ADD A,@Ri 1

将累加器与间接地址的内容相加,结果存回累加器4.ADD A,#data 2 1 将累加器与常数相加,结果存回累加器 5.ADDC A,Rn 1 1 将累加器与寄存器的内容及进位C相加,结果存回累加器6.ADDC A,direct 2 1 将累加器与直接地址的内容及进位C相加,结果存回累加器7.ADDC A,@Ri 1 1 将累加器与间接地址的内容及进位C相加,结果存回累加器8.ADDC A,#data 2 1 将累加器与常数及进位C相加,结果存回累加器 9.SUBB A,Rn 1 1 将累加器的值减去寄存器的值减借位C,结果存回累加器10.SUBB A,direct 2 1 将累加器的值减直接地址的值减借位C,结果存回累加器11.SUBB A,@Ri 1 1 将累加器的值减间接地址的值减借位C,结果存回累加器12.SUBB A,0data 2 1 将累加器的值减常数值减借位C,结果存回累加器 13.INC A 1 1 将累加器的值加1 14.INC Rn 1

51单片机指令表汇总

51单片机指令表 助记符指令说明字节数周期数 (数据传递类指令) MOV A,Rn 寄存器内容传送到累加器 1 1 MOV A,direct 直接地址内容传送到累加器 2 1 MOV A,@Ri 间接RAM内容传送到累加器 1 1 MOV A,#data 立即数传送到累加器 2 1 MOV Rn,A 累加器内容传送到寄存器 1 1 MOV Rn,direct 直接地址内容传送到寄存器 2 2 MOV Rn,#data 立即数传送到寄存器 2 1 MOV direct,Rn 寄存器内容传送到直接地址 2 2 MOV direct,direct 直接地址传内容传送到直接地址 3 2 MOV direct,A 累加器内容传送到直接地址 2 1 MOV direct,@Ri 间接RAM内容传送到直接地址 2 2 MOV direct,#data 立即数传送到直接地址 3 2 MOV @Ri,A 累加器内容传送到间接RAM 1 1 MOV @Ri,direct 直接地址内容传送到间接RAM 2 2 MOV @Ri,#data 立即数传送到间接RAM 2 1 MOV DPTR,#data16 16 位地址传送到数据指针 3 2 MOVC A,@A+DPTR 代码字节传送到累加器 1 2 MOVC A,@A+PC 代码字节传送到累加器 1 2 MOVX A,@Ri 外部RAM(8位地址)内容传送到累加器 1 2 MOVX A,@DPTR 外部RAM(16位地址)内容传送到累加器 1 2 MOVX @Ri,A 累加器内容传送到外部RAM(8位地址) 1 2 MOVX @DPTR,A 累加器内容传送到外部RAM(16 地址) 1 2 PUSH direct 直接地址内容压入堆栈 2 2 POP direct 堆栈内容弹出到直接地址 2 2 XCH A,Rn 寄存器和累加器交换 1 1 XCH A, direct 直接地址和累加器交换 2 1

51汇编语言指令集符号定义表 (1)

51汇编语言指令集 符号定义表 符号含义 Rn R0~R7寄存器n=0~7 Direct 直接地址,内部数据区的地址RAM(00H~7FH) SFR(80H~FFH) B,ACC,PSW,IP,P3,IE,P2,SCON,P1,TCON,P0 @Ri 间接地址Ri=R0或R1 8051/31RAM地址(00H~7FH) 8052/32RAM地址(00H~FFH) #data 8位常数 #data16 16位常数 Addr16 16位的目标地址 Addr11 11位的目标地址 Rel 相关地址 bit 内部数据RAM(20H~2FH),特殊功能寄存器的直接地址的位 指令介绍 指令字节周期动作说明 算数运算指令 1.ADD A,Rn 将累加器与寄存器的内容相加,结果存回累加器 2.ADD A,direct 将累加器与直接地址的内容相加,结果存回累加器 3.ADD A,@Ri 将累加器与间接地址的内容相加,结果存回累加器 4.ADD A,#data 将累加器与常数相加,结果存回累加器 5.ADDC A,Rn 将累加器与寄存器的内容及进位C相加,结果存回累加器 6.ADDC A,direct 将累加器与直接地址的内容及进位C相加,结果存回累加器7.ADDC A,@Ri 将累加器与间接地址的内容及进位C相加,结果存回累加器8.ADDC A,#data 将累加器与常数及进位C相加,结果存回累加器 9.SUBB A,Rn 将累加器的值减去寄存器的值减借位C,结果存回累加器 10.SUBB A,direct 将累加器的值减直接地址的值减借位C,结果存回累加器11.SUBB A,@Ri 将累加器的值减间接地址的值减借位C,结果存回累加器 12.SUBB A,#data 将累加器的值减常数值减借位C,结果存回累加器 13.INC A 将累加器的值加1 14.INC Rn 将寄存器的值加l 15.INC direct 将直接地址的内容加1 16.INC @Ri 将间接地址的内容加1 17.INC DPTR 数据指针寄存器值加1 说明:将16位的DPTR加1,当DPTR的低字节(DPL)从FFH溢出至00H时,会使高字节(DPH)加1,不影响任何标志位 18.DEC A 将累加器的值减1 19.DEC Rn 将寄存器的值减1 20.DEC direct 将直接地址的内容减1 21.DEC @Ri 将间接地址的内容减1 22.MUL AB 将累加器的值与B寄存器的值相乘,乘积的低位字节存回累加器,高位字

(完整版)51单片机汇编指令(全)

指令中常用符号说明 Rn当前寄存器区的8个工作寄存器R0~R7(n=0~7) Ri当前寄存器区可作为地址寄存器的2个工作寄存器R0和R1(i=0,1) Direct8位内部数据寄存器单元的地址及特殊功能寄存器的地址 #data表示8位常数(立即数) #data16表示16位常数 Add16表示16位地址 Addr11表示11位地址 Rel8位代符号的地址偏移量 Bit表示位地址 @间接寻址寄存器或基址寄存器的前缀 ( )表示括号中单元的内容 (( ))表示间接寻址的内容 指令系统 数据传送指令(8个助记符) 助记符中英文注释 MOV Move 移动 MOV A , Rn;Rn→A,寄存器Rn的内容送到累加器A MOV A , Direct;(direct)→A,直接地址的内容送A MOV A ,@ Ri;(Ri)→A,RI间址的内容送A MOV A , #data;data→A,立即数送A MOV Rn , A;A→Rn,累加器A的内容送寄存器Rn MOV Rn ,direct;(direct)→Rn,直接地址中的内容送Rn MOV Rn , #data;data→Rn,立即数送Rn MOV direct , A;A→(direct),累加器A中的内容送直接地址中 MOV direct , Rn;(Rn)→direct,寄存器的内容送到直接地址 MOV direct , direct;(direct)→direct,直接地址的内容送到直接地址 MOV direct , @Ri;((Ri))→direct,间址的内容送到直接地址 MOV direct , #data;8位立即数送到直接地址中 MOV @Ri , A;(A)→@Ri,累加器的内容送到间址中 MOV @Ri , direct;direct→@Ri,直接地址中的内容送到间址中 MOV @Ri , #data; data→@Ri ,8位立即数送到间址中 MOV DPTR , #data16;data16→DPTR,16位常数送入数据指针寄存器,高8位送入DPH,低8位送入DPL中(单片机中唯一一条16位数据传送指令) (MOV类指令共16条)

51单片机指令集

51单片机指令集.txt我这辈子只有两件事不会:这也不会,那也不会。人家有的是背景,而我有的是背影。肉的理想,白菜的命。肉的理想,白菜的命。白马啊你死去哪了!是不是你把王子弄丢了不敢来见我了。MCS-51单片机的指令集 1、数据传送类指令 助记符功能说明字节数振荡周期 MOV A,Rn 寄存器内容送入累加器 1 12 MOV A,direct 直接地址单元中的数据送入累加器 2 12 MOV A,@Ri 间接RAM中的数据送入累加器 1 12 MOV A,#data8 8位立即数送入累加器 2 12 MOV Rn,A 累加器内容送入寄存器 1 12 MOV Rn,direct 直接地址单元中的数据送入寄存器 2 24 MOV Rn,#data8 8位立即数送入寄存器 2 12 MOV direct,A 累加器内容送入直接地址单元 2 12 MOV direct,Rn 寄存器内容送入直接地址单元 2 24 MOV direct,direct 直接地址单元中的数据送入直接地址单元 3 24 MOV direct,@Ri 间接RAM中的数据送入直接地址单元 2 24 MOV direct,#data8 8位立即数送入直接地址单元 3 24 MOV @Ri,A 累加器内容送入间接RAM单元 1 12 MOV @Ri,direct 直接地址单元中的数据送入间接RAM单元 2 24 MOV @Ri,#data8 8位立即数送入间接RAM单元 2 12 MOV DPTR,#data16 16位立即数地址送入地址寄存器 3 24 MOV A,@A+DPTR 以DPTR为基地址变址寻址单元中的数据送入累加器 1 24 MOV A,@A+PC 以PC为基地址变址寻址单元中的数据送入累加器 1 24 MOV A,@Ri 外部RAM(8位地址)送入累加器 1 24 MOV A,@DPTR 外部RAM(16位地址)送入累加器 1 24 MOV @Ri,A 累加器送入外部RAM(8位地址) 1 24 MOV @DPTR,A 累加器送入外部RAM(16位地址) 1 24 PUSH direct 直接地址单元中的数据压入堆栈 2 24 POP DIRECT 堆栈中的数据弹出到直接地址单元 2 24 XCH A,Rn 寄存器与累加器交换 1 12 XCH A,direct 直接地址单元与累加器交换 2 12 XCH A,@Ri 间接RAM与累加器交换 1 12 XCHD A,@Ri 间接RAM与累加器进行低半字节交换 1 12 2、算术操作类指令 助记符功能说明字节数振荡周期 ADD A,Rn 寄存器内容加到累加器 1 12 ADD A,direct 直接地址单元加到累加器 2 12 ADD A,@Ri 间接RAM内容加到累加器 1 12 ADD A,#data8 8位立即数加到累加器 2 12 ADDC A,Rn 寄存器内容带进位加到累加器 1 12

51汇编伪指令详解

51汇编伪指令 伪指令是对汇编起某种控制作用的特殊命令,其格式与通常的操作指令一样,并可加在汇编程序的任何地方,但它们并不产生机器指令。许多伪指令要求带参数,这在定义伪指令时由“表达式”域指出,任何数值与表达式匀可以作为参数。不同汇编程序允许的伪指令并不相同,以下所述的伪指令仅适用于MASM51系统,但一些基本的伪指令在大部份汇编程序中都能使用,当使用其它的汇编程序版本时,只要注意一下它们之间的区别就可以了。 MASM51中可用的伪指令有: ORG 设置程序起始地址 END 标志源代码结束 EQU 定义常数 SET 定义整型数 DATA 给字节类型符号定值 BYTE 给字节类型符号定值 WROD 给字类型符号定值 BIT 给位地址取名 ALTNAME 用自定义名取代保留字 DB 给一块连续的存储区装载字节型数据 DW 给一块连续的存储区装载字型数据 DS 预留一个连续的存储区或装入指定字节。 INCLUDE 将一个源文件插入程序中 TITLE 列表文件中加入标题行

NOLIST 汇编时不产生列表文件 NOCODE 条件汇编时,条件为假的不产生清单 一、ORG 伪指令ORG用于为在它之后的程序设置地址值,它有一个参数,其格式为: ORG 表达式 表达式可以是一个具体的数值,也可以包含变量名,如果包含变量名,则必须保证,当第一次遇到这条伪指令时,其中的变量必须已有定义(已有具体的数值),否则,无定义的值将由0替换,这将会造成错误。在列表文件中,由ORG定义的指令地址会被打印出来。 ORG指令有什么用途呢?指令被翻译成机器码后,将被存入系统的ROM中,一般情况下,机器码总是一个接一个地放在存储器中,但有一些代码,其位置有特殊要求,典型的是五个中断入口,它们必须被放在0003H,000BH,0013H,001BH和0023H的位置,否则就会出错,如果我们编程时不作特殊处理,让机器代码一个接一个地生成,不能保证这些代码正好处于这些规定的位置,执行就会出错,这时就要用到ORG伪指令了。看如下例子: 例: INT_0 EQU 1000H TIME_0 EQU 1010H INT_1 EQU 1020H TIME_1 EQU 1030H SERIAL EQU 1040H

单片机汇编语言指令集

汇编语言的所有指令数据传送指令集 MOV 功能: 把源操作数送给目的操作数 语法: MOV 目的操作数,源操作数 格式: MOV r1,r2 MOV r,m MOV m,r MOV r,data XCHG 功能: 交换两个操作数的数据 语法: XCHG 格式: XCHG r1,r2 XCHG m,r XCHG r,m PUSH,POP 功能: 把操作数压入或取出堆栈 语法: PUSH 操作数POP 操作数 格式: PUSH r PUSH M PUSH data POP r POP m PUSHF,POPF,PUSHA,POPA 功能: 堆栈指令群 格式: PUSHF POPF PUSHA POPA LEA,LDS,LES 功能: 取地址至寄存器 语法: LEA r,m LDS r,m LES r,m XLAT(XLATB) 功能: 查表指令 语法: XLAT XLAT m 算数运算指令 ADD,ADC 功能: 加法指令 语法: ADD OP1,OP2 ADC OP1,OP2 格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data 影响标志: C,P,A,Z,S,O SUB,SBB 功能:减法指令 语法: SUB OP1,OP2 SBB OP1,OP2 格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data 影响标志: C,P,A,Z,S,O

INC,DEC 功能: 把OP的值加一或减一 语法: INC OP DEC OP 格式: INC r/m DEC r/m 影响标志: P,A,Z,S,O NEG 功能: 将OP的符号反相(取二进制补码) 语法: NEG OP 格式: NEG r/m 影响标志: C,P,A,Z,S,O MUL,IMUL 功能: 乘法指令 语法: MUL OP IMUL OP 格式: MUL r/m IMUL r/m 影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志) DIV,IDIV 功能:除法指令 语法: DIV OP IDIV OP 格式: DIV r/m IDIV r/m CBW,CWD 功能: 有符号数扩展指令 语法: CBW CWD AAA,AAS,AAM,AAD 功能: 非压BCD码运算调整指令 语法: AAA AAS AAM AAD 影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD) DAA,DAS 功能: 压缩BCD码调整指令 语法: DAA DAS 影响标志: C,P,A,Z,S 位运算指令集 AND,OR,XOR,NOT,TEST 功能: 执行BIT与BIT之间的逻辑运算 语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位 SHR,SHL,SAR,SAL 功能: 移位指令 语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL

51汇编指令大全

Rn: 表示当前寄存器区的8个工作寄存器R0~R7 Ri: 表示当前寄存器区的R0或R1,可作地址指针即间址寄存器(i=0或1) @: 为间接寄存器或基址寄存器的前缀. Direct: 表示8位内部数据存储单元的地址.它可以是内部RAM的单元地址0~127.特殊功能 寄存器SFR的地址(128~255)或名称, A: 累加器ACC. B: .特殊功能寄存器B,用于MUL和DIV指令中. C: 进位位Cy. #data: 表示包含在指令中的单字节(8位)立即数.如果用16位进制表示,后缀字母为”H”,数据范围00~0FFH,不得一字母开头;如果用16进制表示无须任何后缀,但必须在0~255之间. #data16: 表示包含在指令中的双字节(16位)立即数. Adda16: 表示16位的目的地址.用于LCALL和LJMP指令中,目的地址范围是从0000H~FFFFH的整个64KB存储地址空间. Adda11: 表示11位的目的地址.用于ACALL和AJMP的指令中,目的地址必须和下一条指令第一个字节同处一页. Rel: 表示8位带符号的相对偏移量.用语SJMP和所有的条件转移指令中.偏移量相对于下一条指令的第一个字节计算,在-128~+127范围内取值. DPTR: 为数据指针,可用作16位的地址寄存器. /: 加在位操作的前面,表示对该位进行非运算. bit: 表示内部可寻址位或特殊功能寄存器中的直接寻址位. “(x):寄存器或地址单元中的内容. ((x)): 有x见解寻址的单元中的内容. <-: 表示将箭头右边的内容传送至箭头的左边. $: 当前指令的地址.

单片机指令系统 (一) 内部数据传送指令 (1) 以累加器A为目的的传送指令: MOV A, #data ;(A)<-data MOV A, direct ;(A)<-(direct) MOV A, Rn ;(A)<-(Rn) MOV A, @Ri ;(A)<- ((Ri)) (2) 以通用寄存器Rn为目的的传送指令: MOV Rn, A ;(Rn)<-(A) MOV Rn, direct ; (Rn)<(direct)- MOV Rn, #data: ; (Rn)<-(data) (3) 以直接地址为目的的传送指令: MOV direct, A ;(direct)<-(A) MOV direct, Rn ; (direct)<-(Rn) MOV direct, direct2 ; (direct)<-(direct2) MOV direct, @Ri ; (direct)<-((Rn)) MOV direct, #data ; (direct)<-data (4) 以寄存器间接地址为目的的传送指令: MOV @Ri, A ;((Ri))<-(A) MOV @Ri, direct ;((Ri))<-(direct) MOV @Ri, #data ;((Ri))<-data (二) 数据指针赋值指令(16位数据传送指令) MOV DPTR, #data16; (三) 片外数据传送指令

C51单片机指令集大全

格式功能简述字节数周期 一、数据传送类指令 MOV A, Rn 寄存器送累加器 1 1 MOV Rn,A 累加器送寄存器 1 1 MOV A ,@Ri 内部RAM单元送累加器 1 1 MOV @Ri ,A 累加器送内部RAM单元 1 1 MOV A ,#data 立即数送累加器 2 1 MOV A ,direct 直接寻址单元送累加器 2 1 MOV direct ,A 累加器送直接寻址单元 2 1 MOV Rn,#data 立即数送寄存器 2 1 MOV direct ,#data 立即数送直接寻址单元 3 2 MOV @Ri ,#data 立即数送内部RAM单元 2 1 MOV direct ,Rn 寄存器送直接寻址单元 2 2 MOV Rn ,direct 直接寻址单元送寄存器 2 2 MOV direct ,@Ri 内部RAM单元送直接寻址单元 2 2 MOV @Ri ,direct 直接寻址单元送内部RAM单元 2 2 MOV direct2,direct1 直接寻址单元送直接寻址单元 3 2 MOV DPTR ,#data16 16位立即数送数据指针 3 2 MOVX A ,@Ri 外部RAM单元送累加器(8位地址) 1 2 MOVX @Ri ,A 累加器送外部RAM单元(8位地址) 1 2 MOVX A ,@DPTR 外部RAM单元送累加器(16位地址) 1 2 MOVX @DPTR ,A 累加器送外部RAM单元(16位地址) 1 2 MOVC A ,@A+DPTR 查表数据送累加器(DPTR为基址) 1 2 MOVC A ,@A+PC 查表数据送累加器(PC为基址) 1 2 XCH A ,Rn 累加器与寄存器交换 1 1 XCH A ,@Ri 累加器与内部RAM单元交换 1 1 XCHD A ,direct 累加器与直接寻址单元交换 2 1 XCHD A ,@Ri 累加器与内部RAM单元低4位交换 1 1 SWAP A 累加器高4位与低4位交换 1 1 POP direct 栈顶弹出指令直接寻址单元 2 2 PUSH direct 直接寻址单元压入栈顶 2 2 二、算术运算类指令 ADD A, Rn 累加器加寄存器 1 1 ADD A,@Ri 累加器加内部RAM单元 1 1 ADD A, direct 累加器加直接寻址单元 2 1 ADD A, #data 累加器加立即数 2 1 ADDC A, Rn 累加器加寄存器和进位标志 1 1 ADDC A,@Ri 累加器加内部RAM单元和进位标志 1 1 ADDC A, #data 累加器加立即数和进位标志 2 1 ADDC A, direct 累加器加直接寻址单元和进位标志 2 1 INC A 累加器加1 1 1 INC Rn 寄存器加1 1 1

51单片机汇编程序范例

16位二进制数转换成BCD码的的快速算法-51单片机2010-02-18 00:43在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。 程序可见:https://www.wendangku.net/doc/9b4376406.html,/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/6154551f93ba5614403417 32.html中的HEX2BCD子程序。 . 说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。 但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。 上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331个机器周期。 . 单片机系统多半是用于各种类型的控制场合,很多时候都是需要“争分夺秒”的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。 为了提高整机运行的速度,在多年前,做而论道就另外编写了一个转换程序,程序的长度为81字节,执行时间是81个机器周期,(这两个数字怎么这么巧!)执行时间仅仅是经典程序的1/4! . 近来,在网上发现了一个链接:https://www.wendangku.net/doc/9b4376406.html,/news/Article/uc/uc8051/200803/4751.html,也对这个经典转换程序进行了改进,话是说了不少,只是没有实质性的东西。这篇文章提到的程序,一直也没有找到,也难辩真假。 这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。比如说文中提到的:“使用51条指令代码,但执行这段程序却要耗费312个指令周期”,就是败笔。51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,也不能表示确切的时间。 . 下面说说做而论道的编程思路。

51汇编指令大全

51汇编指令大全 Rn: 表示当前寄存器区的8个工作寄存器R0~R7 Ri: 表示当前寄存器区的R0或R1,可作地址指针即间接寻址寄存器(i=0或1) @: 为间接寄存器或基址寄存器的前缀. Direct: 表示8位内部数据存储单元的地址.它可以是内部RAM的单元地址 0~127. 特殊功能寄存器SFR的地址(128~255)或名称, A: 累加器ACC. B: 特殊功能寄存器B,用于MUL和DIV指令中. C: 进位位Cy. #data: 表示包含在指令中的单字节(8位)立即数.如果用16位进制表示,后缀字母为”H”,数据范围00~0FFH,不得一字母开头;如果用16进制表示无须任何后缀,但必须在0~255之间. #data16: 表示包含在指令中的双字节(16位)立即数. Adda16: 表示16位的目的地址.用于LCALL和LJMP指令中,目的地址范围是从0000H~FFFFH的整个64KB存储地址空间. Adda11: 表示11位的目的地址.用于ACALL和AJMP的指令中,目的地址必须和下一条指令第一个字节同处一页. Rel: 表示8位带符号的相对偏移量.用语SJMP和所有的条件转移指令中.偏移量相对于下一条指令的第一个字节计算,在-128~+127范围内取值. DPTR: 为数据指针,可用作16位的地址寄存器. /: 加在位操作的前面,表示对该位进行非运算. bit: 表示内部可寻址位或特殊功能寄存器中的直接寻址位. (x): 寄存器或地址单元中的内容. ((x)): 用x间接寻址的单元中的内容.

<-: 表示将箭头右边的内容传送至箭头的左边. $: 当前指令的地址. 单片机指令系统 (一) 内部数据传送指令 (1) 以累加器A为目的的传送指令: MOV A, #data ;(A)<-data MOV A, direct ;(A)<-(direct) MOV A, Rn ;(A)<-(Rn) MOV A, @Ri ;(A)<- ((Ri)) (2) 以通用寄存器Rn为目的的传送指令: MOV Rn, A ;(Rn)<-(A) MOV Rn, direct ;(Rn)<(direct) MOV Rn, #data: ;(Rn)<-data (3) 以直接地址为目的的传送指令: MOV direct, A ;(direct)<-(A) MOV direct, Rn ;(direct)<-(Rn) MOV direct, direct2 ;(direct)<-(direct2) MOV direct, @Ri ;(direct)<-((Rn)) MOV direct, #data ;(direct)<-data (4) 以寄存器间接地址为目的的传送指令: MOV @Ri, A ;((Ri))<-(A) MOV @Ri, direct ;((Ri))<-(direct)

常用51单片机汇编指令

常用单片机汇编指令: 1 .MOV A,Rn寄存器内容送入累加器 2 .MOV A,direct 直接地址单元中的数据送入累加器 3 .MOV A,@Ri (i=0,1) 间接RAM中的数据送入累加器 4 .MOV A,#data 立即数送入累加器 5 .MOV Rn,A累加器内容送入寄存器 6 .MOV Rn,direct 直接地址单元中的数据送入寄存器 7 .MOV Rn,#data 立即数送入寄存器 8 .MOV direct,A 累加器内容送入直接地址单元 9 .MOV direct,Rn 寄存器内容送入直接地址单元 10. MOV direct,direct 直接地址单元中的数据送入另一个 直接地址单元 11 .MOV direct,@Ri (i=0,1) 间接RAM中的数据送入直接地址单元 12 MOV direct,#data 立即数送入直接地址单元 13 .MOV @Ri,A (i=0,1) 累加器内容送间接RAM单元 14 .MOV@Ri,direct (i=0,1)直接地址单元数据送入间接RAM 单元 15 .MOV @Ri,#data (i=0,1) 立即数送入间接RAM单元 16 .MOV DPTR,#data16 16 位立即数送入地址寄存器 17 .MOVC A,@A+DPTR以DPTR^基地址变址寻址单元中的数 据送入累加器

18 .MOVC A,@A+PC以PC为基地址变址寻址单元中的数据送入累加器 19 .MOVX A,@Ri (i=0,1) 外部RAM(8位地址)送入累加器 20 .MOVX A,@DPTR外部RAM(16位地址)送入累加器 21 .MOVX @Ri,A (i=0,1) 累计器送外部RAM(8位地址) 22 .MOVX @DPTR,A累计器送外部RAM( 16位地址) 23 .PUSH direct 直接地址单元中的数据压入堆栈 24 .POP direct 弹栈送直接地址单元 25 .XCH A,Rn 寄存器与累加器交换 26 .XCH A,direct 直接地址单元与累加器交换 27 .XCH A,@Ri (i=0,1) 间接RAM与累加器交换 28 .XCHD A,@Ri (i=0,1) 间接RAM的低半字节与累加器交换算术操作类指令: 1. ADD A,Rn 寄存器内容加到累加器 2 .ADD A,direct 直接地址单元的内容加到累加器 3 A.DD A,@Ri (i=0,1) 间接ROM的内容加到累加器 4 .ADD A,#data 立即数加到累加器 5 .ADDC A,Rn寄存器内容带进位加到累加器 6 .ADDC A,direct 直接地址单元的内容带进位加到累加器 7 .ADDC A,@Ri(i=0,1) 间接ROM的内容带进位加到累加器 8 .ADDC A,#data 立即数带进位加到累加器

51单片机汇编指令集

1)数据传送类指令(7种助记符) MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送; MOVC(Move Code)读取程序存储器数据表格的数据传送; MOVX (Move External RAM) 对外部RAM的数据传送; XCH (Exchange) 字节交换; XCHD (Exchange low-order Digit) 低半字节交换; PUSH (Push onto Stack) 入栈; POP (Pop from Stack) 出栈; (2)算术运算类指令(8种助记符) ADD(Addition) 加法; ADDC(Add with Carry) 带进位加法; SUBB(Subtract with Borrow) 带借位减法; DA(Decimal Adjust) 十进制调整; INC(Increment) 加1; DEC(Decrement) 减1; MUL(Multiplication、Multiply) 乘法; DIV(Division、Divide) 除法; (3)逻辑运算类指令(10种助记符) ANL(AND Logic) 逻辑与; ORL(OR Logic) 逻辑或; XRL(Exclusive-OR Logic) 逻辑异或; CLR(Clear) 清零; CPL(Complement) 取反; RL(Rotate left) 循环左移; RLC(Rotate Left throught the Carry flag) 带进位循环左移; RR(Rotate Right) 循环右移; RRC (Rotate Right throught the Carry flag) 带进位循环右移; SWAP (Swap) 低4位与高4位交换; (4)控制转移类指令(17种助记符) ACALL(Absolute subroutine Call)子程序绝对调用; LCALL(Long subroutine Call)子程序长调用; RET(Return from subroutine)子程序返回; RETI(Return from Interruption)中断返回; SJMP(Short Jump)短转移; AJMP(Absolute Jump)绝对转移; LJMP(Long Jump)长转移; CJNE (Compare Jump if Not Equal)比较不相等则转移; DJNZ (Decrement Jump if Not Zero)减1后不为0则转移; JZ (Jump if Zero)结果为0则转移; JNZ (Jump if Not Zero) 结果不为0则转移;

相关文档