首页编程单片机汇编语言编程100例?51单片机汇编100例pdf

单片机汇编语言编程100例?51单片机汇编100例pdf

编程之家2026-05-29941次浏览

各位老铁们,大家好,今天由我来为大家分享单片机汇编语言编程100例,以及51单片机汇编100例pdf的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

单片机汇编语言编程100例?51单片机汇编100例pdf

单片机汇编语言的几个疑问

1、如果程序代码空间不紧张的话,建议你全部使用LJMP,或者如果跳转的目标段程序相隔很近,也可以使用SJMP。个人认为AJMP最麻烦:其机器码所标注的地址位从A10到A0,计11位,000H~7FFH,也就是说跳转到的地址与当前地址的A10到A0必须一样,比如:

原来AJMP地址为:07F8H,目标地址:07F0H,如果调试软件修改后,变为

AJMP地址为:0800H,目标地址:07F8H,A11不一样,不在一页范围,此时还得将其改成LJMP,否则编译出错。其实就省了一个字节,执行时间上都是2个机器周期,没区别,所以犯不上。如果像此例,使用SJMP倒是个较好的选择,只是要求你对代码间的间隔有数才行。

总之,尽量用LJMP吧。

2、二者区别其实就是转移的目标是绝对地址,还是针对当前转移指令所在地址的相对偏移量

【绝对转移】51中只有AJMP、LJMP是绝对转移指令,都是直接跳转到固定地址。我们平时写的比如LJMP MAIN语句,源程序中并未表示出这一点,假设MAIN标志的程序段是从0102H开始的,此句编译后的机器码是02 01 02,02代表LJMP跳转,后两个字节0102则为目标地址,由于使用了2个字节指明目标地址,所以其范围就是整个64K的空间,没有限制;AJMP在这一点上就要差些,只能在所在的2K页内跳转。

单片机汇编语言编程100例?51单片机汇编100例pdf

【相对转移】剩下的转移指令都是相对转移指令,包括SJMP,它们是以当前语句的下一条语句所在地址为准,PC值向前或向后偏移数个字节地址开始执行,偏移量范围从-128到+127,以补码方式存在。比如

ORG 0100H

NO1: CLR A

SJMP NO1

编译后地址及机器码:

0100H: 0E4H(CLR A)

单片机汇编语言编程100例?51单片机汇编100例pdf

0101H: 80H 0FDH(SJMP NO1,从0103跳回0100,倒退3字节,3的补码即取反+1=FDH

0103H: 00H

3、要想能高效的调试大的汇编程序,首先要求程序本身的编制应该规范。关于这一点我有些感触,就算是经验吧,供参考(我曾经用汇编做过50多K机器码的程序)。

单片机的执行其实是单一线程的,一般只有两种情况会偏离原来的流程,一种是中断服务子程序,注意别忘了使用RETI;还有就是普通子程序,别忘了使用RET;再加上注意出栈、入栈操作,而且该操作因成对并保证先进后出原则,这样的话才真正做到模块化编程,调试时才能不理睬其它部份,单独调试某个模块,提高效率。这一点C语言就比较好,以函数方式实现,少写括号编译通不过,不像汇编,少些个RET照样能通过。

另外,编写程序时应养成一种习惯:对程序体中的寄存器操作尽量不要直接使用其地址,比如:MOV 30H,A,这里直接写30H不好,因为大的汇编程序对寄存器地址的调整是很常见的现象,一旦修改,程序中每个地方都要改,容易遗漏,一旦遗漏,非常难找原因的。可以用EQU伪指令对其定义,程序体中使用。同样,这一点C语言要好的多,至少不需要去分配寄存器了。

还有一个最容易出错的地方,就是关于标志位C:比如CJNE指令,它的判断是会影响C标志位的,如果程序后面有对C标志位判断的语句又没有考虑这种情况,问题极难查。很多人包括我自己会忽略这种细节。这类问题只能靠细致了。

最后谈谈调试

调试过程一般都是逐个模块(子程序)分别调试,完成一个再检查下一个,不能指望一上来就正确。调试完后还要多次、多人测试,自己有时形成了固定思维,发现不了问题。

终极方法:分部仿真设断点甚至于单步执行。对一些外部输入可以采用到断电后修改寄存器数值的方法来模拟。当然最理想的情况是不用,只是初期恐怕是免不了的。比如对上面所说的C标志位问题,我个人当初几乎都是这样找出的问题

大的汇编程序的调试确实比较麻烦,首先要求你对软件流程很清晰,对单片机的运行模式也要很了解。至于你现在的程序如果有问题,我建议还是采用仿真设断点的方式来找问题,尤其是如果搞单片机的时间不长的话,这样其实可能更快些。

希望所说能对你有所帮助。

汇编语言在51单片机中的所有指令有那些

单片机指令功能一览表

助记符代码说明

MOV A,Rn E8~EF寄存器A

MOV A,direct E5 dircet直接字节送A

MOV A,@Ri ER~E7间接RAM送A

MOV A,#data 74 data立即数送A

MOV Rn,A F8~FF A送寄存器

MOV Rn,dircet A8~AF dircet直接字节送寄存器

MOV Rn,#data 78~7F data立即数送寄存器

MOV dircet,A F5 dircet A送直接字节

MOV dircet,Rn 88~8F dircet寄存器送直接字节

MOV dircet1,dircet2 85 dircet1 dircet2直接字节送直接字节

MOV dircet,@Ro 86~87间接RAM送直接字节

MOV dircet,#data 75 dircet data立即数送直接字节

MOV@Ri,A F6~F7 A送间接RAM

MOV@Ri,#data 76~77 data直接字节送间接RAM

MOV@Ri,#data 76~77 data立即数送间接RAM

MOV DPTR,#data16 90 data 15~8 16位常数送数据指针

data7~0

MOVC A,@A+DPTR 93由((A)+(DPTR))寻址的程序存贮

器字节选A

MOVC A,@A+PC 83由((A)+(PC));寻址的程序存贮器字节送A

MOVX A,@Ri E2~E3送外部数据(8位地址)送A

MOVX A,@DPTR E0送外部数据(16位地址)送A

MOVX@Ri,A F2~F3 A送外部数据(8位地址)

MOVX@DPTR,A F0 A送外部数据(16位地址)

PUSH dircet C0 dircet直接字节进栈,SP加1

POP dircet D0 dircet直接字节退栈,SP减1

XCH A,Rn C8~CF交换A和寄存器

XCH A,dircet C5 dircet交换A和直接字节

XCH A,@Ri C6~C7交换A和间接RAM

XCH A,@Ri D6~D7交换A和间接RAM的低位

SWAP A C4

算术操作(A的二个半字节交换)

ADD A,Rn 28~2F寄存器加到A

ADD A,dircet 25 dircet直接字节加到A

ADD A,@Ri 26~27间接RAM加到A

ADD A,#data 24data立即数加到A

ADD A,Rn 38~3F寄存器和进位位加到A

ADD A,dircet 35dircet直接字节和进位位加到A

ADD A,@Ri 36~37间接字节和进位位加到A

ADD A,data 34 data立即数和进位位加到A

ADD A,Rn 98~9F A减去寄存器和进位位

ADD A,dircet 95 dircet A减去直接字节和进位位

ADD A,@Ri 36~37间接RAM和进位位加到A

ADD A,data 34 data立即数和进位位加到A

SUBB A,Rn 98~9F A减去寄存器和进位位

SUBB A,dircet 95 dircet A减去直接字节和进位位

SUBB A,@Ri 96~97 A减去间接RAM和进位位

SUBB A,#data 94 data A减去立即数和进位位

INC A 04 A加1

INC Rn 08~0F寄存器加1

INC dircet 05 dircet直接字节加1

INC@Ri 06~07间接RAM加1

DEC A 14 A减1

DEC Rn 18~1F寄存器减1

DEC dircet 15 dircet直接字节减1

DEC@Ri 16~17间接RAM减1

INC DPTR A3数据指针加1

MUL AB A4 A乘以B

DIV AB 84 A除以B

DA A D4 A的十进制加法调整

逻辑操作

ANL A,Rn 58~5F寄存器“与”到A

ANL A,dircet 55 dircet直接字节“与”到A

ANL A,@Ri 56~57间接RAm“与”到A

ANL A,#data 54 data立即数“与”到A

ANL dircet A 52 dircet A“与”到直接字节

ANL dircet,#data 53 dircet data立即数“与”到直接字节

ORL A,Rn 48~4F寄存器“或”到A

ORL A,dircet 45 dircet直接字节“或”到A

ORL A,@Ri 46~47间接RAM“或”到A

ORL A,#data 44 data立即数“或”到A

ORL dircet,A 42 dircet A“或”到直接字节

ORL dircet,#data 43 dircet data立即数“或”到直接字节

XRL A,Rn 68~6F寄存器“异或”到A

XRL A,dircet 65 dircet直接字节“异或”到A

XRL A,@Ri 66~67间接RAM“异或”到A

XRL A,#data 64 data立即数“异或”到A

XRL dircet A 62 dircet A“异或”到直接字节

XRL dircet,#data 63 dircet data立即数“异或”到直接字节

CLR A E4清零

CPL A F4 A取反

RL A 23 A左环移

RLC A 33 A通过进位左环移

RR A 03 A右环移

RRC A 13 A通过进位右环移

控制程序转移

ACALL addr 11*1 addr(a7~a0)绝对子程序调用

LCALL addr 16 12 addr(15~8)长子程序调用

addr(7~0)

RET 22子程序调用返回

RETI addr 11 32中断调用返回

AJMP addr 11△1 addr(a7~a6)绝对转移

LJMP addr 16 02addr(15~8)长转移

addr(7~0)

SJMP rel 80 rel短转移,相对转移

JMP@A+DPTR 73相对于DPTR间接转移

JZ rel 60 rel A为零转移

JNZ rel 70 rel A为零转移

CJNE A,dircet,rel B5 dircet rel直接字节与A比较,不等则转移

CJNE A,#data,rel B4 data rel立即数与A比较,不等则转移

CJNE A,Rn,#data,rel B8~BF data rel立即数与寄存器比较,不等则转移

CJNE@Ri,#data,rel B6~B7 data rel立即数与间接RAM比较,不等则转移

DJNZ Rn,rel D8~DF rel寄存器减1,不为零则转移

DJNZ dircet,rel B5 dircet rel直接字节减1,不为零则转移

NOP 00空操作

*=a10a9a8l

△=a10a9a80

布尔变量操作

CLR C C3清零进位

CLR bit C2清零直接位

SETB C D3置位进位

SETB bit D2置位直接位

CPL C B3进位取反

CPL bit B2直接位取反

ANL C,bit 82 dit直接数“与”到进位

ANL C,/bit B0直接位的反“与”到进位

ORL C,bit 72 bit直接位“或”到进位

ORL C,/bit A0 bit直接位的反“或”到进位

MOV C,bit A2 bit直接位送进位

MOV bit,C 92 bit进位送直接位

JC rel 40 rel进位位为1转移

JNC rel 50 rel进位位为0转移

JB bit,rel 20 bit rel直接位为1相对转移

JNB bit,rel 30 bit rel直接位为0相对转移

JBC bit,rel 10 bit rel直接位为1相对转移,然后清零该位

[1].循环移位指令(4条)

RL A;累加器A中的内容左移一位

RR A;累加器A中的内容右移一位

RLC A;累加器A中的内容连同进位位CY左移一位

RRC A;累加器A中的内容连同进位位CY右移一位

[2].累加器半字节交换指令(1条)

SWAP A;累加器中的内容高低半字节互换

[3].求反指令(1条)

CPL A;累加器中的内容按位取反

[4].清零指令(1条)

CLR A; 0→(A),累加器中的内容清0

[5].逻辑与操作指令(6条)

ANL A,data;累加器A中的内容和直接地址单元中的内容执行与逻辑操作。结果存在寄存器A中。

ANL data,#data;直接地址单元中的内容和立即数执行与逻辑操作。结果存在直接地址单元中。

ANL A,#data;累加器A的内容和立即数执行与逻辑操作。结果存在累加器A中。

ANL A,Rn;累加器A的内容和寄存器Rn中的内容执行与逻辑操作。结果存在累加器A中。

ANL data,A;直接地址单元中的内容和累加器A的内容执行与逻辑操作。结果存在直接地址单元中。

ANL A,@Ri;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行与逻辑操作。结果存在累加器A中。

[6].逻辑或操作指令(6条)

这组指令的作用是将两个单元中的内容执行逻辑或操作。如果直接地址是I/O地址,则为“读—修改—写”操作。

ORL A,data;累加器A中的内容和直接地址单元中的内容执行逻辑或操作。结果存在寄存器A中。

ORL data,#data;直接地址单元中的内容和立即数执行逻辑或操作。结果存在直接地址单元中。

ORL A,#data;累加器A的内容和立即数执行逻辑或操作。结果存在累加器A中。

ORL A,Rn;累加器A的内容和寄存器Rn中的内容执行逻辑或操作。结果存在累加器A中。

ORL data,A;直接地址单元中的内容和累加器A的内容执行逻辑或操作。结果存在直接地址单元中。

ORL A,@Ri;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行逻辑或操作。结果存在累加器A中。

[7].逻辑异或操作指令(6条)

XRL A,data;累加器A中的内容和直接地址单元中的内容执行逻辑异或操作。结果存在寄存器A中。

XRL data,#data;直接地址单元中的内容和立即数执行逻辑异或操作。结果存在直接地址单元中。

XRL A,#data;累加器A的内容和立即数执行逻辑异或操作。结果存在累加器A中。

XRL A,Rn;累加器A的内容和寄存器Rn中的内容执行逻辑异或操作。结果存在累加器A中。

XRL data,A;直接地址单元中的内容和累加器A的内容执行逻辑异或操作。结果存在直接地址单元中。

XRL A,@Ri;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行逻辑异或操作。结果存在累加器A中

控制转移类指令分析

[1].无条件转移指令(4条)

LJMP addr16;addr16→(PC),给程序计数器赋予新值(16位地址)

AJMP addr11;(PC)+2→(PC),addr11→(PC10-0)程序计数器赋予新值(11位地址),(PC15-11)不改变

SJMP rel;(PC)+ 2+ rel→(PC)当前程序计数器先加上2再加上偏移量给程序计数器赋予新值

JMP@A+DPTR;(A)+(DPTR)→(PC),累加器所指向地址单元的值加上数据指针的值给程序计数器赋予新值

[2].条件转移指令(8条)

JZ rel; A=0,(PC)+ 2+ rel→(PC),累加器中的内容为0,则转移到偏移量所指向的地址,否则程序往下执行

JNZ rel; A≠0,(PC)+ 2+ rel→(PC),累加器中的内容不为0,则转移到偏移量所指向的地址,否则程序往下执行

CJNE A, data, rel; A≠(data),(PC)+ 3+ rel→(PC),累加器中的内容不等于直接地址单元的内容,则转移到偏移量所指向的地址,否则程序往下执行

CJNE A,#data, rel; A≠#data,(PC)+ 3+ rel→(PC),累加器中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行

CJNE Rn,#data, rel; A≠#data,(PC)+ 3+ rel→(PC),工作寄存器Rn中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行

CJNE@Ri,#data, rel; A≠#data,(PC)+ 3+ rel→(PC),工作寄存器Ri指向地址单元中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行

布尔变量操作指令分析

[1].位传送指令(2条)

MOV C,bit;bit→CY,某位数据送CY

MOV bit,C;CY→bit,CY数据送某位

[2].位置位复位指令(4条)

CLR C; 0→CY,清CY

CLR bit; 0→bit,清某一位

SETB C; 1→CY,置位CY

SETB bit; 1→bit,置位某一位

[3].位运算指令(6条)

ANL C,bit;(CY)∧(bit)→CY

ANL C,/bit;(CY)∧()→CY

ORL C,bit;(CY)∨(bit)→CY

ORL C,/bit;(CY)∧()→CY

CPL C;()→CY

CPL bit;()→bir

[4].位控制转移指令(5)

JC rel;(CY)=1转移,(PC)+2+rel→PC,否则程序往下执行,(PC)+2→PC。

JNC rel;(CY)=0转移,(PC)+2+rel→PC,否则程序往下执行,(PC)+2→PC。

JB bit, rel;位状态为1转移。

JNB bit, rel;位状态为0转移。

JBC bit, rel;位状态为1转移,并使该位清“0”。

简述汇编语言编写单片机程序的缺点

1、入门难,一般认为汇编语言比C语言难学。

2、可读性差,汇编语言必须加比较详尽的注释,否则过一段时间编程者自己看都困难。

3、缺乏人性化,汇编语言使用的是面向机器的指令,与人们的思维方式相悖,需要编程者转变思维方式。

4、编程工作量大,汇编语言编程的语句要多于C语言,再加上注释则工作量比较大。

5、可移植性差,如51的汇编移植到AVR很困难,而C语言只要修改少量语句即可。

6、参考资料少,近年随着C语言的普及例程和函数都比较多,而汇编语言无法于此相比。

简单总结应该就是以上几点。

END,本文到此结束,如果可以帮助到大家,还望关注本站哦!

java难吗(JAVA难学吗)手机行业asp是什么意思 asp还有人用吗