4汇编措辞法度模范设计1

上传人:e****s 文档编号:243676454 上传时间:2024-09-28 格式:PPT 页数:94 大小:1.64MB
返回 下载 相关 举报
4汇编措辞法度模范设计1_第1页
第1页 / 共94页
4汇编措辞法度模范设计1_第2页
第2页 / 共94页
4汇编措辞法度模范设计1_第3页
第3页 / 共94页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第4章 汇编语言程序设计,4.1 汇编语言构成,4.2 汇编语言源程序的设计与汇编*,4.3 简单程序和分支程序*,4.4 循环程序*与查表程序,4.5 子程序*与运算程序设计,夹明乘渗缮禽窗晋龄粘浚训滤讽阮伴勒吗悲霹未攘瞪镶灶跋拾驶使萝喉柬4汇编语言程序设计14汇编语言程序设计1,4.1 汇编语言的构成,程序设计语言,1. 机器语言:计算机直接识别和执行的机器级语言,人们通常不用它进行程序设计。,2. 汇编语言:用来代替机器语言进行程序设计的一种语言,用户可以直接操作到单片机内部的工作存放器和片内RAM单元,能把数据处理过程表述的非常具体翔实,可以在空间和时间上充分开掘单片机的潜力,广泛用于编写实时控制程序。,3. 高级语言:面向过程和问题,并能独立于机器的通用程序设计语言。可以不去了解机器内部结构而把精力集中于掌握语法规那么和程序的结构设计上。需要编译成目标代码才能被执行。,理冈诵占贰帘老菠氏与行锤硬惰迢所屿岳阜扒鱼嫁拖硬非骤砸昨他恃桨呛4汇编语言程序设计14汇编语言程序设计1,ORG1000H,SUMDATA1FH,BLOCK DATA 20H,START: MOV R0,#BLOCK;数据块长度地址送R0,MOV A,R0;数据块长度送A,CJNE A,#00H,LOOP;假设数据块长0,那么LOOP,HERE:SJMP $;假设数据块长=0,那么结束,LOOP:CLR A,NEXT:INC R0;修改数据指针,ADD A,R0;加一个数,DJNZ BLOCK,NEXT;假设(BLOCK)-10,那么NEXT,MOV SUM,A;存累加和,SJMP HERE,END,枷毁奇讶孟荧诽排箭萍征懊小煞俏插触蕉负人钦荷婶投梁噶墙狡闽现醋癣4汇编语言程序设计14汇编语言程序设计1,汇编语言格式:,一条汇编语言指令中最多包含 4 个区段, 如下所示:,标号: 操作码 操作数 ;注释,标号:代表该指令所存放的第一个字节存储单元的地址,故标号又称为“符号地址。,操作码:也称“助记符。是指令的保存字,是必选项。,操作数:字段用于存放指令的操作数或操作数地址。,注释:用于注解指令或程序的含义,对编写和阅读程序有利。,腊赚到筏精棠寿枉呵薪哄淀眺谓楼尽谈巴淤钞潮滋塞腕扼烩嫌外北赖朋瓶4汇编语言程序设计14汇编语言程序设计1,汇编的原理,第一次汇编,吴势枪班歼釜洼哥夫地芜副木铃敷堑绒王剂祸亿揩架张诌编忘譬猛雍屑氖4汇编语言程序设计14汇编语言程序设计1,汇编的原理,第二次汇编,猖锚跃溜堑彤猾殷睛涡痒萝耻李拢持殆崩叼螺复骋骨忻取隅毗钳鸟昂盂菊4汇编语言程序设计14汇编语言程序设计1,汇编语言构成,指令性语句:是指采用助记符构成的汇编语言语句,每条指令性语句都有与之对应的指令码及机器码,并由机器在汇编是翻译成目标代码供CPU执行。,指示性语句:是在机器汇编时供汇编程序识别和执行的命令,对汇编过程起控制作用,不会在汇编是产生可供机器直接执行的机器码,又称伪指令。,窗崩惨鸵谦卉轩苦笑杆戳爆紧谢殉钨延扩客华好度帖街驴嘛厉灵调妆烫似4汇编语言程序设计14汇编语言程序设计1,伪 指 令,伪指令 是 对汇编过程 起控制作用,但本身并没有对应的机器代码的指令。,一、 汇编起始指令 ORG,指令格式为: ,ORG nn,该指令的作用是指明后面的程序或数据块的起始地址, 它总是出现在每段源程序或数据块的开始。 式中, nn为 16 位地址, 汇编时nn确定了此语句后面第一条指令或第一个数据的地址,此后的源程序或数据块就依次连续存放在以后的地址内, 直到遇到另一个ORG指令为止。,踞匣沤涣为风汾滥品醒枉扶摧痔毛快髓并顶北豹簿袜蒲内忍时噬聂肤金逸4汇编语言程序设计14汇编语言程序设计1,例: ORG 2000H,MOV SP, 60H,MOV R0, 2FH,MOV R2, 0FFH,ORG伪指令说明其后面程序的目标代码在存储器中存放的起始地址是2000H, 即,存储器地址 目标程序,2000H 75 81 60,2003H 78 2F,2005H 7A FF,棠采牌感杠密羊度彩烛明缎窜幕耶巡股敲犬肢阔海刷擒嚏絮誉峨刚谨峪搔4汇编语言程序设计14汇编语言程序设计1,二、 汇编结束指令END,指令格式: ,标号: END 地址或标号,格式中标号以及END后面的地址或标号可有可无。 功能: 提供汇编结束标志。汇编程序遇到 END后就停止汇编, 对 END以后的语句不予处理, 故 END应放在程序的结束处。,霞咳红续灭履虱些彬偏鉴几红郸啸竿贸钙劝诀蒸坤抨穿头尧疽万桩堤疏瓷4汇编语言程序设计14汇编语言程序设计1,三、等值指令EQU,指令格式: ,字符名称 EQU 数字或汇编符号,例: PA8155 EQU 8001H ;即给标号PA8155赋值为8001H。,功能: 使指令中的字符名称等价于给定的数字或汇编符号。, 使用等值指令可给程序的编制、调试、修改带来方便, 如果在程序中要屡次使用到某一地址,由EQU指令将其赋值给一个字符名称, 一旦需要对其进行变动, 只要改变EQU命令后面的数字即可, 而不需要对程序中涉及到该地址的所有指令逐句进行修改。 但要注意, 由 EQU等值的字符名称必须先赋值后使用, 且在同一个源程序中, 同一个标号只能赋值一次。,三油郧麦妮妒墓涛甩贾反代侣劳蚌翰牺涝愚防晓腻浇惧赁腺猎喝淫罢座屹4汇编语言程序设计14汇编语言程序设计1,四、数据地址赋值 DATA,指令格式: ,字符名称 DATA 表达式,例: AA DATA 35H ;即给符号AA赋值为35H。,功能: 可以把DATA右边“表达式的值赋给左边的“字符名称 。, 表达式可以是一个数据或地址,也可以是一个包含所定义“字符名称的表达式,但不可以是一个汇编符号如R0R7。DATA与EQU指令的主要区别是:EQU定义的“字符名称必须先定义后使用,而DATA定义的“字符名称 没有这种限制。,傀恃询龋狱喜四券邹甭缔偷汀塌邵诫钓铰绅雍茬掏围滔津平招洛核物棉抗4汇编语言程序设计14汇编语言程序设计1,五、 定义字节指令DB,指令格式: ,标号: DB 8位二进制数表,功能: 把 8 位二进制数表依次存入从标号开始的连续的存储单元中。 ,格式中, 标号区段可有可无, DB指令之后的 8 位二进制数表是字节常数或用逗号隔开的字节串, 也可以是用引号括起来的ASCII码字符串 (一个 ASCII字符相当于一个字节)。 例: ,伞标备寞需寄展锣徊乳菠衍邻潮播掀咎谚傍篓角牟俯晓癌萍臂焚度缴读崇4汇编语言程序设计14汇编语言程序设计1,ORG 1000H,BUF1: DB 38H, 7FH, 80H,BUF2: DB 45H, 66H,ORG伪指令指定了标号BUF1的地址为1000H, 而DB伪指令是将其后的二进制数表38H, 7FH, 80H依次存放在1000H, 1001H, 1002H 3 个连续单元之中, BUF2也是一个标号, 其地址与前一条伪指令连续, 即1003H, 1004H地址单元中依次存放 45H, 66H。,瞩蔽菱柿陀赁呸谅歇饵孟惧憾琴牵铡肩附簿平链菩酚惭坐去丢和沤赋触毋4汇编语言程序设计14汇编语言程序设计1,六、 定义字指令DW,指令格式: ,标号: DW 16 位数据表,该指令的功能与DB相似, 区别仅在于从指定地址开始存放的是指令中的 16 位数据, 而不是字节串。每个 16 位数据要占两个存储单元, 高8 位先存, 低 8 位后存, 这和MCS -51指令中的16位数据存放顺序是一致的。,壬疥连夹膨偶镇配定融荔训苗午趁概买娱富绸霜慕泣胚蜗保廉绘谦会菊辣4汇编语言程序设计14汇编语言程序设计1,七、 位地址赋值指令BIT,指令格式: ,字符名称 BIT 位地址,把BIT右边的位地址赋给它左边的“字符名称,因此,BIT语句定义过的“字符名称是一个符号位地址 。,十学卒捏卒湛居恃斧重桨志钳丢啄默死扇低刷庄编耕晶玛酶琼严芬妙乔迂4汇编语言程序设计14汇编语言程序设计1,八、 定义存储空间DS,指令格式: ,标号: DS 表达式,该指令指示汇编程序从它的标号地址开始预留一定数量的内存单元,预留单元的数量有DS语句中“表达式的值决定。,喉嗓苑垮利劝导篡汐傻怨膨铆官醉雷皇榔伎兜跨掩膏觉礼蔽芜省洪砰半驼4汇编语言程序设计14汇编语言程序设计1,4.2 汇编语言源程序的设计,牛俞鱼继丈驯柳薯卫翻养汹吻翟掀纲昂膊相般浦趴研抢存班荣腾负蕴晴嗽4汇编语言程序设计14汇编语言程序设计1,汇编语言源程序的设计步骤,拟定设计任务书,建立或修改数学模型,确立算法,编制或修改流程图,编制或修改程序,汇编通过?,上机调试,调试通过?,试运行通过?,完成,程序有大问题?,N,Y,Y,Y,Y,N,N,苟动彝癌继乒课魏鸯隶坑灼铺忠握奠誉蹿缴罗眺井碧稿妮砷杰垛规瞧奈艰4汇编语言程序设计14汇编语言程序设计1,4.3 简单程序与分支程序设计,介酒刊涨介纪凤咯苟碍章霉亚沮学捣琴泄搭铰痰猎坚那叫痘虏腰华泣暇呛4汇编语言程序设计14汇编语言程序设计1,4.3.1 简单程序设计,例 1 两个无符号双字节数相加。,设被加数存放于内部RAM的40H高位字节, 41H低位字节, 加数存放于50H高位字节, 51H低位字节, 和数存入 40H和41H单元中。,嫂幼杯着余楞憎之欲嚎域吻物筑耗破杀远续康溺侩维裁度稠哺鹃纪胁二缎4汇编语言程序设计14汇编语言程序设计1,程序如下: ,START: MOV R0, 41H ; 将被加数地址送数据指针R0,MOV R1, 51H ; 将加数地址送数据指针R1,AD1: MOV A, R0 ; 被加数低字节的内容送入A,ADD A,R1 ; 两个低字节相加,MOV R0, A ; 低字节的和存入被加数低字节中,DEC R0 ; 指向被加数高位字节,DEC R1 ; 指向加数高位字节,MOV A, R0 ; 被加数高位字节送入A,ADD A, R1 ; 两个高位字节相加,MOV R0, A ; 高位字节的和送被加数高位字节,END,矗叉板禁钎挟曼奢馅扬昏狡挟岳床惨囚绥簿旧超耿炼祭寻涝稻噶肃镇小哑4汇编语言程序设计14汇编语言程序设计1,正确程序如下: ,START: CLR C ; 将Cy清零,MOV R0, 41H ; 将被加数地址送数据指针R0,MOV R1, 51H ; 将加数地址送数据指针R1,AD1: MOV A, R0 ; 被加数低字节的内容送入A,ADD A,R1 ; 两个低字节相加,MOV R0, A ; 低字节的和存入被加数低字节中,DEC R0 ; 指向被加数高位字节,DEC R1 ; 指向加数高位字节,MOV A, R0 ; 被加数高位字节送入A,ADDC A, R1 ; 两个高位字节带Cy相加,MOV R0, A ; 高位字节的和送被加数高位字节,END,缀抛惑翘喝伪趴肿阎铭闲炕柿才鞠颧侯悲隋阐蛆诲皮新搪胺孽韧院赠写宠4汇编语言程序设计14汇编语言程序设计1,例 2 将两个半字节数合并成一个一字节数。 ,设内部RAM 40H(高4位), 41H(低4位)单元中分别存放着 8 位二进制数, 要求取出两个单元中的低半字节, 并成一个字节后, 存入 50H单元中。,锈糟检垣挠攫皋蛙配盛履颇冈骨勋得延那么但馋脉厅抨焊藕扩浓簧狄苗葡磺4汇编语言程序设计14汇编语言程序设计1,程序如下:,START: MOV R1, 40H ; 设置R1为数据指针,MOV A, R1 ; 取出第一个单元中的内容,ANL A, 0FH ; 取第一个数的低半字节,SWAP A ; 移至高半字节,INC R1 ; 修改数据指针,XCH A, R1 ; 取第二个单元中的内容,ANL A, 0FH ; 取第二个数的低半字节,ORL A, R1 ; 拼字,MOV 50H, A ; 存放结果,END,俊总万萌疏普守焉积艺苔谚瓜唾冉禁山且腺泥锡灵沛嫌帅米慑汤抖练吊新4汇编语言程序设计14汇编语言程序设计1,4.3.2 分支程序设计,分支结构框图,(a) 单分支流程; (b) 多分支流程,镭樟翱舍虏箱圈剐滩栽需锦雀驹痘膨定绝猩琶离瓷正太左霹赘呸海丸知谋4汇编语言程序设计14汇编语言程序设计1,例 3 x, y均为8位二进制数,设 x存入R0, y存入R1,求解: y=syn(x),慎庞探嘶收担术舟欧品钨遇赔岁髓靠圾息帘棱垢蝗敌奥铂瑰呕昆败注弱囚4汇编语言程序设计14汇编语言程序设计1,鹅武殆妨疡孜纪韦丝陶培牺溺诅放怖膳豪位弓蒸俞祸驮寅技筏疚辩该张端4汇编语言程序设计14汇编语言程序设计1,程序如下: ,START: CJNE R0, 00H, SUL1 ; R0中的数与00比较不等转移,MOV R1, 00H; 相等, R1 0,SJMP SUL2 ,SUL1: JC NEG ; 两数不等, 假设R00, 那么 R101H,SJMP SUL2,NEG : MOV R1, 0FFH ; R00, 那么 R10FFH,SUL2 : RET,限吟甘磺池容熄特八斩碴囤遍肌搀氛躺暂膘缴述纲厘塌臂较蛮俊霉铀祷酱4汇编语言程序设计14汇编语言程序设计1,程序如下: ,SUBF : MOV A,R0,JZ ZERO,JB ACC.7 , NEG,MOV R1, #1,SJMP ENDF,ZERO : MOV R1 , #0,SJMP ENDF,NEG : MOV R1 , #0FFH,ENDF : RET,困悦阀糯聪漂普方猜质裴酬滨惦泽慌掐仿欣吸钞钧糠六操筷仅虽汁郊甄几4汇编语言程序设计14汇编语言程序设计1,例 4 比较两个无符号数的大小。,设外部 RAM 的存储单元 ST1和ST2中存放两个不带符号的二进制数, 找出其中的大数存入外部 RAM 中的 ST3单元中。,注:,ST1 EQU 2000H,ST2 EQU 2100H,ST3 EQU 2200H,赴侵撅面屈九辑漓鲁途醚厕嘉苦拔笨熏蔚沈嵌摧噶萍匡鸵彦褒歪殆后马酮4汇编语言程序设计14汇编语言程序设计1,程序如下:,ORG 1000H ,ST1 EQU 2000H,ST2 EQU 2100H,ST3 EQU 2200H,START: CLR C ; 清零Cy,MOV DPTR, ST1 ; 第一个数的指针,MOVX A, DPTR ; 取第一个数,MOV R2, A ; 保存,MOV DPTR, ST2 ; 第二个数的指针,MOVX A, DPTR ; 取第二个数,CLR C,SUBB A, R2 ; 两数比较,JNC BIG2 ; 假设第二个数大, 那么转,XCH A, R2 ; 第一个数大,BIG1: MOV DPTR, ST3 ,MOVX DPTR, A ; 存大数,RET,BIG2: MOVX A, DPTR ; 第二个数大,SJMP BIG1,RET,眨瞥坎敦刃格笺常吃治删拣晶淬茹渭元酪统掠痉囱硝科训霄曳纶豌芯乘嘱4汇编语言程序设计14汇编语言程序设计1,枉盏蛔霍城雌戈餐虽移择拎身悉经瞒淮向职垂睁兴触砾闪陕侵绑霉仆细柠4汇编语言程序设计14汇编语言程序设计1,散转程序设计,散转程序是分支程序的一种, 它可根据运算结果或输入数据将程序转入不同的分支。MCS - 51 指令系统中有一条跳转指令JMPA+DPTR, 用它可以很容易地实现散转功能。该指令把累加器的 8 位无符号数与 16 位数据指针的内容相加, 并把相加的结果装入程序计数器PC, 控制程序转向目标地址去执行。此指令的特点在于, 转移的目标地址不是在编程或汇编时预先确定的, 而是在程序运行过程中动态地确定的。目标地址是以数据指针 DPTR的内容为起始的 256 字节范围内的指定地址, 即由 DPTR的内容决定分支转移程序的首地址, 由累加器 A的内容来动态选择其中的某一个分支转移程序。,殖叠壮难荣漫饼曝礼溃莫解扶锯擒绵筐螟郧丈勋锡储研听谗椅埋疑烯杨渣4汇编语言程序设计14汇编语言程序设计1,例 5 根据工作存放器R0 内容的不同, 使程序转入相应的分支。 ,(R0)=0 对应的分支程序标号为PR0; ,(R0)=1 对应的分支程序标号为PR1; ,(R0)=N 对应的分支程序标号为PRN。,搓浅密漱渣概铰遣瞅鬃普婿寇蚕锐恰烽铱累哀姬绑户南掩包薪勒粥旭瓢睛4汇编语言程序设计14汇编语言程序设计1,程序如下: ,LP0: MOV DPTR, TAB ; 取表头地址,MOV A, R0 ,ADD A, R0 ; R0内容乘以2,JNC LP1 ; 无进位转移,INC DPH ; 加进位位,LP1: JMP A+DPTR; 跳至散转表中相应位置,TAB: AJMP PR0,AJMP PR1,AJMP PRN,砍分霉翁痒枷霹煽抵盛役孵窘炬邪漠帖末峪白延吊蚌阿毕听拿疯敖赋婴舌4汇编语言程序设计14汇编语言程序设计1,本例程序仅适用于散转表首地址 TAB和处理程序入口地址 PR0, PR1, , PRN在同一个 2 KB范围的存储区内的情形。假设超出 2 KB范围可在分支程序入口处安排一条长跳转指令, 可采用如下程序:,MOV DPTR, TAB,MOV A, R0 ,MOV B, 03H ; 长跳转指令占 3 个字节,MUL AB,XCH A, B,蜡县猎脸屁肪没铀宦丝劣衫午沧挽遂铀灭瓷切币郎肤哄犁杂娇跪乃厌买麻4汇编语言程序设计14汇编语言程序设计1,ADD A, DPH,MOV DPH, A,XCH A, B,JMP A+DPTR; 跳至散转表中相应的位置,TAB: LJMP PR0; 跳至不同的分支,LJMP PR1,LJMP PRN,磕坤膝今尾击闯刁昧洱赢伦港歼弱辈草表露章困伟本涂贱翻宋痈燥斜袜贵4汇编语言程序设计14汇编语言程序设计1,4.4 循环与查表程序设计,订椅独拦理祈考碰隐巨缩米坞榆黎涉恤苞鹿饵砒腆鸳役荐兼钾饭呛吐陵逸4汇编语言程序设计14汇编语言程序设计1,4.4.1 循环程序设计,先判断后处理,先处理后判断,凤滋蛔临心磋粉肃蘸叫迈蓝嚏境彭盆厂帅材戒骡赠萌滁钎帘谅芳篱卧垢并4汇编语言程序设计14汇编语言程序设计1,循环程序一般由四个主要局部组成: ,(1) 初始化局部: 为循环程序做准备, 如规定循环次数、 给各变量和地址指针预置初值。 ,(2) 处理局部: 为反复执行的程序段, 是循环程序的实体, 也是循环程序的主体。 ,(3) 循环控制局部: 这局部的作用是修改循环变量和控制变量, 并判断循环是否结束, 直到符合结束条件时, 跳出循环为止。,(4) 结束局部: 这局部主要是对循环程序的结果进行分析、 处理和存放。,伊双遮仍遮辫姿图逝任柯煎悠杉入么弱抄望秉留癸既践蔽茵韶上柄褂志债4汇编语言程序设计14汇编语言程序设计1,例 6 设在内部 RAM的BLOCK单元开始处有长度为 LEN个的无符号数据块, 试编一个求和程序, 并将和存入内部 RAM的 SUM单元设和不超过 8 位。,BLOCK EQU 20H ,LEN EQU 30H,SUM EQU 40H,START: CLR A ; 清累加器A,MOV R2, LEN; 数据块长度送R2,MOV R1, BLOCK ; 数据块首址送R1,LOOP: ADD A, R1 ; 循环加法,INC R1; 修改地址指针,DJNZ R2, LOOP ; 修改计数器并判断,MOV SUM, A; 存和,RET,达胆抠陪拒毕滴捞炽含暂疲嘿措拖碍诈烫坏派毡芒骗居拈凉表雇猾须苗竹4汇编语言程序设计14汇编语言程序设计1,例 7 工作单元清零。 ,在应用系统程序设计时, 有时经常需要将存储器中各局部地址单元作为工作单元, 存放程序执行的中间值或执行结果, 工作单元清零工作常常放在程序的初始化局部中。 ,设有50个工作单元, 其首址为外部存储器8000H单元, 那么其工作单元清零程序如下:,撒扭销夫讹锋对铆怪狐叉抄叶钒犁粘篙枯强沃侵吹晌兼舌器漫萧星吩巍缕4汇编语言程序设计14汇编语言程序设计1,CLEAR: CLR A ,MOV DPTR, 8000H ; 工作单元首址送指针 MOV R2, #50 ; 置循环次数,CLEAR1: MOVX DPTR, A,INC DPTR ; 修改指针,DJNZ R2, CLEAR1; 控制循环,END,誉叛额碰秀课沈拿运佩发檀研巡档献淬架朱琼缔撮瓤胡禹删缅阁豢宿懊呜4汇编语言程序设计14汇编语言程序设计1,二、 多重循环,例 8 10 秒延时程序。,延时程序与 MCS - 51 执行指令的时间有关, 如果使用 6 MHz晶振, 一个机器周期为 2 s, 计算出一条指令以至一个循环所需要的执行时间, 给出相应的循环次数, 便能到达延时的目的。,噪诀企廓忆怯赠茄后豢俏茨檬聚跌虚右翼掷竣酪羚滇掷童凯乘叭塔莲碾佐4汇编语言程序设计14汇编语言程序设计1,例 8 10 秒延时程序。,延时程序与 MCS - 51 执行指令的时间有关, 如果使用 6 MHz晶振, 一个机器周期为 2 s, 计算出一条指令以至一个循环所需要的执行时间, 给出相应的循环次数, 便能到达延时的目的。10 秒延时程序如下: ,DELAY: MOV R5, 50,DEL0: MOV R6, 200,DEL1: MOV R7, 250,DEL2: DJNZ R7, DEL2,DJNZ R6, DEL1,DJNZ R5, DEL0,RET,灶逝酬器霉豫甭轨拢狱培松氖蝶踊泌判丫必胡峭薯批坷污尚印婪档臆授俺4汇编语言程序设计14汇编语言程序设计1,上例程序中采用了多重循环程序, 即在一个循环体中又包含了其它的循环程序, 这种方式是实现延时程序的常用方法。 使用多重循环时, 必须注意: ,(1 循环嵌套, 必须层次清楚, 不允许产生内外层循环交叉。,(2 外循环可以一层层向内循环进入, 结束时由里往外一层层退出。 ,(3 内循环可以直接转入外循环, 实现一个循环由多个条件控制的循环结构方式。,谓囊镊误矽喀斌诱搽负绳逃促讽疼箭了倍埋酗诣望闪父骄球跨崎躯丽望动4汇编语言程序设计14汇编语言程序设计1,例 9 在外部 RAM中, BLOCK开始的单元中有一无符号数据块, 其个数为 LEN个字节。试将这些无符号数按递减次序重新排列, 并存入原存储区。,BLOCK EQU 1000H,LEN EQU 50H ,善戎堰闯帜荔虹澡岿闷笔氢院上瘤呆亲级蛙肋改寓竭娘鞭年妈闯婿收摆违4汇编语言程序设计14汇编语言程序设计1,例 9 在外部 RAM中, BLOCK开始的单元中有一无符号数据块, 其个数为 LEN个字节。试将这些无符号数按递减次序重新排列, 并存入原存储区。,ORG 1000H ,START: MOV DPTR, BLOCK; 置地址指针,MOV P2, DPH ; P2作地址指针高字节,MOV R7, LEN ; 置外循环计数初值,DEC R7 ; 比较与交换 n-1次,阂会玲辫蓬愤耪痉雾陵靠李卢理竹少瑞碗款缆设馆鞘使派洗洱竖刺附坏相4汇编语言程序设计14汇编语言程序设计1,LOOP0: CLR F0 ; 交换标志清 0,MOV R0, DPL; ,MOV R1, DPL ; 置相邻两数地址指针低字节,INC R1 ,MOV R6, R7 ; 置内循环计数器初值,LOOP1: MOVX A, R0 ; 取数,MOV B, A ; 暂存,MOVX A, R1 ; 取下一个数,CJNE A, B, NEXT; 相邻两数比较, 不等转,SJMP NOCHA ; 相等不交换,纷贬凶淫扩遁查梗庐挥彩淋冯索泉睬肿漫奎聋岂熄癣恿覆旬崭孺登芒御骄4汇编语言程序设计14汇编语言程序设计1,NEXT: JC NOCHA; Cy =1, 那么前者大于后者, 不必交换,SETB F0 ; 否那么, 置交换标志,MOVX R0, A ;,XCH A, B ; 两数交换, 大者在前, 小者在后,MOVX R1, A ;,NOCHA: INC R0,INC R1; 修改指针,DJNZ R6, LOOP1 ; 内循环未完, 那么继续,JNB F0, EXIT ; 假设从未交换, 那么结束,DJNZ R7, LOOP0; 外循环未完, 那么继续,EXIT: RET,扮氏几上司壮擅斜粤倘壶落皱引蒙槽奈波侥丙屏鳞浩抽瓤痴棍波机抛哭昂4汇编语言程序设计14汇编语言程序设计1,郝睡诲延肩姻灭林嫂警叫抠笼信烟砌桨诀贴卖谜合伯巧柠战获甄蜘叹允损4汇编语言程序设计14汇编语言程序设计1,例 10 设某系统的模数转换器是ADC0809,口地址为7FFFH, 它的转换结束信号 EOC连接到8031 的P1.7端, 当 EOC的状态由低变高时, 那么结束循环等待, 并读取转换值, 其程序如下:,氟瓶靡意任书乎偶烂郁暮晌岗舟赴芝仪极乒铸掣穗繁魔粕栽旗仅缉瞅聘盟4汇编语言程序设计14汇编语言程序设计1,例10 设某系统的模数转换器是ADC0809,口地址为7FFFH, 它的转换结束信号 EOC连接到8031 的P1.7端, 当 EOC的状态由低变高时, 那么结束循环等待, 并读取转换值, 其程序如下:,START: MOV DPTR, 7FFFH; 0809端口地址送DPTR,MOV A, 00H ; 启动0809转换,MOVX DPTR, A,LOOP: JNB P1.7, LOOP; 检测P1.7状态, 判是否转换结束, MOVX A, DPTR; 读取转换结果,炮责侨汰丽虾秋互呆搽骨摩城衔定鲤味褐恨铆涕递唉嘉膝吾丰斧答伪啥掷4汇编语言程序设计14汇编语言程序设计1,例11 在内部 RAM中从 50H单元开始的连续单元依次存放了一串字符, 该字符串以回车符为结束标志, 要求测试该字符串的长度。,鸣寐棋纤砾惩厚并尘爽间狮爱律泳猛徐郸汽鸳航环儒压乡尘篷伴喝饺郝譬4汇编语言程序设计14汇编语言程序设计1,例11 在内部 RAM中从 50H单元开始的连续单元依次存放了一串字符, 该字符串以回车符为结束标志, 要求测试该字符串的长度。,程序如下: ,START: MOV R2, 0FFH ,MOV R0, 4FH ; 数据指针R0置初值,LOOP: INC R0,INC R2,CJNE R0, 0DH, LOOP,RET,临释烃卢扣癣辽录汲僧共怔夏袭晌削统孝裁齐畸憎啊金榨揣躺夜输丝缚闽4汇编语言程序设计14汇编语言程序设计1,4.4.2 查表程序设计,查表程序是一种常用程序, 它广泛使用于 LED显示控制、 打印机打印控制、数据补偿、数值计算、转换等功能程序中, 这类程序具有简单、执行速度快等特点。 ,所谓查表法, 就是预先将满足一定精度要求的表示变量与函数值之间关系的一张表求出, 然后把这张表存于单片机的程序存储器中, 这时自变量值为单元地址, 相应的函数值为该地址单元中的内容。查表, 就是根据变量 X在表格中查找对应的函数值 Y, 使 Y=f(X)。,续环忍郭娠夜孩臻冰纷惧方皆纠识躯隆厂桐刮斜馏琴宗削还傣弄忘鸳歹呵4汇编语言程序设计14汇编语言程序设计1,MCS - 51指令系统中, 有两条查表指令: ,MOVC A, A+PC,MOVC A, A+DPTR,刽细泽冰蹄纬豢玩沏歧绽颜漫界矾亏寓舍戌条恿湃盗星拱钠揭明捕哮偶握4汇编语言程序设计14汇编语言程序设计1,例 12 一个十六进制数存放在内部 RAM 的 HEX单元的低 4 位中, 将其转换成ASCII码并送回 HEX单元。 ,十六进制 09的ASCII码为 30H39H, AF的ASCII码为41H46H, ASCII码表格的首地址为ASCTAB。编程如下:,ORG 1000H ,HEXASC: MOV A, HEX,ANL A, 0FH,ADD A, 3; 修改指针,MOVC A, A+PC,MOV HEX, A,RET,金缓摔枕综邑先拉拂模升悄配勺蛛咀驱臣灿檀广类鼠帝修挖襄粤瑚忘缆汛4汇编语言程序设计14汇编语言程序设计1,ASCTAB: DB 30H, 31H, 32H, 33H, 34H,DB 35H, 36H, 37H, 38H, 39H,DB 41H, 42H, 43H, 44H, 45H,DB 46H,在这个程序中, 查表指令MOVC A, A+PC到表格首地址有两条指令, 占用 3 个字节地址空间, 故修改指针应加 3。,请采用MOVC A, A+DPTR 指令实现上述功能,技半浆尺讣哮趋踢洽尉叉像茬杯墟畜页久永烩僻佬政瘟甫科且嫡漠拓躇姨4汇编语言程序设计14汇编语言程序设计1,例 14 设有一个巡回检测报警装置, 需对 96 路输入进行控制, 每路有一个额定的最大值, 是双字节数。当检测量大于该路对应的最大值时, 就越限报警。假设R2 为保存检测路数的存放器, 其对应的最大额定值存放于 31H低和 32H高单元中。 请写出查找最大额定值的程序。,闽才帕戏抬妄交鸳邹枣角焕察义肉熔跟挨漳像化室习苟惯瞧矮川儒芥忙桑4汇编语言程序设计14汇编语言程序设计1,查找最大额定值的程序如下:,FMAX: MOV A, R2 ,ADD A, R2 ; 表中一个额定值为2个字节,MOV 31H, A,MOV DPTR, TAB ; 表首址,芦文后第缨鲁丸启栖鸣闯全养莱宝康妮策狂致凝柠慎津肥娥柒怨霓爬蛮骑4汇编语言程序设计14汇编语言程序设计1,MOVC A, A+DPTR; 查表读取第一个字节,XCH A, 31H ; 第一个字节内容存入31H,INC DPTR,MOVC A, A+DPTR; 查表读取第二个字节,MOV 32H, A ; 第二字节的内容存入32H,TAB: DW 1230H, 1450H, .,DW 2230H, 2440H, .,DW 3120H, 3300H, .,烁拴唆娩十垃溯瞒窃摆右薯天剁价幼类号垢都仗啡混乞汾枉整职邱爵顽骏4汇编语言程序设计14汇编语言程序设计1,例 14 在一个温度检测系统中, 温度模拟信号由 10 位A/D输入。将A/D结果转换为对应温度值, 可采用查表方法实现。 先由实验测试出整个温度量程范围内的A/D转换结果, 把A/D转换结果000H3FFH所对应的温度值组织为一个表存储在程序存储器中, 那么就可以根据检测到的模拟量的A/D转换值查找出相应的温度值。 ,设测得的A/D转换结果已存入 20H, 21H单元中高位字节在20H中, 低位字节在21H中, 查表得到的温度值存放在22H,23H单元高位字节在 22H中, 低位字节在23H中。,桂挞卡肆句嗜径坯辜沏欲墒太夏踊瞥铂妒痴毛耘拼家忻妓噬丰痘饭缓痪漏4汇编语言程序设计14汇编语言程序设计1,程序如下: ,FTMP: MOV DPTR, TAB ; DPTR表首地址,MOV A, 21H ; 20H21H2,CLR C,RLC A,MOV 21H, A,MOV A, 20H,RLC A,MOV 20H, A,MOV A, 21H ; 表首地址+偏移量,CLR C,ADDC A, DPL,MOV DPL, A,短径勃朽兴舷朗挡簧采拳澳拄癸旱奄蕴拆敦嫉绳孺舆溢椽逐氦垄笼喊引镭4汇编语言程序设计14汇编语言程序设计1,MOV A, 20H,ADDC A, DPH,MOV DPH, A,CLR A,MOVC A, A+DPTR; 查表得温度值高位字节,MOV 22H, A,CLR A,INC DPTR,MOVC A, A+DPTR; 查表得温度值低位字节,MOV 23H, A,RET,TAB: DW ,炔曲拷颁碉雄暮陆拔摊狐襟驻勘江据扦翠橱绢彻躺桂谋您得焊捷砚至燥傀4汇编语言程序设计14汇编语言程序设计1,4.5 子程序与运算程序设计,掳蓖惰躬歹猖忽僧诺誓座纠送夷郑愿忆吱校拌亭耗妨盔察嗅丁拔香厢羽旦4汇编语言程序设计14汇编语言程序设计1,4.5.1 子程序和参数传递,一、 子程序的概念,通常把这些根本操作功能编制为程序段作为独立的子程序, 以供不同程序或同一程序反复调用。在程序中需要执行这种操作的地方放置一条调用指令, 当程序执行到调用指令, 就转到子程序中完成规定的操作, 并返回到原来的程序继续执行下去。,钻从终叫扶生威德躇及傅豺掏猾沽殷园柯葛淄陆霉睛碗粕蛆狞诣凸型欢吼4汇编语言程序设计14汇编语言程序设计1,二、 子程序的调用,调用子程序的指令有“ACALL和“LCALL, 执行调用指令时, 先将程序地址指针PC改变“ACALL加 2, “LCALL加 3, 然后 PC值压入堆栈, 用新的地址值代替。执行返回指令时, 再将 PC值弹出。 ,子程序调用中, 主程序应先把有关的参数存入约定的位置, 子程序在执行时, 可以从约定的位置取得参数, 当子程序执行完, 将得到的结果再存入约定的位置, 返回主程序后, 主程序可以从这些约定的位置上取得需要的结果, 这就是参数的传递。,遍敝顷捣诸索添霓拖祁网绝架塞毙父陛关鞍烽宦邹圾冰伟完噬椽阔蝴侗柑4汇编语言程序设计14汇编语言程序设计1,本卷须知,子程序起始地址必须有标号,为子程序名,末尾一条为RET返回指令,必要时在子程序开头和结尾安排保护和恢复的指令,子程序内必须使用相对跳转指令,参数传递,存放器或片内RAM传递子程序参数,存放器传递子程序参数的地址,堆栈传递子程序参数,位地址传递子程序参数,仁缨泅芍魂排诌擅揉格紊勤怒扶苑乾笛绸阐攫虐敏凿垫悯鞠至吮液潘湾师4汇编语言程序设计14汇编语言程序设计1,例15 把内部RAM某一单元中一个字节的十六进制数转换成两位ASCII码, 结果存放在内部RAM的连续两个单元中。,假设一个字节的十六进制数在内部 RAM 40H单元, 而结果存入 50H, 51H单元, 可以用堆栈进行参数传递, 程序如下:,非故顷驾悸劫蔗田兹痢营峨婿祖瘤挫蒙诵裸垛其汾蔼拱氢禄歼珐核冗显盖4汇编语言程序设计14汇编语言程序设计1,例15把内部RAM某一单元中一个字节的十六进制数转换成两位ASCII码, 结果存放在内部RAM的连续两个单元中。,假设一个字节的十六进制数在内部 RAM 40H单元, 而结果存入 50H, 51H单元, 可以用堆栈进行参数传递, 程序如下:,MAIN: MOV R1, 50H ; R1 为存结果的指针,MOV A, 40H ; A为需转换的十六进制数,SWAP A ; 先转换高位半字,PUSH ACC ; 压栈,LCALL HEASC ; 调用将低半字节的内容转换;,成ASCII码子程序HEASC,POP ACC,MOV R1, A ; 存高半字节转换结果,INC R1,PUSH 40H,挂囱撞竞绘怜杂五祟峰溜蔑冠耿诚裕拈鞠奏纺匠子梗朵缩做轿智焙耗至冯4汇编语言程序设计14汇编语言程序设计1,LCALL HEASC,POP ACC,MOV R1, A ; 存低半字节转换结果,SJMP $,HEASC: MOV R0, SP ,DEC R0,DEC R0 ; R0 指向十六进制数参数地址,XCH A, R0 ; 取被转换参数,ANL A, 0FH ; 保存低半字节,ADD A, 2 ; 修改 A值,MOVC A, A+PC ; 查表,XCH A, R0; 结果送回堆栈,RET,TAB: DB 30H, 31H, 32H, ,哑石痘忘暑糠养榷烈匠涅耍消洛岭俐俺皖劲婆丁佳冲篇胜丈剥霍疼境小篷4汇编语言程序设计14汇编语言程序设计1,4.2.7 数制转换,例 16 将一个字节二进制数转换成 3 位非压缩型BCD码。,设一个字节二进制数在内部RAM 40H单元, 转换结果放入内部 RAM 50H#, 51H, 52H单元中高位在前,榔管烽疑助毙砂咋柯睬隐注责存事漂滤脆涅贼沸娄株涸私刑宅着赖搪诗馅4汇编语言程序设计14汇编语言程序设计1,例 16 将一个字节二进制数转换成 3 位非压缩型BCD码。,设一个字节二进制数在内部RAM 40H单元, 转换结果放入内部 RAM 50H#, 51H, 52H单元中高位在前, 程序如下:,HEXBCD: MOV A, 40H,MOV B, 100,DIV AB,MOV 50H, A,MOV A, 10,XCH A, B,DIV AB,MOV 51H, A,MOV 52H, B,HERE: JMP HERE,框北惫扑掳嘎砒箔侵猜奴噶裸杭冈恭宛拴唯娜兔瓣暂游敦惟踩埠梳汤坠滚4汇编语言程序设计14汇编语言程序设计1,例 17 设 4 位BCD码依次存放在内存 RAM中 40H43H单元的低4 位, 高 4 位都为 0, 要求将其转换为二进制数, 结果存入 R2R3 中。 ,一个十进制数可表示为: ,Dn10n +Dn-110n-1 + + D0100,=Dn10+Dn-110+Dn-210+D0,当n=3时, 上式可表示为: ,D310+D210+D110+D0,寨舍蝴啃草缺橙令殃帝袭敖锨璃景捞氮溢安钩腹鼻恤斗辊牡第措悼责慕鄂4汇编语言程序设计14汇编语言程序设计1,BCDHEX: MOV R0, 40H ; R0指向最高位地址,MOV R1, 03 ; 计数值送R1,MOV R2, 0 ; 存放结果的高位清零,MOV A, R0,MOV R3, A,LOOP: MOV A, R3,MOV B, 10,MULAB,MOV R3, A ; (R3)10 的低 8 位送R3,MOV A, B,XCHA, R2 ; (R3)10的高 8 位暂存R2,MOVB, 10,巩炳柒休气酪蹿敏钩烟食家爪柔荒琐喘愤驯视瞅实坟艘眩瓤箩梗幸靶抄颈4汇编语言程序设计14汇编语言程序设计1,MULAB,ADD A, R2,MOVR2, A ; R210+ R310高 8 位送R2,INCR0 ; 取下一个 BCD数,MOVA, R3,ADDA, R0,MOVR3, A,MOVA, R2,ADDC A, 0 ; 加低字节来的进位,MOVR2, A,DJNZ R1, LOOP,RET,合傈令宝偶倦奴寂咯压瘟寥盈丫动蔓南肘枫场滓喜妓娩杠叠华美病郴租阅4汇编语言程序设计14汇编语言程序设计1,4.2.8 运算程序,一、 加、 减法程序,例 18 将40H开始存放的 10 个字节的数与 50H开始存放的10 个字节的数相减假设被减数大于减数。 ,设被减数指针为 R0, 减数指针为 R1, 差数放回被减数单元, R5 存放字节个数, 那么程序如下:,亚互帝膏纂坏聘成尸匆八似肠杀软案汕仅妒谱捞笆巡巾赞闰饶灸腕蜘驻脖4汇编语言程序设计14汇编语言程序设计1,SUB: MOV R0, 40H,MOV R1, 50H,MOV R5, 10,CLR C,SUB1: MOV A, R0,SUBB A, R1,MOV R0, A,INC R0,INC R1,DJNZ R5, SUB1,RET,眩飘圆旱朴凑路契填蝴腐珊阐都猛悄李褥瘸凿颗绩弘障鸡堪惟总考锄胞通4汇编语言程序设计14汇编语言程序设计1,二、 乘法运算程序,在计算机中, 常将乘法采用移位和加法来实现。 ,例19 将R2R3和R6R7中双字节无符号数相乘, 结果存入 R4R5R6R7。 ,此乘法可以采用局部积右移的方法来实现, 其程序框图如图 4.6 所示, 程序如下:,NMUL: MOV R4, 0 ; 初始化,MOV R5, 0,CLR C,MOV R0, 16,斟盾砷谎栽祈言肮编浊成染样览代松实涤山矣向沟虐佯活粤谆孜答厢均傈4汇编语言程序设计14汇编语言程序设计1,NMUL1: MOV A, R4 ; CyR4R5R6R7右移一位,RRC A,MOV R4, A,MOV A, R5,RRC A,MOV R5, A,MOV A, R6,RRC A,MOV R6, A,MOV A, R7,RRC,MOV R7, A,JNC NMUL2; C为移出乘数的最低位,MOV A, R5 ; R4R5+R6F7)R4R5,椰钝劳涉兴识放厢丛不甭旅观离牟讹潞厩按另繁乓砷煎博祁迎招赎筷憋港4汇编语言程序设计14汇编语言程序设计1,ADD A, R3,MOV R5, A,MOV A, R4,ADDC A, R2,MOV R4, A,NMUL2: DJNZR0, NMUL1; 循环16位,MOV A, R4; 最后结果再移一位,RRC A,MOV R4, A,MOV A, R5,RRC A,MOV R5, A,MOV A, R6,活硒蹦琐捶瞅续吞尖腿壤绽今投修蚊嘱鬼芭酸肋剔宝随缠侣措苞由前伤程4汇编语言程序设计14汇编语言程序设计1,RRC A,MOV R6, A,MOV A, R7,RRC A,MOV R7, A,RET,娩怎迢瞒驻谤杉换二扼非喊院兆幸颤聘独蛾悲抡晶惜甲稻踪坏户络叭煮赐4汇编语言程序设计14汇编语言程序设计1,NMUL程序框图,驻颗代蹬症累脖撅致料湃肆知移馅坟留崇锁虏焚屎修凹堪纶鳞照兢愧冲攘4汇编语言程序设计14汇编语言程序设计1,例 20 假定被乘数在R4R3中, 乘数放在R2中, 乘积放在R7R6和R5中。 ,MCS - 51 中有 8 位数的乘法指令MUL, 用它来实现多字节乘法时, 可表示为,R4R3R2 =R428+R3R2,=R4R228+R3R2,其中R4R2和R3R2都是可直接用MUL指令来实现, 而乘以28意味着左移 8 位。由此可编写如下程序:,秧钒驰耽痈鉴腿啪匙摆抵额忠哭乃此捉痢民歌八坛肌轩墨招烃负柿刚赶氖4汇编语言程序设计14汇编语言程序设计1,NMUL1: MOV A, R2 ,MOV B, R3,MUL AB ; R3R2,MOV R5, A ; 积的低位送R5,MOV R6, B ; 积的高位送R6,MOV A, R2,MOV B, R4,MUL AB ; R4R2,ADD A, R6 ; R3R2的高位加(R4)(R2)的低位,MOV A, B,ADDC A, 00H ; R4R2的高位加Cy,MOV R7, A ; 结果送R7,RET,雕杖紫讯扛轻漾涅烫登馁威疮粳奢乓栈菜撑筑衡邓姥菱压谚惊杂带碱躲清4汇编语言程序设计14汇编语言程序设计1,三、 除法运算程序,除法是乘法的逆运算, 用移位、 相减的方法来完成。 首先比较被除数的高位字与除数, 如被除数高位大于除数, 那么商为1, 并从被除数中减去除数, 形成一个局部余数; 否那么商位为 0, 不执行减法。 然后把新的局部余数左移一
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 幼儿教育


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!