MCS | 您所在的位置:网站首页 › 为什么单片机用c语言编程 › MCS |
一、程序语言的种类和汇编指令的格式
1.1程序语言的种类
(1)机器语言(machine language) 直接用机器码(0、1代码)编写的语言,能够成为计算机直接执行的机器级语言。 优点:执行速度快; 缺点:可读性极差,程序的设计、输入、调试、修改都十分麻烦。 (2)汇编语言(assembly language) 用指令助记符代替机器码的编程语言。 优点:程序结构简单、执行速度快、程序易优化、编译后占用内存少; 缺点:可读性比较差。 (3)高级语言(high-level language) 在汇编语言的基础上,用接近人的自然语言的语句来编写程序。 优点:程序可读性强,通用性好,适用于不熟悉处理器底层硬件的用户; 缺点:结构不紧凑,编译后占空间较大。 1.2 MCS-51汇编语言的指令格式(1)常用符号 Rn(n=0~7):表示当前工作寄存器R0-R7中的任一个 Ri(i=0或1):表示当前工作寄存器中用于间址的R0或R1 #data:表示8位立即数 #data16:表示16位立即数 direct:表示片内RAM的8位地址 addr11:表示11位目的地址,用于ACALL和AJMP指令中 addr16:表示16位目的地址,用于LCALL和LJMP指令中 rel:用补码形式表示的8位二进制地址偏移量,取值范围是-128~+127 bit:表示片内RAM的位寻址区,或者是可以位寻址的SFR的位地址 A(或ACC):表示累加器 B:B寄存器 C:PSW中的进位标志Cy @:在寄存器间接寻址方式中,是间址寄存器指针的前缀标志 $:表示当前指令地址 (X):表示由X所指的某寄存器或某单元中的内容,即X是单元地址,(X)是单元中的内容。 (2)指令格式 [标号:] 操作码 [操作数] [,操作数] [;注释] 二、MCS-51单片机的寻址方式 2.1 寄存器寻址指令所需的操作数在MSC-51内部累加器A、通用寄存器B、某个工作寄存器Rn、数据指针DPTR等。 例:MOV A,R1 ;将寄存器R1中的内容送到累加器A当中 MOV R6,A; 将累加器A中的内容送到寄存器R6当中 特点:寄存器寻址方式的指令大多是单字节指令。工作寄存器的3位代码与操作码OP共同占用一个指令字节。 2.2 直接寻址指令的指令码中含有操作数的地址。 寻址范围:片内RAM的低128字节以及SFR,SFR只能通过直接寻址; 例:MOV A,30H;将内部RAM中30H单元的内容送到累加器A中 MOV 30H,50H;将内部RAM中50H单元中的内容送到30H单元中 注意: a)当直接寻址的地址为SFR的某一个时,direct既可以使用SFR的物理地址,也可以使用SFR的名称符号; 例:MOV A,80H MOV A,P0 P0的物理地址是80H,上面两个语句的执行结果是相同的,但提倡后者,可读性更强 b)当直接地址是在工作寄存器区中时,最好用寄存器寻址方式来访问 例:MOV A,00H;双字节 MOV A,R0;单字节 c)同样的,在MCS-51的指令系统中,累加器有A、ACC、和E0H(物理地址)三种表示形式,分别属于两种不同的寻址方式,但指令的执行效果是相同的。 例:INC A;寄存器寻址(单字节) INC ACC;直接寻址(双字节) INC E0H;直接寻址(双字节) 2.3立即寻址指令中直接含有所需要的操作数data 例:MOV A,#data MOV DPTR,#data16 特点:立即寻址的指令长度为2或3字节 区别于直接寻址: MOV A,#30H;(A) MOV A,30H;(A) 指令中含有保存操作数地址的寄存器(Ri或DPTR) 执行过程:CPU先从寄存器中找到操作数地址,然后再根据该地址找到操作数。 例:MOV R0,#20H;(R0) MOV A,@R0; (A) MOVX A,@R0;此时20H的地址是片外RAM中的地址 MOV DPTR,#1FF0H; MOVX A,@DPTR 寻址范围:片内RAM低128字节、外部RAM 错误使用间址寻址:MOV R0,80H MOV A,@R0 解析:80H是SFR中P0的物理地址,SFR只能使用直接寻址,不能使用间址寻址,间址寻址的范围是片内RAM低128字节和片外RAM 2.5变址寻址指令中使用DPTR或PC中的内容作为基地址,再与累加器A的内容相加,其合作为操作数地址。 特点:1.DPTR或PC中应预先存放有操作数的基地址; 2.累加器A中应预先放有被寻址操作数地址与基地址之间的偏移量,该地址偏移量应该是00H~FFH范围内的无符号数; 3.在执行变址寻址时,单片机首先将基地址与地址偏移量相加,以形成操作数的物理地址; 4.变址寻址指令是单字节双周期指令。 寻址空间:ROM,这是访问程序存储器ROM中数据的唯一方式,变址寻址方式常用于查表操作。 例:MOVC A,@A+PC; (A) MOVC A,@A+DPTR; (A) 例题:已知ROM中的0300H~0309H中存放着0~9的平方表,编程求A中数据的平方(设A=02H) MOV DPTR,#3000H MOVC A,@A+DPTR 2.6 相对寻址相对转移指令使用的一种寻址方式。 相对转移指令中给出一个转移地址的偏移量rel(操作数)。在执行中将当前的PC值(将要执行的指令的首地址)与偏移量rel(补码)相加,形成实际转移的目标地址。 rel是八位有符号数(-128~127) 2.7 位寻址指令与直接寻址相似,区别在于指令中的地址是“位地址”。 三、数据传送指令 3.1 内部数据传送指令特点:源操作数和目的操作数的地址都在单片机内部,可以是片内RAM地址,也可以是特殊功能寄存器SFR的地址。 分类:按照寻址方式分为立即、直接、寄存器、寄存器间址四类。 (1)立即寻址型传送指令 特点:多字节指令,源操作数是立即数。 类型:MOV A,#data;双字节指令 MOV Rn,#data;双字节指令 MOV @Ri,#data;双字节指令 MOV direct,#data;双字节指令 这类指令多用于程序的初始化。 (2)直接寻址型传送指令 特点:多字节指令,指令中至少含有一个源操作数或目的操作数的地址,在第2或第3字节上。 类型:MOV A,direct MOV direct,A MOV Rn,direct MOV @Ri,direct MOV direct1,direct2 (3)寄存器寻址型传送指令 MOV A,Rn MOV Rn,A MOV direct,Rn (4)寄存器间址型传送指令 MOV A,@Ri MOV @Ri,A MOV direct,@Ri 3.2 外部数据传送指令(1)16位数传送指令 MOV DPTR,#data16 该指令将16位立即数送入DPTR,高8位送到DPH,低8位送到DPL,这个被当作是立即数的data16实际是外部RAM或ROM的地址,是专门配合外部数据传送指令使用的。 (2)外部ROM的字节传送指令(查表指令) MOVC A,@A+DPTR;远程查表指令 MOVC A,@A+PC;近程查表指令 两条指令均为变址寻址方式,第一条指令中的DPTR可以由用户赋值一个任意的16位数,因此外部ROM的64k范围内的都可以访问;第二条指令中的基地址为PC,PC的内容虽然是可以改变的,但是一旦被执行指令在程序中的位置确定,PC内的值也就确定了,因此PC+A可变化的范围只是A中的8位数,因此只能访问PC后256B的空间。 (3)外部RAM的字节传送指令 特点:①都要通过累加器A; ②只能使用寄存器间址的方式。 MOVX A,@Ri MOVX @Ri,A MOVX A,@DPTR MOVX @DPTR,A 3.3 堆栈操作指令压栈指令:PUSH direct;SP 弹出指令:POP direct; (direct) 注意:①PUSH、POP指令使用的是直接寻址方式,因此direct位置只能是物理地址或者SFR特殊功能寄存器中的符号,不能是工作寄存器Rn或累加器A等。 PUSH A;× PUSH ACC;√ ②系统上电复位时,SP=07H,SP的值一般需要修改,因为07H在工作寄存器组的范围内,后续编程可能会用到工作寄存器组,引起冲突。 3.4 数据交换指令累加器A与寄存器/片内RAM之间的数据交换 XCH A,Rn;(A) XCH A,direct;(A) XCH A,@Ri;(A) XCHD A,@Ri;(A)0~3 功能:实现算术运算、逻辑运算和循环换位三大功能。 特点:大多数指令都由A存放一个源操作数,并把操作结果放回累加器A中。 4.1算术运算指令(1)加法指令 a)不带进位加法 ADD A,Rn; A ADD A,@Ri; A ADD A,direct; A ADD A,#data; A 注:①参与运算的数是8位的,结果也是8位的,并且影响PSW(Cy、Ac、OV、P); ②8位数据可以是有符号数,也可以是无符号数,CPU均将其视为有符号数(补码)进行运算并影响PSW(Cy、Ac、OV、P); ③两数都是无符号数,且PSW中的进位Cy为0,说明数据没有溢出,结果正确; ④两数都是有符号数,且PSW中的OV=0,说明数据没有溢出,结果正确;若OV=1,说明溢出,出现了两正数相加为负或两负数相加为正的情况,结果不正确。 b)带进位加法 常用于多字节数相加中的高位加法。 ADDC A,Rn;A ADDC A,@Ri; A ADDC A,direct; A ADDC A,#data; A Cy:指令执行前的Cy。 对PSW的影响同ADD指令 c)加一指令 INC A INC Rn INC @Ri INC direct INC DPTR;唯一一条16位算术运算指令 (2)减法指令 a)带进位的减法指令 SUBB A,Rn; A SUBB A,@Ri; A SUBB A,direct; A SUBB A,#data; A 在MCS-51的指令系统中,没有不带进位的减法,需要时,可以在使用SUBB之前将Cy清零指令:CLR C b)减一指令 DEC A DEC Rn DEC @Ri DEC direct 注意:DPTR不能使用DEC指令实现减1 DPTR的减1实现代码: DPTRSUB1:CLR C;进位标志清零 MOV A,DPL;先对DPTR的低8位减1 SUBB A,#1 MOV DPL,A MOV A,DPH;再对DPTR的高8位减0 SUBB A,#0 MOV DPH,A (3)十进制调整指令 DA A;若Ac=1或A3~0>9,则A+06H 若Cy=1或A7~4>9,则A+60H (4)乘法与除法指令 MUL AB; A*B,结果的低8位存在A中,高8位存在B中 DIV AB; A/B,结果的商存在A中,余数存在B中 在乘法指令中,影响PSW的Cy、OV、P:Cy总是清零;OV表示积的大小,当超过255(B>0)时,OV=1;P取决于A中1的个数 在除法指令中,影响PSW的Cy、OV、P:Cy总是清零;当B=0时OV=1(除数=0无意义);P取决于A中1的个数 4.2 逻辑运算指令(1)逻辑与运算指令 目的:操作数按位相与 ANL A,Rn ANL A,@Ri ANL A,direct ANL A,#data ANL direct,A ANL direct,#data 特殊用法:屏蔽掉一个字节中的某些位置,例如用0FH与,屏蔽掉高四位,用F0H屏蔽掉低四位 (2)逻辑或运算指令 目的:操作数按位取或 ORL A,Rn ORL A,@Ri ORL A,direct ORL A,#data ORL direct,A ORL direct,#data 特殊用法:可以对字节中某个位置置1,其他不变,例如0FH对低4位置1,高四位不变。 (3)逻辑异或运算指令 目的:对操作数按位取异或 XRL A,Rn XRL A,@Ri XRL A,direct XRL A,#data XRL direct,A XRL direct,#data 特殊用法:可以对字节中某个位置取反,其他不变,利用用0FH对低4位取反,高四位不变 (4)累加器清零或取反指令 累加器清零:CLR A 累加器取反:CPL A 4.3移位指令RL A;左移位 RR A;右移位 RLC A;带进位位左移位 RRC A;带进位位右移位 SWAP A;高四位与第四位互换位置 五、控制转移指令作用:改变程序计数器PC中的内容实现改变程序的流向。 5.1 无条件转移指令(1)长转移指令(三字节双周期指令) LJMP addr16;PC 将指令码中addr16送入程序计数器PC中,使机器执行下条指令时无条件跳转到addr16处执行程序。由于addr16是一个16位的二进制地址,因此长跳转指令是可以在64k空间范围内转移的指令。 (2)绝对转移指令(双字节双周期) AJMP addr11;PC 转移范围:PC的高5位不变,低11位改为addr11的内容,因此可以在2KB的范围内向前或向后转移。 (3)短转移指令(双字节双周期) SJMP rel; PC 先执行完该指令,因为短转移指令是双字节指令,因此PC=PC+2,根据该指令,PC要加上偏移量rel,PC=PC+rel,因此跳转后的PC内容为PC=PC+2+rel。 rel是8位无符号数,因此转移范围是-128~+127 (4)变址转移指令(单字节双周期) JMP @A+DPTR 寻址范围:64KB 5.2 条件转移指令(1)累加器A判零转移指令(双字节) JZ rel;若A=0,则 PC 若A JNZ rel; 若A 若A=0,则 PC (2)比较转移指令 CJNE A,#data,rel CJNE Rn,#data,rel CJNE A,direct,rel CJNE @Ri,#data,rel 四条指令均为将操作数1与操作数2比较,两数不相等时跳转,两数相等时不跳转。 同时该指令对PSW中的Cy位有影响,当操作数1小于操作数2时,Cy=1;当操作数1大于等于操作数2时,Cy=0。因此还可以作为比较指令使用。 (3)减1条件转移指令 DJNZ Rn,rel;双字节指令 DJNZ direct,rel;三字节指令 操作数减1后判断是否等于0,等于0不跳转,不等于0跳转。 5.3 子程序调用与返回指令(1)子程序调用指令 ACALL addr11;短调用指令 PC SP SP PC10~0 LCALL addr16;长调用指令 PC SP SP PC (2)子程序返回指令 RET;子程序返回 (SP) (SP) RETI;中断子程序返回 (SP) (SP) NOP 功能:仅使程序计数器PC加1,消耗一个机器周期,所以常用作延时。 六、位操作指令 6.1位传送指令MOV C,bit MOV bit,C 6.2位置位和位清零指令CLR C;C清零 SETB C;C置1 CLR bit;bit清零 SETB bit;bit置1 6.3位运算指令ANL C,bit ANL C,/bit ORL C,bit ORL C,/bit CPL C CPL bit 6.4位控制转移指令(1)以Cy的内容为条件的跳转指令 JC rel;Cy=1跳转,Cy=0不跳转 JNC rel;Cy=0跳转,Cy=1不跳转 (2)以位地址的内容为条件的跳转指令 JB bit,rel;bit=1跳转,bit=0不跳转 JNB bit,rel;bit=0跳转,bit=1不跳转 JBC bit,rel;bit=1跳转,同时将bit清零,bit=0不跳转 |
CopyRight 2018-2019 实验室设备网 版权所有 |