版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第三章第三章 mcs-51系列单片机指令系统系列单片机指令系统 3- 1 概述 指令:使计算机执行某种操作的命令。 33种功能,42种助记符,111条指令。 mcs-51指令系统可分为5大类: 数据传送类指令(共29条) 算术操作类指令(共24条) 逻辑操作类指令(共24条) 控制转移类指令(共17条) 布尔变量(位)操作类指令(共17条) 一、指令系统中常用符号 1、rn : 工作寄存器,r0-r7,n = 0-7; 2、ri : 间址寄存器,r0,r1,i = 0,1 3、direct:直接地址,8位内部数据存储单 元地址。它可以是一个内部数据ram单元 (0127)或特殊功能寄存器地址或
2、地址符号; 4、ri:通过寄存器r1或r0间接寻址的8 位内部数据ram单元(0255),i=0,1。 dptr: 通过16位数据指针间接寻址。 5、#data指令中的8位立即数。 #data16指令中的16位立即数。 6、rel:偏移量,补码形式的8位偏移量, 用于相对转移和所有条件转移指令。偏移 量相对于当前pc计算,在-128+127范围 内取值。 7、bit: 位地址 二、二、 mcs-51单片机的寻址方式单片机的寻址方式 mcs-51单片机共有7种寻址方式: 立即寻址 直接寻址 寄存器寻址 寄存器间接寻址 变址寻址 相对寻址 位寻址 1. 立即寻址 立即寻址就是把操作数直接在指令中给
3、出,即操作 数包含在指令中。立即操作数有8位和16位两种形式, 前面加“”来表示。 例如:mov a, #0ffh ;将立即数ffh传送到累加器a中 mov dptr, #2000h ;将16位立即数2000h传送到数据指针dptr中 mov 40h, # 60h ;将立即数60h传送到40h内部ram单元中 2. 直接寻址 指令中直接给出操作数地址的寻址方式。 例如:mov a,30h ;内部ram中的30h单元中的 数据内容传送到累加器a中 3. 寄存器寻址 以通用寄存器的内容为操作数的寻址方式。通用寄存 器包括:a,b,dptr,r0r7。其中,r0r7必须在 工作寄存器组之中。 例如:
4、inc r0 ;(r0)1r0 需要注意的是,a和b既是通用寄存器,又是具有直 接地址的特殊功能寄存器。 4. 寄存器间接寻址 以寄存器中的内容为地址,该地址中的内容为操作数的寻址方式。能够 用于寄存器间接寻址的寄存器有:r0,r1,dptr,sp。其中,r0,r1必 须在工作寄存器组之中,sp仅用于堆栈操作。 例如: movx a, r1 ;外部数据ram中地址为p2r1的单元内容a movx dptr,a ;a外部数据ram中dptr为地址的单元 寄存器间接寻址的存储器空间包括:内部数据ram和外部数据ram。 内部数据ram共用128字节,用一个字节的r0或r1可寻址整个空间。 外部数据
5、ram最大可达64k字节,仅用r0或r1无法寻址整个空间。在 mcs-51系列单片机指令中,对外部数据ram作间接寻址有两种方法:第一种 由p2口提供高8位外部数据ram地址,由r0或r1提供低8位地址,由此共同 寻址64k空间;第二种是用16位的dptr作寄存器间接寻址。 5. 变址寻址 由程序计数器pc或dptr加上偏移量寄存器a中内容 之和形成操作数地址的寻址方式。变址寻址只能对程序存 储器中的数据作寻址操作。由于程序存储器是只读存储器, 因此变址寻址操作只有读操作而无写操作。 例如: movc a, a+dptr ;a+dptr为地址的存储器单元内容a movc a, a+pc ;a+
6、pc为地址的存储器单元内容a 6. 相对寻址 以当前程序计数器pc的内容为基址,加上指令给出 的一字节补码数形成新的pc值的寻址方式。pc中的当前 值称为基地址,一字节补码数称为偏移量,新的pc值称 为转移目的地址。 例如:jc 80h ;c1跳转 表示进位位c为0,则程序计数器pc中的内容不改变, 即不转移。若进位位c为1,则pc中的当前值为基地址加 上偏移量80h后所得到的结果作为该转移指令的目的地址。 7. 位寻址 对位地址中的内容作位操作的寻址方式。单片机中只 有内部ram和特殊功能寄存器的部分单元有位地址(两者 统一编址,地址空间为00hffh),因此,位寻址只能 对有位地址的这两个
7、空间作寻址操作。 例如 setb 20h ;120h位 mov 32h,c ;进位位c32h位 3-2 数据传送类指令数据传送类指令(共29条) l 以累加器以累加器a为目的操作数类指令(为目的操作数类指令(4条)条) mov a,dir mov a,#data mov a,rn mov a,ri 例:r120h,(20h)55h,指令mov a,r1执行后,a55h。 l 以寄存器以寄存器rn为目的操作数的指令(为目的操作数的指令(3条)条) mov rn,dir mov rn,#data mov rn,a 例:(40h)30h,指令mov r7,40h执行后,r730h。 l 以直接地址为
8、目的操作数的指令(以直接地址为目的操作数的指令(5条)条) mov dir,dir mov dir,#data mov dir,a mov dir,rn mov dir,ri 例:r050h,(50h)10h,指令mov 35h,r0执行后,(35h)10h。 l 以间接地址为目的操作数的指令(以间接地址为目的操作数的指令(3条)条) mov ri,dir mov ri,#data mov ri,a l 查表指令(查表指令(2条)条) movc a,a+dptr movc a,a+pc 例:a20h,dptr2000h,指令movc a,a+dptr执行后,程序存储 器2020h单元中的内容送
9、入a。 l 累加器累加器a与片外数据存储器与片外数据存储器ram传送指令(传送指令(4条)条) movx dptr,a movx a,dptr movx a,,ri movx ri,a 例:dptr2000h,外部ram中(2000h)18h,指令movx a, dptr执行后,a18h。 例:p210h,r150h,a64h,指令movx r1,a执行后,外 部ram中(1050h)64h。 l 堆栈操作类指令(堆栈操作类指令(2条)条) push direct pop direct 例:sp07h,(35h)55h,指令push 35h执行后,55h送入 08h地址单元,sp08h。 l
10、交换指令(交换指令(5条)条) xch a,rn xch a,ri xch a,direct xchd a,ri swap a 例:a80h,r032h,(32h)ffh,指令xchd a,r0执行 后,a8fh,(32h)f0h。 l 16位数据传送指令(位数据传送指令(1条)条) mov dptr,#data16 2.算术操作类指令算术操作类指令(共24条) 算术运算指令共有24条,算术运算主要是执行加、减、乘、除、增量、 减量和十进制调整等指令。 l 加法指令(加法指令(4条条) add a,#data add a,direct add a,rn add a,ri l 带进位加法指令(带
11、进位加法指令(4条)条) addc a,direct addc a,#data addc a,rn addc a,ri l 带借位减法指令(带借位减法指令(4条)条) subb a,direct subb a,#data subb a,rn subb a,ri 例:a38h,r120h,(20h)23h,c1,指令subb a,r1执行后, a14h l 乘法指令(乘法指令(1条),条),影响标志位,c = 0 mul a, b ,乘法结果高8位放b, 低8位放a 例:a50h,ba0h,指令mul a, b执行后,a00h,b 32h l 除法指令(除法指令(1条)条)影响标志位,c = 0
12、, ov = 0 div a, b 除数放a,被除数放b,结果 商放 a。余数放b 例:a28h,b12h,指令div a, b执行后,a02h,b 04h l 加加1指令(指令(5条)条) inc a inc direct inc ri inc rn inc dptr l减减1指令(指令(4条)条) dec a dec direct dec ri dec rn l十进制调整指令(十进制调整指令(1条)条) da a ; da指令只能放在加法指令后应用,把a中按二进制 相加后的结果调整成按bcd数相加的结果 。 这条指令对累加器参与的bcd码加法运算所 获得的8位结果(在累加器中)进行十进制调
13、整,使 累加器中的内容调整为二位bcd码。计算机进行 相应的调整规则是:bcd码相加后,当低4位大 于9或d3位向前有进位时,在低4位上加06h;当 高4位大于9或d7位向前有进位时,在高4位上加 6h。 例例 (a)=58h,(r5)=26h,执行指令: add a,r5 da a 运算过程如图所示。 图 da a指令执行示意图 结果:(a)=84h。 例1:多字节乘法:16位 乘 8位 设16位被乘数放在寄存器r4r3中,8位乘数放r2中,求: (r4)(r3)* (r2),乘积放在r7r6r5中,其中r5 放最低位。 分析:乘法指令只有一条,所以必须把多字节相乘的计算 过程转换成单字节相
14、乘的表达方式。 程序如下: cheng: mov a , r2 mov b , r3 mul ab mov r5 , a mov r6 , b mov a , r2 mov b , r4 mul ab add a , r6 mov r6 , a mov a , b addc a , #00h mov r7 , a ret 作业: 计算 2b46h * 8ah ,将计算结果放在片内 ram 4fh、4eh、4dh单元,4dh放最低 位。 3. 逻辑操作类指令逻辑操作类指令(共24条) 逻辑操作类指令共有24条,主要包括“与”、“或”、“异或”、求反、 清0、左右移位等逻辑操作。 l “与与”操作
15、指令(操作指令(6条)条) anl a,direct anl a,#data anl a,rn anl a,ri anl direct,a anl direct,#data l “或或”操作指令(操作指令(6条)条) orl a,direct orl a,#data orl a,rn orl a,ri orl direct,a orl direct,#data 例:(21h)3ah,a14h,指令orl 21h,a执行后,(21h)3eh。 l “异或异或”操作指令(操作指令(6条)条) xrl a,direct xrl a,#data xrl a,rn xrl a,ri xrl direct
16、,a xrl direct,#data 例:r023h,(23h)32h,a53h,指令xrl a,r0执行后,a61h l 求反指令(求反指令(1条)条) cpl a ;累加器a中的内容按位取反 l 清零指令(清零指令(1条)条) clr a ;0a,累加器a中的内容清零 l 循环移位指令(循环移位指令(4条)条) rl a ;累加器a中的内容左移一位 rr a ;累加器a中的内容右移一位 rlc a ;累加器a中的内容连同进位位c左移一位 rrc a ;累加器a中的内容连同进位位c右移一位 l 例:a16h,指令rr a执行后,a0bh。 4. 控制转移类指令控制转移类指令 (共17条)
17、控制转移类指令共有17条,用于控制程 序的流向,所控制的范围即为程序存储器区间。 程序转移的三种方式:程序转移的三种方式:注意转移的范围注意转移的范围 无条件转移 条件转移 中断 条件转移用到的标志:条件转移用到的标志: 状态标志:psw中的四位; 用户设定标志:所有位地址; 零标志z : 隐含的标志(a)= 0,z=1, 否则 z = 0 l 转移类指令(转移类指令(12条)条) 注意转移的范围注意转移的范围 转移类指令分为无条件转移指令和条件转移指令两组。无条件转 移指令包括绝对转移、长转移、短转移和间接转移;条件转移指令包 括结果为零、结果为非零、减“1”后结果为非零以及两数不相等的转
18、移条件等,它们全部采用相对转移的方式。 无条件转移指令(无条件转移指令(4条)条) 【1】长转移指令】长转移指令 ljmp addr16 长转移指令为64k程序存储器空间的全范围转移指令,转移地址可为 16位地址值中的任一值。 【2】绝对转移指令】绝对转移指令 ajmp addr11 绝对转移指令为2k地址范围内的转移指令,对转移目的地址的要求与 acall指令中对子程序入口地址的要求相同。 【3】短转移指令】短转移指令 sjmp rel ;pc+ 2 + relpc 短转移指令为一页地址范围内的相对转移指令。因为rel为1字节补码 偏移量,且sjmp rel指令为2字节指令,所以转移范围为1
19、26d 129d 【4】间接转移指令(散转指令)】间接转移指令(散转指令) jmp a+dptr 条件转移指令(条件转移指令(8条)条) 【1】累加器为零】累加器为零/非零转移指令非零转移指令 jz rel 若a=0,则pc+ 2 + relpc,程序转移到偏移量所指向的地址 若a0,程序顺序执行 jnz rel 若a0,则pc+ 2 + relpc,程序转移到偏移量所指向的地址 若a=0,程序顺序执行 【2】两数不等转移指令】两数不等转移指令 cjne a,dir,rel 若a(dir),则pc 3 relpc,程序转移; 若a(dir),则程序顺序执行 cjne a,#data,rel 若
20、a#data,则pc 3 relpc,程序转移; 若a#data,则程序顺序执行 cjne rn, #data,rel 若rn#data,则pc3 relpc,程序转移; 若rn#data,则程序顺序执行 cjne ri,#data,rel 若(ri)#data,则pc 3 relpc,程序转移; 若(ri)#data,则程序顺序执行 【3】减】减“1”非零转移指令非零转移指令 djnz rn,rel rn1rn, 若rn0,则pc2relpc,程序转移; 若rn0,则程序顺序执行 djnz direct,rel (dir)1dir,若(dir)0,则pc3relpc,程序转移; 若(dir)
21、0,则程序顺序执行 需要注意的是,djnz rn,rel是2字节指令,而djnz dir,rel 是3 字节指令,所以在满足转移条件后,前者是pc2relpc,而后者是 pc3relpc。 例:说明下面一段程序运行后累加器a中的结果。 mov 23h,0ah clr a loop:add a,23h djnz 23h,loop sjmp $ 解:根据程序可知,运算结果a1098765432155d 37h l 空操作指令(空操作指令(1条)条) nop 例:软件延时程序: 根据指令执行时间实现。 1,单循环 mov r2 , #data self: djnz r2 , self 当晶振为 6
22、m 时 一个机器周期 2 微秒, 上程序延时时间取决于 #data的大小。 2,多重循环: 可以用于长时间延时,例如 15ms 延时可以采用二重循环。 l子程序调用指令(子程序调用指令(4条)条) 绝对调用指令绝对调用指令 acall addr11 绝对调用指令实现在2k地址范围内的子程序调用。本指令实现 的操作将不改变原pc的高5位,仅把11位地址addr11送入pc的低 11位,以此确定子程序的入口地址。由于整个64k程序存储器空间 被分成32个基本2k地址范围(见下页表),编程时,必须保证紧 接acall指令后面的那一条指令的第一字节与被调用子程序的入口 地址在同一2k范围内,否则将不能
23、使用acall指令实现这种调用。 长调用指令长调用指令 lcall addr16 长调用指令为64k程序存储器空间中的全范围子程序调用指令,子程 序的入口地址可在64k地址空间中的任一处。 子程序返回指令子程序返回指令 ret 从被调用子程序返回,与lcall与acall指令配合使用。 中断返回指令中断返回指令 reti 从中断服务程序中返回,除具有ret功能外,还具有恢复中断逻辑的 功能,需注意的是,reti指令不能用ret代替。 使用子程序的优点使用子程序的优点 在一个应用程序设计中,在程序的不同地方往往需要执行同样 的一段程序。这时可以把这段程序单独编制成一个子程序,在原来 程序(主程序
24、或子程序)中需要执行这段程序的地方执行一条调用指 令,转到子程序完成规定的操作以后,又返回到原来的程序(主程序 或子程序)继续执行下去。这样处理的好处是: (1) 避免在几个不同的地方对同样一段程序进行重复编程; (2) 简化了程序的逻辑结构; (3) 缩短了程序长度,从而节省了程序存储单元; (4) 便于调试。 通常把具有一定功能的公用程序段作为子程序,在子程序的末 尾安排一条返回主程序的指令ret。主程序调用子程序以及从子程 序返回主程序的过程如图所示。 图 主程序调用子程序示意图 子程序调用及返回 lcall addr16 ;pc pc+3 sp sp+1 (sp) pc07 sp sp
25、+1 (sp) pc815 pc addr015 acall addr11 ;pc pc+2 sp sp+1 (sp) pc07 sp sp+1 (sp) pc815 pc 010 addr11 pc1115不变 ret ;pc 8 15 (sp) sp sp-1 pc 07 (sp) sp sp-1 reti ;中断返回 2000h: lcall 1000h sp 33h 32h 31h 20h 03h 程序存储器空间中的程序存储器空间中的32个基本个基本2k地址范围地址范围 0000h07ffh5800h5fffhb000hb7ffh 0800h0fffh6000h67ffhb800hbf
26、ffh 1000h17ffh6800h6fffhc000hc7ffh 1800h1fffh7000h77ffhc800hcfffh 2000h27ffh7800h7fffhd000hd7ffh 2800h2fffh8000h87ffhd800hdfffh 3000h37ffh8800h8fffhe000he7ffh 3800h3fffh9000h97ffhe800hefffh 4000h47ffh9800h9fffhf000hf7ffh 4800h4fffha000ha7ffhf800hffffh 5000h57ffha800hafffh 5.布尔变量操作类指令(共布尔变量操作类指令(共17条
27、)条) 布尔变量操作类指令共有布尔变量操作类指令共有17条,其共同特点是对进位条,其共同特点是对进位 位位c和直接位地址和直接位地址bit的操作,包括清零、置位、求反、的操作,包括清零、置位、求反、 逻辑与、逻辑或、位传送以及判断转移指令逻辑与、逻辑或、位传送以及判断转移指令。 l 清位指令(清位指令(2条)条) clr c ;0c clr bit ;0bit l 置位指令(置位指令(2条)条) setb c ;1c setb bit ;1bit l 位求反指令(位求反指令(2条)条) cpl c cpl bit l 位逻辑位逻辑“与与”指令(指令(2条)条) anl c,bit anl c,
28、 bit bit l 位逻辑位逻辑“或或”指令(指令(2条)条) orl c,bit orl c, l 位传送指令(位传送指令(2条)条) mov c,bit ;(bit)c mov bit,c ;cbit l 位控制转移指令(位控制转移指令(5条)条) 位控制转移指令是以位的状态作为实现程序转移的判断条件,介绍如下: jc rel 若c=1,则pc+2+relpc,程序转移; 否则程序顺序执行 jnc rel 若c=0,则pc+2+relpc,程序转移;否则程序顺序执行 jb bit,rel 若(bit)=1,则pc+3+relpc,程序转移;否则程序顺序执行 jnb bit,rel 若(b
29、it)=0,则pc+3+relpc,程序转移;否则程序顺序执行 jbc bit,rel 若(bit)=1,则pc+3+relpc,程序转移,且该位清零;否则程序顺序执行 bit 例:设有一个逻辑表达式: y = ( d + /e ) . ( b + c) . a . /f 试用单片机 i/o 口与指令完成此逻辑功能。 解:将逻辑变量 af 接到单片机 p1口的 p1.0p1.5,p1.6 作为输出 y , 利用位操 作指令完成上述操作。 程序如下: mov c , p1.1 orl c , p1.2 anl c , p1.0 mov 20h , c mov c , p1.3 orl c , /
30、 p1.4 anl c , 20h anl c , /p1.5 mov p1.6 , c 3.3 mcs-51单片机汇编语言程序设计单片机汇编语言程序设计 l汇编语言概述 l顺序程序 l分支程序 l循环程序 l子程序 1. 汇编语言概述汇编语言概述 结构化程序的概念结构化程序的概念 顺序结构顺序结构 顺序结构是按照语句实现的先后次序执行一系列的顺序结构是按照语句实现的先后次序执行一系列的 操作,它没有分支、循环和转移。操作,它没有分支、循环和转移。 分支结构分支结构 分支结构又叫条件选择结构,根据不同情况做出判分支结构又叫条件选择结构,根据不同情况做出判 断和选择,以便执行不同的程序段。分支的
31、意思是在两个断和选择,以便执行不同的程序段。分支的意思是在两个 或多个不同的操作中选择其中的一个。或多个不同的操作中选择其中的一个。 循环结构循环结构 循环结构是重复执行一系列操作,直到某个条件出循环结构是重复执行一系列操作,直到某个条件出 现为止。循环实际上是分支结构的一种扩展,循环是否继现为止。循环实际上是分支结构的一种扩展,循环是否继 续是依靠条件判断语句来完成的。按照条件判断的位置,续是依靠条件判断语句来完成的。按照条件判断的位置, 可以把循环分为可以把循环分为“当型循环当型循环”和和“直到型循环直到型循环”。第一种。第一种 情况是先作条件判断,第二种情况是先执行一次循环,然情况是先作
32、条件判断,第二种情况是先执行一次循环,然 后判断是否继续循环。后判断是否继续循环。 汇编语言程序设计的一般步骤汇编语言程序设计的一般步骤 分析问题,抽象出描述问题的数学模型; 确定解决问题的算法或解题思想; 绘制流程图和结构图; 分配存储空间和工作单元;分配存储空间和工作单元; 编制程序; 程序静态检查,上机调试; 编写相关说明。 汇编语言的语句格式汇编语言的语句格式 mcs-51汇编语言的语句格式应符合下列结构: 【标号:】 操作码 【操作数】【;注释】 汇编语言语句由标号、操作码、操作数和注释4部分组成。其中,标号和注释部分可 以没有,甚至某些指令的操作数也可以没有,如nop、ret指令等
33、。 标号位于语句的开始,由以字母开头的字母和数字组成,它代表该语句的地址。标 号与操作码之间要用“:”隔开,标号与“:”之间不能有空格,“:”与操作码之 间可以有空格。 操作码是指令的助记符。 操作数在操作码之后,二者用空格分开。操作数可以是数据,也可以是地址。有多 个操作数时,操作数之间用逗号分开。 注释在语句的最后,以“;”开始,是说明性的文字,与语句的具体功能无关。 指令中的数据可以是十进制、十六进制、二进制、八进制数和字符串,具体格式 如下: 十进制数以d结尾,也可以省略,如55d或55; 十六进制数以h结尾,如55h。如果数据以af开头,其前必须加数字0,如0ffh; 二进制数以b结
34、尾,如00110011b; 八进制数以o或q结尾,如55o或55q; 字符串用或”表示,如m表示字符m的ascii码。 例:main: mov a,00h ;将a清零 在这条指令中,main为标号,表示该指令的地址;mov为操作码,表示指令的 功能为数据传送;a和00h为操作数;将a清零为注释,用于说明这条语句的功能, 注释内容不参与程序的汇编。 伪指令伪指令 org:汇编程序起始地址:汇编程序起始地址 org用来说明其后程序段在存储器中存放的起始地址。 例: org 0030h main:mov 20h,0ffh mov 30h,0feh org 0030h表明从main开始的程序从存储器的
35、0030h地址单元开始存 放,并且main0030h。 equ:赋值指令:赋值指令 equ用来给变量标号赋予一个确定的数值。 例:data equ 0ah main equ 1000h 这段程序使data0ah,main1000h。 db:定义数据字节:定义数据字节 db指令按字节数的形式把数据存放在存储单元中。 例:tab: db 0c0h,0f9h,0a4h,0b0h,99h 92h,82h,0f8h,80h,90h 这段程序从表头tab起,连续存放了十个字节的数值:0c0h,0f9h, 0a4h,0b0h,99h,92h,82h,0f8h,80h,90h。 dw:定义数据字:定义数据字
36、dw指令按字(双字节)的形式把数据存放在存储单元中。 例:org 1020h dw 30h,31h,1020h 这段程序把数据30h,31h,1020h以字(双字节)的形式存放在从1020h开始 的一片存储单元中。 ds:定义存储区:定义存储区 ds从指定的地址单元开始,保留一定数量的存储单元。 例:org 0100h ds 5 从0100h地址开始,空出5个字节的存储单元来,为程序所用。 bit:位定义:位定义 其功能是把位地址赋给字符名称。 例:led bit p1.0 是将位地址p1.0赋给变量led。 end:汇编结束:汇编结束 end命令表明汇编语言程序结束。 采用采用bit伪指令的
37、优点伪指令的优点: 汇编程序中可能有多处用到汇编程序中可能有多处用到“mov c,50h”,可能会出,可能会出 现个别现个别50h误写成误写成30h的情况,采用的情况,采用bit伪指令可以有效伪指令可以有效 避免这类低级错误;还有,当我们想把发光二极管闪烁缓避免这类低级错误;还有,当我们想把发光二极管闪烁缓 冲位冲位50h位地址改为位地址改为51h位地址时,只要修改伪指令位地址时,只要修改伪指令 “outshan bit 50h”为为“outshan bit 51h”一处一处 即可,不必将程序中的多处即可,不必将程序中的多处“mov c,50h”都一一改为都一一改为 “mov c,51h”,可
38、以大大节省编程时间。,可以大大节省编程时间。 例例 分析下列程序。分析下列程序。 org 2000h ds 08h db 30h,8ah, 10,b dw 54h,1f80h 00h 54h (2000h)=_h (2008h)=_h (200ah)=_h (200bh)=_h (200ch)=_h (200dh)=_h (200eh)= 1fh (200fh)= 80h 不定不定 30h 0ah42h 汇编语言源程序的编辑与汇编汇编语言源程序的编辑与汇编 (1) 源程序的编辑源程序的编辑 mcs-51系列单片机汇编语言源程序的编辑可以使用任何文本编辑系列单片机汇编语言源程序的编辑可以使用任何
39、文本编辑 器,如微软器,如微软windows操作系统提供的操作系统提供的“记事本记事本”、“写字板写字板”,微软,微软 office软件中的软件中的“word”软件等。也可使用其他公司的文本编辑软件,如软件等。也可使用其他公司的文本编辑软件,如 ultraedit就是一款专业的程序编辑软件,不仅可以编辑文本文件,而且就是一款专业的程序编辑软件,不仅可以编辑文本文件,而且 可以编辑二进制文件,为广大程序员所喜爱。仿真调试软件一般也会附可以编辑二进制文件,为广大程序员所喜爱。仿真调试软件一般也会附 带有编辑功能,例如南京伟福公司的仿真调试软件就具有编辑录入源程带有编辑功能,例如南京伟福公司的仿真调
40、试软件就具有编辑录入源程 序的功能。序的功能。 对于汇编语言源程序的录入,不论采用何种编辑录入软件,都要将文件保存对于汇编语言源程序的录入,不论采用何种编辑录入软件,都要将文件保存 为文本格式;为文本格式;而且文本文件的后缀名必须是而且文本文件的后缀名必须是asm或或asm(大小写均可大小写均可)。 文件名文件名“*.asm”的的“*”对于不同公司的汇编软件可能有限制,如有的不允许对于不同公司的汇编软件可能有限制,如有的不允许 超过超过8个字符,有的不允许用汉字命名。个字符,有的不允许用汉字命名。 (2) 源程序的人工汇编源程序的人工汇编 所谓人工汇编就是将汇编语言源程序逐条查表,所谓人工汇编
41、就是将汇编语言源程序逐条查表, 人工翻译成机器码、人工计算出偏移量、人工确定出人工翻译成机器码、人工计算出偏移量、人工确定出 目标地址的过程,也称为手工汇编。这里所说的目标地址的过程,也称为手工汇编。这里所说的“查查 表表”是指查阅附录的是指查阅附录的mcs-51指令表。指令表。 【例【例4】 将以下汇编语言源程序手工翻译 成机器码。 org 0000h ljmp start org 0100h start: mov sp,#60h loop: mov a,#10h mov b,#0a0h ljmp loop end 手工汇编对应的机器码如表4-4所示。 人工汇编的过程如下: (1) 在源程序
42、的左边留有足够的空白,一 列填写机器码,另一列填写程序存储器地址。 (2) 逐条查阅指令表,获得操作码。 (3) 将操作码和操作数写在“机器码”列, 部分操作数当时不能确定的先空着。 (4) 填写程序存储器地址。 (5) 人工计算出偏移量;人工确定出目标 地址。 (6) 填写第(3)条当时空着的操作数。 目前单片机开发过程中很少使用人工汇编, 一般由计算机完成汇编。 (3) 源程序的自动汇编源程序的自动汇编 所谓自动汇编就是将汇编语言源程序由计算所谓自动汇编就是将汇编语言源程序由计算 机翻译成机器码的过程。机翻译成机器码的过程。自动汇编过程分为两个自动汇编过程分为两个 步骤:步骤:首先是首先是
43、汇编预处理过程汇编预处理过程,该过程是识别伪,该过程是识别伪 指令,将其转化为不含伪指令的纯指令汇编程序;指令,将其转化为不含伪指令的纯指令汇编程序; 然后将纯指令汇编程序,然后将纯指令汇编程序,逐条查表将其翻译逐条查表将其翻译成机成机 器码。这些分步骤都是器码。这些分步骤都是计算机完成计算机完成的,不需要人的,不需要人 工干预,所以称为自动汇编,也称为计算机汇编。工干预,所以称为自动汇编,也称为计算机汇编。 在仿真器厂家提供的仿真软件中就具有汇编在仿真器厂家提供的仿真软件中就具有汇编 功能,我们只需点击菜单或工具栏的图标即可自功能,我们只需点击菜单或工具栏的图标即可自 动完成汇编动完成汇编(
44、翻译成机器码翻译成机器码)工作。工作。 循环结构的程序举例循环结构的程序举例 例例 有一组数据,存放在有一组数据,存放在3030h h为首地址的内存单元,为首地址的内存单元, 数据长度为数据长度为3232个。试将每一个数分别取出加个。试将每一个数分别取出加1 1,再存人,再存人 以以4040h h为首地址的内存单元为首地址的内存单元。 pcpc值值 机器码机器码指令代码指令代码 org 0000horg 0000h 0000 0201000000 020100 ljmpljmp0100h0100h 0100 0100 orgorg0100h0100h 0100 784f0100 784fmov
45、movr0,#4fhr0,#4fh 0102 795f0102 795fmovmovr1,#5fhr1,#5fh 0104 7f200104 7f20movmovr7,#20hr7,#20h 0106 e60106 e6loop:loop:movmova,r0a,r0 0107 040107 04incinca a 0108 f70108 f7movmovr1,ar1,a 0109 180109 18decdecr0r0 010a 19010a 19decdecr1r1 010b dff9010b dff9djnzdjnzr7,loopr7,loop 010d 80fe010d 80fesjm
46、psjmp$ $ endend 2. 顺序程序顺序程序 顺序程序是指程序中没有使用转移类指令的程序段,机器执行这类 程序时也只需按照先后顺序依次执行,中间不会有任何分支、循环,也不 需要调用子程序。 例:将一个单字节十六进制数转换成bcd码。 解:算法分析:算法分析:单字节十六进制数在0255之间,将其除以100后, 商为百位数;余数除以10,商为十位数,余数为个位数。 设单字节数存放在40h,转换后,百位数存放在r0中,十位数存放在 r1中,个位数存放在r2中,具体程序如下: org 0030h mov a, 40h ;将单字节十六进制数送入a中 mov b,#64h ;将100送入b中 d
47、iv ab mov r0,a ;百位数送r0,余数在b中 xch a,b ;余数送入a中 mov b,#0ah div ab ;商为十位数,余数为个位数 mov r1,a mov r2,b sjmp $ 例:设变量放在片内ram 20h单元,其取值范围为00h,01h, 02h,03h,04h,05h,要求编制一段查表程序,查出变量的平方值, 并放入片内ram 21h单元。 解:在程序存储器的一片指定的地址单元中,建立各个变量的平 方值表,用数据指针指向表的首地址,则变量与数据指针之和的地址 单元中的内容就是变量的平方值,程序如下; org 0030h main:mov dptr,#0500h
48、 ;将表的首地址送给数据指针 mov a,20h ;将变量送入a中 movc a,dptr+a ;查表得到变量的平方值 mov 21h,a ;将平方值送到指定的地址单元 sjmp $ tab equ 0500h ;给表赋首地址 tab:db 00h,01h,04h,09h,10h,19h ;建立平方值表 end 3. 分支程序分支程序 例:将一位十六进制数转换为ascii码。设十六进制数在a中(a的高4位 为0),转换结果仍存放在a中。 解:十六进制数转换为ascii码的原则是:十六进制的09,加30h即转 换为ascii码;0ah0fh要加37h才能转换为ascii码,具体程序如下: org
49、 0030h cjne a,#0ah,no10 ;判断十六进制数是否为10 no10:jc lt10 ;c=1,即十六进制数小于10则转移 add a,#07h ;十六进制数大于或等于10,则先加07h sjmp $ lt10:add a,#30h sjmp $ ;相当于踏步指令相当于踏步指令 散转程序散转程序 散转程序实际是一种并行分支程序,可根据某个输入散转程序实际是一种并行分支程序,可根据某个输入 值或运算结果,转到不同的分支处理。值或运算结果,转到不同的分支处理。 例例 设程序中有四个功能子程序入口,分别为设程序中有四个功能子程序入口,分别为 1000h、1200h、1400h、160
50、0h。要求根据运行后。要求根据运行后 21h的数值的数值0 0、1、2、3转相应转相应子程序。子程序。 anychen: mov dptranychen: mov dptr,#table#table; ;取取入口地址表头入口地址表头 mov a, 21hmov a, 21h; ;取取输入值输入值 rl arl a add a, 21h add a, 21h; ;输入值乘输入值乘3 3 jmpajmpa,a+dptra+dptr table: ljmp 1000h table: ljmp 1000h ljmp 1200h ljmp 1200h ljmp 1400h ljmp 1400h ljmp
51、 1600h ljmp 1600h 4. 循环程序循环程序 例:将内部数据例:将内部数据ram中中20h3fh单元的内容传送到外单元的内容传送到外 部数据存储器,起始单元地址为部数据存储器,起始单元地址为2000h。 解:解:20h3fh共计共计32个单元,需传送个单元,需传送32次数据。将次数据。将r1 作为循环计数器,程序流程图如图作为循环计数器,程序流程图如图3.2所示。具体程序如下:所示。具体程序如下: 所谓循环程序是指单片机反复执行某一段程序,这个所谓循环程序是指单片机反复执行某一段程序,这个 程序段通常称为循环体。循环是在一定条件控制下进行的,程序段通常称为循环体。循环是在一定条件
52、控制下进行的, 以决定是继续循环执行或是结束循环。程序循环是通过条以决定是继续循环执行或是结束循环。程序循环是通过条 件转移指令进行控制的。件转移指令进行控制的。 main:mov r0,#20h ;将数据首地址赋给r0 mov dptr,#2000h ;设置外部ram首地址 mov r1,#20h ;设置循环计数器 loop:mov a,r0 ;取内部ram数据 movx dptr,a ;将数据送往外部ram inc r0 ;调整内部数据ram ;指针,指向下一个数据 inc dptr ;调整外部ram指针 djnz r1,loop sjmp $ 例:把片内数据例:把片内数据ram 30h3
53、9h单元中的单元中的10个无符号数个无符号数 逐一比较,按从小到大的顺序依次排列在这片单元中。逐一比较,按从小到大的顺序依次排列在这片单元中。 解:为了把解:为了把10个单元中的数按从小到大的顺序排列,个单元中的数按从小到大的顺序排列, 可以从可以从30h单元开始,取前数与后数比较,如果前数小于后单元开始,取前数与后数比较,如果前数小于后 数,则顺序继续比较下去;如果前数大于后数,则前数和后数,则顺序继续比较下去;如果前数大于后数,则前数和后 数交换后再继续比较下去。第一次循环将在最后单元中得到数交换后再继续比较下去。第一次循环将在最后单元中得到 最大的数,要得到所有数据从小到大的排列需要进行
54、多重循最大的数,要得到所有数据从小到大的排列需要进行多重循 环。程序流程图如图环。程序流程图如图3.3所示。具体程序如下:所示。具体程序如下: main:clr 00h ;清除交换标志位 mov r7,#0ah mov r0,#30h ;数据区首地址 mov a,r0 loop:inc r0 mov r2,a ;保存前数 subb a,r0 mov a,r2 ;恢复前数 jc next ;判断前后两数大小 setb 00h xch a,r0 ;前后两数交换 dec r0 xch a,r0 inc r0 next:mov a,r0 ;取下一个数 djnz r7,loop jb 00h,main ;交换后重新比较 sjmp $ 5.子程序子程序 在调用子程序时,要注意以下几个问题: 子程序占用的存储单元和寄存器。如果在调用子程序之 前,主程序已经使用了这些存储单元或寄存器,在调用后,这 些存储单元或寄存器又被子程序使用,就应当先把这些存储单 元或寄存器中的内容压入堆栈保护起来,调用完后再从堆栈中 弹出,加以恢复。 入口参数和出口参数。调用之前要按照子程序的要求设 置好入口参数,只有这样才能在调用后,从出口参数处得到调 用后的正确结果。 参数的传递。子程序可以从指定的地址单元或寄存器获 得调用程序的数据参数,经过调用后得到的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026国网福建省高校毕业生提前批招聘(约450人)笔试模拟试题浓缩500题及答案详解(夺冠)
- 2026国网福建省高校毕业生提前批招聘(约450人)笔试模拟试题浓缩500题及答案详解(名师系列)
- 2025国网湖南省高校毕业生提前批招聘(约450人)笔试模拟试题浓缩500题附答案详解(精练)
- 2026国家管网集团甘肃公司秋季高校毕业生招聘25人笔试参考题库(浓缩500题)带答案详解(完整版)
- 2026国网吉林省电力公司高校毕业生提前批招聘笔试模拟试题浓缩500题(含答案详解)
- 2026秋季国家管网集团福建公司高校毕业生招聘笔试备考试题(浓缩500题)附参考答案详解(基础题)
- 2026国网青海省电力公司高校毕业生提前批招聘(约450人)笔试备考题库浓缩500题及一套答案详解
- 2026秋季国家管网集团云南公司高校毕业生招聘笔试参考题库(浓缩500题)附答案详解(综合题)
- 2026国网甘肃省电力公司高校毕业生提前批招聘笔试模拟试题浓缩500题含答案详解(夺分金卷)
- 2026国网湖南省电力公司高校毕业生提前批招聘(约450人)笔试备考题库浓缩500题及答案详解1套
- 管道安装-焊接技术交底
- 数学教学软件与应用-几何画板能做什么
- 危险化学品建设项目安全条件审查要点
- 北京2023年中国工商银行博士后科研工作站博士后研究人员招聘上岸提分题库3套【500题带答案含详解】
- AED的使用(教学讲解课件)
- 血液科出科题库
- 社会研究方法03350
- 贝克-常伟汽车后视镜电加热薄膜技术
- 大学生素质教育主题班会课件
- 体育器材台账
- 2021年吉县社区工作者招聘笔试题及答案解析
评论
0/150
提交评论