部分汇编语言程序设计-2.ppt_第1页
部分汇编语言程序设计-2.ppt_第2页
部分汇编语言程序设计-2.ppt_第3页
部分汇编语言程序设计-2.ppt_第4页
部分汇编语言程序设计-2.ppt_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三讲:指令与编程,本讲重点: 寻址方式; MCS-51指令集; 伪指令; 汇编语言与简单程序设计.,第三部分 指令系统及程序设计,51系列单片机指令集含有111条指令,每条指令在执行时要花去一定的时间,以机器周期为单位。按指令执行时间分类: 单周期(64条);双周期(45条);4周期(2条),按指令的功能分类,可分为5大类: 数据传送类(29条);算术运算类(24条) 逻辑运算及移位类(24);控制转移类(17条) 位操作类(17条),每条指令在程序存储器ROM中占据一定的空间,以字节为单位。按指令所占字节数分类: 单字节(49条);双字节(46条);3字节(16条),ASM-51指令的格式 P46,方括符 表示可选项 标号代表指令所在地址,1-8个字母/数字,“:”结尾 操作码就是指令功能助记符,指令实体 目的操作数 源操作数 注释,以“;”开头,标号:操作码 目的操作数,源操作数;注释,51单片机指令的寻址方式 P48,寄存器寻址 立即寻址 寄存器间接寻址 直接寻址 变址寻址(基址寄存器+变址寄存器间接寻址) 相对寻址 位寻址,寻址方式:指令按地址获得操作数的方式 七种寻址方式,一条指令可能含多种寻址方式,寄存器寻址 从寄存器中读取操作数或存放操作数进寄存器 例:MOV A,B ; (A) (B) MOV 30H,R0 ;(30H)(R0) MOV A,R1 ; (A) (R1),立即寻址 操作数直接就出现在指令中 例:MOV A,#64H ;(A) 立即数 64H ADD A,#05H ;(A)(A)+立即数 05H 注意:符号“#”表明其后跟的是立即数, 立即数就是数字量本身。,寄存器间接寻址 寄存器中的内容是一个地址,由该地址单元 寻址到所需的操作数,注意: 1)“间接”表示某寄存器中的“内容”只是一个“单元地址”,这个地址单元中存放的数据才是要找的“操作数”。 2)符号“”表示“在”,其含义与读音皆同“at”。,例: MOV R1,#30H ;(R1) 立即数30H , MOV R1,#30H ;(R1) 立即数30H MOV R1,#0FH ;(30H)立即数0FH MOV A,R1 ;(A)(30H)=#0FH,直接寻址 指令中直接给出了操作数所在单元的地址或名称 例:MOV R1,1FH ;(R1) (1FH) MOV 30H,4AH ;(30H)(4AH),在本单片机中规定:访问特殊功能寄存器SFR只能采用直接寻址方式。例如: MOV A, SP ; (A) (SP) MOV A, 81H ; (A) (SP) MOV P1, #5AH ; (P1)(#5AH) MOV 90H,#5AH ; (P1)(#5AH) MOV B, 30H ; (B) (30H),SFR的地址见 P.39表2-6,相同,相同,在本单片机中访问特殊功能寄存器SFR只能采用直接寻址方式的原因:SFR分布在80H0FFH范围内,而52系列单片机有256字节的片内RAM,其中的80H0FFH的RAM与SFR所占地址重叠。,MOV A, 90H 等效于 MOV A, P1 属直接寻址 MOV A, R0 ;事先已知 (R0) = #90H 执行的操作:A (90H) 属寄存器间接寻址, 随意写的指令如:MOV A, 85H 则是非法的!,于是规定: 80H0FFH范围内的RAM只能用寄存器间接寻址方式,而SFR只能用直接寻址方式。从而解决了地址冲突的问题。例如:,存储器配置(片内RAM),89C51片内RAM 128字节(00H7FH) 89C52片内RAM 256字节(00H0FFH),00H,20H,2FH,7FH,1FH,30H,80H,FFH,52子系列才有 的RAM区,普通RAM区,位寻址区,工作寄存器区,SFR分布在80H-FFH 其中92个位可位寻址,80H,FFH,89C51 128字节,89C52 256字节,只能直接寻址,只能寄存器间接寻址,相对寻址 当前PC值加上指令中规定的偏移量 rel,构成实际的操作数地址 例: SJMP rel 操作:跳转到的目的地址 = 当前16位PC值 + rel,注意: 1)“当前PC值”指程序中下一条指令所在的首地址, 是一个16位数; 2)符号“rel”表示“偏移量”,是一个带符号的单字 节数,范围是:-128+127(80H7FH),在实际编程中,“rel” 通常用标号代替,变址寻址 也称为: 基址寄存器+变址寄存器间接寻址,以16位的地址指针寄存器DPTR或 16位的PC寄存器为基址寄存器,以累加器 A 为变址寄存器,两者中的“内容”形成一个16位的“地址”,该“地址”所指的存储单元中的内容才是操作数。,例:设:A中已存有#A4H,DPTR中已存有#1234H MOVC A,A+DPTR;(A)(A)+(DPTR) 操作:将A4H+1234H=12D8H单元中的数放进累加器A,位寻址 指令中直接给出了操作数所在的位地址。 例: CLR P1.0 ;(P1.0) 0 SETB ACC.7 ;(ACC.7) 1 CPL C ;( C ) NOT( C ),注意: 1)位地址里的数据只可能是一个 0 或 1 2)有的位地址十分明确,如 P1.0, ACC.7等, 有的位地址则“不太明确”,如: MOV A,17H ; (A)(17H),17H是字节地址 MOV ACC.0,17H ;(ACC.0)(17H),这里ACC.0 是位地址所以该指令中的17H是22H单元的第7位,片内RAM中有128个位可按位寻址的位,位地址:00H7FH分布在:20H2FH单元; 另外,在SFR中还有92个位可按位寻址,00H,20H,2FH,7FH,1FH,30H,80H,FFH,52子系列才有 的RAM区,普通RAM区,位寻址区,工作寄存器区,27H,22H,21H,20H,26H,24H,25H,23H,28H,07 06 05 04 03 02 01 00,0F 0E 0D 0C 0B 0A 09 08,17 16 15 14 13 12 11 10,1F 1E 1D 1C 1B 1A 19 18,27 26 25 24 23 22 21 20,2F 2E 2D 2C 2B 2A 29 28,37 36 35 34 33 32 31 30,3F 3E 3D 3C 3B 3A 39 38,47 46 45 44 43 42 41 40,2FH,7F 7E 7D 7C 7B 7A 79 78,位地址,总共128个可按位寻址的位,单元地址,17,D7 D6 D5 D4 D3 D2 D1 D0,MCS-51指令集,功能分五类,共111条指令,MCS-51指令集(五大类功能),数据传送类指令: (29条) 算术运算类指令: (24条) 逻辑运算及移位类指令: (24条) 控制转移类指令: (17条) 位操作(布尔操作)类指令:(17条),内部存储器间传送: (MOV16条) 外部数据存储器与累加器间传送: (MOVX4条) 程序存储器向累加器传送: (MOVC2条) 数据交换:(XCH,XCHD,SWAP5条) 堆栈操作: (PUSH,POP2条),(一)数据传送类指令(5种/29条) P51,Acc 累加器,Direct 直接寻址,Ri 间接寻址,Rn 寄存器,#data 立即数,Rn: R0R7 Ri: R0,R1 #data:8位立即数 #data16:16位立即数 direct:直接地址 rel: 8位带符号偏移量,(一)数据传送类指令(5种/29条),内部存储器间传送指令 (16条): MOV 类指令的操作方向总是后面的 操作数 指向前面的操作数! 例:MOV A,30H (A)(30H),数据传送类指令(续),外部数据存储器与累加器间传送 (4条): MOVX类指令可在累加器与以DPTR或Ri所代表的外部 RAM 之间进行数据传送。,例如: MOVX A, DPTR (A) (DPTR) MOVX A, Ri (A) (Ri) MOVX DPTR, A (DPTR) (A) MOVX Ri, A (Ri) (A),例题参见例5.3和例5.4,程序存储器向累加器传送指令(2条): MOVC A,A+DPTR MOVC A,A+PC 通常称为查表指令,寻址方式属: “基址寄存器 + 变址寄存器间接寻址”,数据传送类指令(续),A+DPTR或A+PC指向程序存储器中的某单元。拟传送给累加器ACC 的数据就是程序中事先写进去的表格数据。这些表格数据往往用伪指令 DB,DW 等定义在程序中。,例题参见例5.5,数据传送类指令(续),数据交换指令(5条): XCH A,direct (字节互换) XCH A,Ri (字节互换) XCH A,Rn (字节互换) (A) (direct)或(Ri),或(Rn),XCHD A,Ri 累加器 Acc的低4位与(Ri)的低4位互换,各自的高4位不变,SWAP A 累加器 Acc的低4位与自身的高4位互换,堆栈操作指令(2条):,PUSH压栈指令,POP 弹栈指令,堆栈区由特殊功能寄存器堆栈指针SP 管理 堆栈区可以安排在 RAM区任意位置,一般不安排在工作寄存器区和可按位寻址的RAM区,而是放在RAM区的靠后的位置 堆栈总是指向栈顶 通常PUSH与POP两条指令成对使用,数据传送类指令(续),例如:设(A)=7BH; (35H)=11H 并且知道(SP)60H PUSH ACC ;(61H) #7BH PUSH 35H ;(62H) (35H) 即:(62H) #11H,POP ACC ;(A) (62H) 即:(A) #11H POP 5AH ;(5AH) (61H) 即:(5AH) #7BH,(二)算术运算类指令(6种/24条) P55,加法运算: (ADD4条) 带进位加法运算: (ADDC4条) 带借位减法运算: (SUBB4条) 加1/减1操作: (INC,DEC9条) 单字节乘/除法运算: (MUL,DIV2条) 十进制调整: (DA A1条),(二)算术运算类指令(续),加法运算: (ADD4条) 带进位加法运算: (ADDC4条) 带借位减法运算: (SUBB4条),所有的加法(ADD)、带进位加法(ADDC)、带借位减法(SUBB)运算都是以 A为一个加数或被减数,最终结果也存进 A 。,加法(ADD)、带进位加法(ADDC) 以及带借位减法(SUBB)运算中,如果产生了进位或借位,将自动对PSW中的Cy标志位置“1” 。,带进位加法(ADDC):(A)(A)+(Cy)+(第二操作数)带借位减法(SUBB):(A)(A)-(Cy)-(第二操作数),例题参见例5.6,(二)算术运算类指令(续),加1/减1操作: (INC,DEC9条) INC, DEC与用加/减法指令做加1/减1 操作不同之处在于INC、DEC不影响标志位.,单字节乘/除运算: (MUL,DIV2条) 两个单字节数的乘/除法运算只在A与B之间进行。 MUL AB: (A)与(B)相乘, 积为16位数, (B)积的高8位; (A)积的低8位 DIV AB: (A)除以(B),结果用2字节表示, (A)商的整数部分;(B)余数,例题参见例5.7和习题5.9和5.10。,(二)算术运算类指令(续) P.58,BCD码是指“用二进制表达的十进制数”。如: 十进制数20可以用二进制数00010100B表示; 也可以用十六进制数14H表示; 还可以用BCD码 00100000B 或 20H 表示。,4个二进制位就可以表示一位BCD码: 00001001 可表示十进制数(BCD数) 09; 8个二进制位就可以表示两位压缩的BCD码:0000000010011001 表示 0099。,十进制调整: (DA A1条) 用于两个BCD码之间的相加,这条指令只能跟在 ADD 或 ADDC 之后,若(A)309或(AC)=1则(A)30(A)306; 若(A)749或(CY)=1则(A)74(A)746;,例:两个十进制数“65”与“58”相加,根据常识,显然其和应当为“123”。,MOV A,#65H ADD A,#58H DA A 结果:(A)= 23H (CY)= 1,指令 “DA A” 完成的操作:,6 5 0110 0101 5 8 0101 1000,+,1,3,18,19,2,6 6 0110 0110,高位调整时要加上低位调整后的进位,若(A)309或(AC)=1则(A)30(A)306; 若(A)749或(CY)=1则(A)74(A)746;,又如:两个十进制数“39”与“58”相加,根据常识,显然其和应当为“97”。,MOV A,#39H ADD A,#58H DA A 结果:(A)= 97H (CY)= 0,3 9 0011 1001 5 8 0101 1000,+,0,7,23,9,6 0110,指令 “DA A” 完成的操作:,(三)逻辑运算及移位类指令(5种/24条) P.58,逻辑与运算: (ANL6条) 逻辑或运算: (ORL6条) 逻辑异或运算: (XRL6条) 累加器清零/取反: (CLR,CPL2条) 累加器移位操作: (RL,RLC,RR,RRC4条),逻辑运算及移位类指令(续) P.59,逻辑与(ANL),逻辑或(ORL),逻辑异或(XRL):,累加器清零/取反操作 (CLR,CPL2条),CLR A 对累加器清零 1 Byte 1 个Tm CPL A 对累加器按位取非 1 Byte 1 个Tm,逻辑运算指令的常见用法,逻辑与ANL用于清0或者保留某些位: 例: ANL A, #0FH; 则(A) = 0AH,( 已知累加器A中已存有数:9AH ),逻辑或ORL用于置1或者保留某些位: 例: ORL A, #0FH; 则(A) = 9FH,逻辑异或XRL用于取反或者保留某些位: 例: XRL A, #0FH; 则(A) = 95H (A) 1001 1010 #0FH 0000 1111 95H 1001 0101,例题参见例5.8和例5.9,逻辑运算及移位类指令(续) P.61,累加器移位操作:(RL,RLC,RR,RRC4条),RL A 左环移,累加器 A,累加器 A,Cy,累加器 A,Cy,累加器 A,RRC A 带进位位右环移,RR A 右环移,RLC A 带进位位左环移,(四)控制转移类指令(4种/17条) P.61,此类指令改变程序的执行顺序改变当前PC值,无条件转移: (LJMP,AJMP,SJMP,JMP4条),条件转移(判断跳转): (JZ,JNZ,CJNE,DJNZ8条),子程序调用及返回: (LCALL,ACALL,RET,RETI4条),空操作: (NOP1条) “耗时”一个机器周期。 do nothing!,控制转移类指令(续) P.62,无条件转移: LJMP,AJMP,SJMP,JMP4条,LJMP addr16 长跳转指令 可在64K范围内跳转,AJMP addr11 绝对跳转指令 可在指令所在的2K范围内跳转,SJMP rel 相对跳转指令 可在当前PC-128与+127范围内跳转,JMP A+DPTR 间接长跳转指令 可在以DPTR为基址 + A为偏移量 之和所指向的64K程序范围内跳转,控制转移类指令(续) P.63,条件转移: JZ,JNZ,CJNE,DJNZ8条,JZ rel JNZ rel 根据Acc的内容是否为0决定是否跳转,DJNZ direct,rel DJNZ Rn, rel 将direct(或Rn)里的内容减 1,结果不等于0就跳转;等于0则不跳转继续往下走。,条件转移(续),CJNE A, #data, rel CJNE A, direct,rel CJNE Ri,#data, rel CJNE Rn, #data, rel 将A(或Ri,或Rn)与#data(或direct)相比较,其值不相等就跳转;相等则不跳转,继续往下走。,控制转移类指令(续) P.65,LCALL addr16 子程序长调用指令 可在64K范围内调用子程序,子程序调用及返回: (LCALL,ACALL,RET,RETI4条),ACALL addr11 子程序绝对调用指令 可在指令所在的2K范围内调用子程序,RET 子程序返回指令 子程序结束并返回调用的下一条指令,RETI 中断服务子程序返回指令 中断结束/返回被打断处的下一条指令,(五)位操作类指令(17条) P.66,位操作类指令 以位为单位进行逻辑运算及操作,可分为4种:,位传送: (MOV2条),位清零/置位: (CLR,SETB4条),位逻辑与/或/非运算:(ANL,ORL,CPL6条),位条件转移: (JC,JNC,JB,JNB,JBC5条),位操作类指令(续) P.67,位传送指令(2条): MOV C, bit (C)(bit) MOV bit, C (bit)(C) 注: bit表示位地址,位清零/置位指令(4条): CLR bit(或C) (bit或 C)“0” SETB bit(或C) (bit或 C)“1”,位逻辑与/或/非指令(6条): ANL C,bit(或/bit) ORL C,bit(或/bit) CPL bit (或 C) 注:“/bit”表示对bit位先取反然后再参加运算,位操作类指令(续) P.67,判位条件转移指令(5条):,JC rel(Cy)=“1”就跳转;否则不跳转,JNC rel(Cy)“1”就跳转;否则不跳转,JB bit,rel (bit)=“1”就跳转;否则不跳转,JNB bit,rel (bit)“1”就跳转;否则不跳转,JBC bit,rel (bit)=“1”就先将其清零 再跳转; 否则,不动此位也不跳转。,例题参见例5.10到例5.13,任务一:控制一盏灯点亮,任务二:红灯周期性地亮/灭,JOB3: CLR P1.1 ; P1.1清“0” ,亮绿灯 REDO: SETB P1.3 ;将P1.3置“1” CHECK:JNB P1.3,CHECK ;检测传感器是否被阻断LOOP: ;有入侵者,报警! AJMP REDO ;再跳回去检测,JOB1: CLR P1.0 ;P1.0清“0”,亮红灯 HERE: AJMP HERE ;原地等待,不做别的事,JOB2: CPL P1.0 ;对P1.0取反:红灯亮/灭 ACALL DELAY ;延时1秒 AJMP JOB2 ;重复,任务三:红外防盗报警,前面的简单测控实例中的程序:,位操作指令,任务一:控制一盏灯点亮,任务二:红灯周期性地亮/灭,JOB3: CLR P1.1 ; P1.1清“0” ,亮绿灯 REDO: SETB P1.3 ;将P1.3置“1” CHECK:JNB P1.3,CHECK ;检测传感器是否被阻断LOOP: ;有入侵者,报警! AJMP REDO ;再跳回去检测,JOB1: CLR P1.0 ;P1.0清“0”,亮红灯 HERE: AJMP HERE ;原地等待,不做别的事,JOB2: CPL P1.0 ;对P1.0取反:红灯亮/灭 ACALL DELAY ;延时1秒 AJMP JOB2 ;重复,任务三:红外防盗报警,跳转指令,前面的简单测控实例中的程序:,小结:MCS-51指令集(五大类功能),数据传送类指令 (29条) 算术运算类指令 (24条) 逻辑运算及移位类指令 (24条) 控制转移类指令 (17条) 位操作(布尔操作)类指令 (17条),小结,内部存储器间传送: (MOV16条) 外部数据存储器RAM与累加器间传送: (MOVX4条) 程序存储器ROM向累加器传送: (MOVC2条) 数据交换:(XCH,XCHD,SWAP5条) 堆栈操作: (PUSH,POP2条),(一)数据传送类指令(5种/29条),小结,(二)算术运算类指令(6种/24条),加法运算 (ADD4条) 带进位加法运算 (ADDC4条) 带借位减法运算 (SUBB4条) 加1/减1操作 (INC,DEC9条) 单字节乘/除法运算(MUL,DIV2条) 十进制调整 (DA A1条),小结,(三)逻辑运算及移位指令(5种/24条),逻辑与运算: (ANL6条) 逻辑或运算: (ORL6条) 逻辑异或运算: (XRL6条) 累加器清零/取反: (CLR,CPL2条) 累加器移位操作:(RL,RLC,RR,RRC4条),小结,(四)控制转移类指令(4种/17条),无条件转移: (LJMP,AJMP,SJMP,JMP4条),条件转移(判断跳转): (JZ,JNZ,CJNE,DJNZ8条),子程序调用及返回: (LCALL,ACALL,RET,RETI4条),空操作: (NOP1条),小结,(五)位操作类指令(4种17条),位传送: (MOV2条),位清零/置位: (CLR,SETB4条),位逻辑与/或/非运算: (ANL,ORL,CPL6条),位条件转移: (JC,JNC,JB,JNB,JBC5条),小结,汇编语言与 简单程序设计,汇编语言程序设计中的数,计算机只能识别二进制数机器指令,它原本是不认识常用的十六进制数和十进制数的。,机器指令/目标代码: 由0/1代码组成的操作码与操作数。,十六进制数:便于读写记忆的二进制数的简写形式。 (09,AF 后缀:H/h),BCD码:用二进制数表达的十进制数。 (09表示为:00001001B 后缀:B/b,H/h),二进制数:由0/1组成、“逢2进1”的数制。 如:01011110B (01 后缀:B/b),汇编语言编程基本规则,汇编语言:用助记符描述的指令的集合。,指令中以 AF 开头的十六进制数前必须添一个 “0”。,二进制数必须带后缀“B”或“b”;十六进制数必须带后缀“H”或“h”;十进制数的后缀是“D”或“d”或无.,标号:操作码 目的操作数,源操作数;注释,汇编程序:汇编语言编写的程序借助编译工具 编译成为目标代码,计算机才能识别。这个编译工具称为汇编程序。,汇编程序的伪指令,汇编程序 软件 工具工具软件: 将程序员用汇编语言编写的程序翻译成机器码,(真)指令:告诉计算机如何操作以及做何种操作,用汇编语言编写的程序在此被称为应用程序,伪指令:告诉汇编程序在翻译应用程序时有何具体约定。伪指令不进行具体的操作,那是真指令的事。 比如:从何处开始,何处结束,某些编程者自己规定的表述代表什么意思,汇编程序的常用伪指令 P68,ORG addr16ASM51程序中一定要写! 规定编译后的机器代码存放的起始位置。,END ASM51程序中一定要写! 表示翻译到此结束,其后的任何内容不予理睬。,符号名称 EQU 表达式 将表达式的值赋予符号名称。程序中凡出现该符号名称就等同于该表达式。,$ “当前PC值”也叫位置计数器 代表正在执行的指令所在位置。,汇编程序的常用伪指令(续),符号名称 BIT 位地址 将位地址的值赋予符号名称。程序中凡出现该符号名称就代表该位地址。,DW 双字节数据或双字节数据组 将双字节数据或

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论