您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 51单片机学习07(汇编程序1)
第4章89C51汇编语言程序设计汇编语言是面向机器硬件的语言,要求程序设计者对89C51单片机具有很好的“软、硬结合”的功底。4.1汇编语言程序设计概述4.1.1机器语言、汇编语言和高级语言1.机器语言用二进制(“0”、“1”)代码表示的指令、数字,用机器语言编写的程序——机器语言目标程序,不易懂,难记忆,易出错。P.532.汇编语言采用英文的指令助记符表示指令称为符号语言或汇编语言将汇编语言程序转换成为二进制代码表示的机器语言程序的程序称为汇编程序经汇编程序“汇编”得到的机器语言程序称为机器语言目标程序,原来的程序称为汇编语言源程序。汇编语言特点:(1)面向机器的语言,程序设计员须对硬件有相当深入的了解。(2)助记符指令和机器指令一一对应,用汇编语言编写的程序(比高级语言编写的程序)效率高,占存储空间小,运行速度快,能编写出最优化的程序。(3)能直接管理和控制硬件设备(功能部件),它能处理中断,也能直接访问存储器及I/O接口电路。汇编语言和机器语言都脱离不开具体机器的硬件,均是面向“机器”的语言,缺乏通用性。P.533.高级语言不受具体机器的限制,接近于人的自然语言及学科语言,常用的如BASIC、FORTRAN以及C语言等。可视化、面向对象……高级语言优点:通用性强,直观、易懂、易学,可读性好。计算机不能直接识别和执行高级语言,需要将其“翻译”成机器语言才能识别和执行,进行“翻译”的专用程序称为编译程序。可用C语言(C51)来进行AT89C51的应用程序设计。对于程序的空间和时间要求很高的场合,汇编语言仍是必不可缺的。C语言和汇编语言混合编程在很多需要直接控制硬件的场合,则更是非用汇编语言不可使用汇编语言编程,是单片机程序设计的基本功之一P.53汇编汇编语言源程序机器语言目标程序汇编程序(汇编软件)人工[人工汇编][机器汇编]编译/解释高级语言源程序机器语言目标程序编译程序/解释程序(软件)(编译型/解释型)4.1.2汇编语言语句的种类和格式两种基本类型:指令语句和伪指令语句(1)指令语句(CPU指令、可执行指令、真指令)已在第3章介绍每一条指令语句在汇编时都产生一个指令代码:机器指令代码(2)伪指令语句(命令语句)是为汇编工作服务的。在汇编时除了定义的数据之外没有机器指令代码与之对应。P.54【例4-1】AT89C51的汇编语言的四分段格式如下:标号字段操作码字段操作数字段注释字段START:MOVA,#00H;0→AMOVR1,#10;10→R1MOVR2,#00000011B;3→R2LOOP:ADDA,R2;(A)+(R2)→ADJNZR1,LOOP;R1内容减1不为零,则循环NOPHERE:SJMPHERE程序功能:R2内容自加10次:R2×10→AP.54十进制二进制十六进制P.554.1.3伪指令伪指令也称为汇编程序控制命令,是向汇编程序发出的指示信息,告诉它如何完成汇编工作。伪指令没有相应的机器指令代码产生常用的伪指令:1.ORG(ORiGin)汇编起始地址命令指定后续程序的起始地址。可多次使用ORG指令,但是,地址必须由小到大排列,地址不能交叉、重叠。ORG2000H20007400START:MOVA,#00H┋2.END(ENDofassembly)汇编终止命令汇编语言源程序的结束标志,用于终止源程序的汇编工作。在整个源程序中只能有一条END命令,且位于整个程序的最后。P.55-563.DB(DefineByte)定义字节命令例:ORG2000H20003040184342DB30H,40H,24,“C”,“B”DB功能是从当前地址开始定义(存储)若干个单字节数据,十进制数自然转换成16进制数,字母按ASCII码存储。4.DW(DefineWord)定义数据字命令定义16位的数据字。例如:ORG2000H20001246007B000ADW1246H,7BH,10DB功能是从当前地址开始定义(存储)若干个双字节数据,高字节在低地址单元5.EQU(EQUate)赋值命令用于给标号赋值。赋值以后,其标号值在整个程序有效。例如:TESTEQU2000H表示标号TEST=2000H,在汇编时,凡是遇到标号TEST时,均以2000H来代替。P.56【例4-3】设计一子程序,功能为:根据30H单元中的数x(0~9之间)查平方表,求出x相应的平方y存50H单元。x和y均为单字节数。用DPTR作基址的方法:地址机器码汇编语言源程序ORG0300H0300E530PFSUB:MOVA,30H;取自变量x0302900309MOVDPTR,#0309H;或MOVDPTR,#TAB030593MOVCA,@A+DPTR;查表得相应函数值0306F550MOV50H,A;存结果y030822RET03090001040910TAB:DB00H,01H,04H,09H,10H;平方表014916030E1924314051DB19H,24H,31H,40H,51H;2536496481(x+0309H)【引用前例】4.2汇编语言源程序的汇编汇编语言源程序“翻译”成机器代码(指令代码)的过程称为“汇编”。汇编可分为手工汇编和机器汇编两类:4.2.1手工汇编人工查表翻译指令。但遇到的相对转移指令的偏移量的计算,要根据转移的目标地址计算偏移量,不但麻烦,且容易出错。4.2.2机器汇编用编辑软件进行源程序的编辑。编辑完成后,生成一个ASCII码文件,扩展名为“.ASM”。然后在微计算机上运行汇编程序,把汇编语言源程序翻译成机器代码。交叉汇编--汇编后的机器代码是在另一台(种)计算机(这里是单片机)上运行。反汇编——分析已有的可执行目标程序,要将二进制的机器代码语言程序反向翻译成汇编语言源程序,以便分析、修改。P.574.3AT89C51单片机汇编语言程序设计举例4.3.6分支转移程序设计1.单分支转移结构:仅有两个出口,两者选一图4-4图4-5P.65属循环结构!3图4-3程序段1条件满足?【例B4-1】请编程序使48H、49H单元所存储的二个数中较大者在前。ORG0000HBIG:MOVA,48H;取甲CLRC;清CySUBBA,49H;减去乙数JNCLP1;无借位则甲≥乙,转LP1MOVA,48H;乙数大:两数交换MOV48,49HMOV49H,ALP1:SJMP$;自循环【练习】请编程序使48H、49H单元所存储的二个数中较小者送28H单元。请编程序判断若34H、35H单元所存储的二个数相等则置F0位为0,否则置1。CJNEA,49H,LPSJMPLP1;相等LP:JNCLP1;甲>乙2.多分支转移结构:程序的判别部分有两个以上的出口。例4-10求符号函数的值。X存放在40H单元,Y存放在41H单元。SIGNFUC:MOVA,40HCJNEA,#00H,NZEARAJMPNEGT;为0则转NZEAR:JBAcc.7,POSI;为负则转MOVA,#01H;为正:赋+1原码AJMPSAVEPOSI:MOVA,#81H;赋-1的原码SJMPSAVENEGT:MOVA,#00H;赋0的原码SAVE:MOV41H,A;存结果SJMP$END图4-6P.66NZEARNEGTPOSIA→YAA(A)X→ASSY=1当X00当X=0-1当X0若补码:-1是FFH教材题意为用原码表示带符号数X、YSAVE图4-7在实际的应用中,经常遇到的图4-7结构形式的分支转移程序的设计,需根据某一单元的内容是0,1,……,n,来分别转向处理程序0,处理程序1,……处理程序n。P.65类似于开关语句A=1A=n4.3.7循环程序设计图4-8是计数循环控制结构,图4-9是条件控制结构。图4-8图4-9循环计数P.67公共结果处理循环循环准备:初始地址指针循环计数初值单元变量初值为下一次循环做准备例4-12(改)如果xi均为单字节数,并按i顺序存放在51单片机内部RAM从50H开始的单元中,数据个数n放在R2中,求这批数据的和(双字节)放在R3、R4中,程序如下:(求数组和程序)ORG0000HADD1:MOVR2,#0AH;加法次数n送R2,n为具体的数据个数,如10MOVR3,#0;部分和高字节单元清0MOVR4,#0;部分和低字节单元清0MOVR0,#50H;R0指向第一个数LOOP:MOVA,R4;取部分和低字节原有的值ADDA,@R0;加上当前数低字节(本例原始数据只有低字节)MOVR4,A;回存新的部分和低字节结果MOVA,R3;取部分和高字节原有的值ADDCA,#00H;加上当前数高字节(00H)及低字节的进位MOVR3,A;回存新的部分和高字节结果INCR0;R0指向下一个数DJNZR2,LOOP;未加完,转回继续进行下一个数的累加SJMP$ENDP.68作业三:P.70—4补充1:请编程序使40H、41H单元所存储的二个数中的大数减去小数,差值存58H单元(即求两数差的绝对值)。补充2:有8个双字节BCD数存放在片内RAM的40H开始的单元中,请编程求它们的和(双字节)放在60H、61H单元中。(设双字节数的高字节存放在两字节的高地址单元)补充3:完成下列程序的人工汇编工作:ORG2036HD2SETBP1.612LOOP:LCALLDELYB2CPLP1.680SJMPLOOP7DDELY:MOVR5,#0F5H00DELY2:NOP00NOPDDDJNZR5,DELY222RET
本文标题:51单片机学习07(汇编程序1)
链接地址:https://www.777doc.com/doc-3319319 .html