您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 第4章 汇编语言程序设计
第4章汇编语言程序设计第4章汇编语言程序设计4-1汇编程序约定4-2汇编程序设计步骤4-3顺序程序4-4分支程序4-5循环程序4-6算术运算程序4-1汇编程序约定汇编语言程序:用汇编语言编写的、完成特定功能的指令序列。汇编程序:能将汇编语言源程序转换成机器语言目标程序的系统软件。汇编语言程序到机器语言程序的转换过程称为汇编。1、手工汇编:人工查指令表汇编。用于设计短小程序或调试程序的场合。2、机器汇编:用汇编程序进行汇编。源程序使用机器汇编要考虑汇编程序的约定:1)按指令格式和语法规则编写程序。常数的表示:十进制数:20D;D可省:可简写为20十六进制数:87H,0F0HH不能省二进制数:01011001BB不能省字符:‘H’字符串:“Hello”。2)使用伪指令提供汇编信息。汇编的主要任务:1)确定程序中每条汇编语言指令的指令机器码。2)确定每条指令在存储器中的存放地址。3)提供错误信息。4)提供目标执行文件(*.OBJ/*.HEX)和列表文件(*.LST)。一、汇编语言指令类型:1.机器指令:指令系统中的全部指令,每条指令有对应的机器代码。2.伪指令:汇编控制指令,仅提供汇编信息,没有指令代码。伪指令•一般的汇编语言程序中也包括一些伪指令,但它并不被译成机器码,只是影响到汇编过程。它是用来对汇编过程进行说明和指导的一组命令。每种汇编程序都定义若干条伪指令,不同版本的汇编程序伪指令的符号和含义可能有差异,但基本用法是相似的。•下面介绍一些常用的伪指令。二、汇编控制指令(伪指令):常用伪指令及其功能(参见书P46--49)1.定位伪指令(汇编起始地址伪指令)ORGmm为十进制或十六进制数。m指出在该伪指令后的指令的汇编地址,即生成的机器指令的起始存储器地址。在一个汇编语言源程序中允许使用多条定位伪指令,但其值应和前面生成的机器指令存放地址不重叠,如:ORG100HSTART:MOVA,#30HMOVB,#50H……参照书P48指令地址机器码源程序ORG2000H2000H7830MAIN:MOVR0,#30H2002HE6MOVA,@R0…ORG3000H3000H23DB23H,100,‘A’3001H643002H412.汇编结束伪指令END该伪指令指出结束汇编,即使后面还有指令,汇编程序也不作处理。在源程序中只能有一条END指令参照书P463.字或字节赋值伪指令标号EQUm该伪指令把值m赋给前面的标号,在程序中标号和m是等价的,如:DBUFEQU30H则符号DBUF等价于30H。在程序中可对DBUF进行赋值,实际上是对内部RAM的30H写一个值。参照书P48EQU赋值伪指令举例说明:字符名称EQU项(数或汇编符号)例:AAEQUR1MOVA,AA例:D10EQU10ADD_YEQU07ABHMOVA,D10LCALLADD_YEQU伪指令是把“项”赋给“字符名称”,注意这里的“字符名称”不同于指令标号(其后没有冒号),但它是必须的。用EQU赋过值的符号名可以用作数据地址、代码地址、位地址或是一个立即数。;(R1)A;10A;调用始于07ABH处子程序4.定义字节伪指令DBX1,X2,…,XnXi为单字节数据,它可以是十进制或十六进制数,也可以是一个表达式。Xi也可以是由两个单引号括起来的一个字符串,这时Xi定义的字节长度等于字符串的长度,每一个字符为一个ASCII码。该伪指令把X1,X2,…,Xn存入目标程序存储器,通常用于定义一个常数表,如:BTAB:DB00H,01H,02H,03H,04H参照书P47定义字节伪指令举例说明:[标号:]DBX1、X2…XnORG1000HDB0AAHDATA1:DB25,25HDATA2:DB'MCS-51'经汇编后,从地址1000H处存贮器的内容为:(1000H)=AAH(1001H)=19H(1002H)=25H(1003H)=4DH(1004H)=43H(1005H)=53H(1006H)=2DH(1007H)=35H(1008H)=31H5.字定义伪指令DWY1,Y2,…,YnYi为双字节数据,它可以是十进制或十六进制数,也可以是一个表达式。该伪指令把Y1,Y2,…,Yn存入目标程序存储器,经常用于定义一个地址表,如:WTAB:DW1000H,2000H,3000H,7890H,4567H参照书P48字定义伪指令举例说明:[标号:]DWY1,Y2,…,Yn通知汇编程序从当前ROM地址开始,保留存贮单元,并存入DW后面的数据。存放时高8位在前,低8位在后。例:ORG1000HDW1234HDATA:DW56H,2000经汇编后,从地址1000H处存贮器的内容为:(1000H)=12H(1001H)=34H(1002H)=00H(1003H)=56H(1004H)=07H(1005H)=0D0H6、DS预留存贮空间伪指令[标号:]DS表达式在汇编时,从指定地址开始保留DS之后“表达式”的值所规定的存贮单元。ORG1000HDS07HDB20H,20DW12H经汇编后,从地址1000H开始保留7个单元,然后从1007H处存贮器的内容为:(1007H)=20H(1008H)=14H(1009H)=00H(100AH)=12H参照书P487.位赋值伪指令标号bitn该伪指令把值n赋给前面的标号,n一般指位地址,在程序中标号和n是等价的。如:HIGHbit10H则HIGH等价于位地址10H((22H.0)),1→HIGH等价于1→10H等价于1→22H.0。参见书P15表2.5参照书P48--49BIT位赋值伪指令举例说明:字符名称BIT位地址这里的“字符名称”与标号不同(其后没有冒号),但它是必须的,其功能是把BIT之后的“位地址”值赋给“字符名称”。例:PsaBITP1.1A2BIT02HMOVC,PsaMOVA2,C参见书P15表2.5三.汇编语言源程序的编程和汇编1.编程汇编语言编程时大多在PC机中用文本编辑器(如EDIT)编写,目前几乎所有的单片机仿真器所配的软件均有文本编辑器。如南京伟福WAVE6000forWindows、DVCC软件、开发实验箱等。只要运行软件后进入程序编辑状态即可编写程序。注意:汇编源程序的扩展名为:”asm”2.汇编汇编语言必须经过机器汇编或人工汇编才能得到相应的机器程序,即目标程序,以供单片机识别和执行。由于人工汇编工作量大,容易出错,现已很少用(个人创业)。机器汇编一般是在PC机上利用一些汇编软件进行。目前几乎所有的单片机仿真器配的开发软件都有汇编程序,在源程序编写完成后使用汇编功能菜单即可进行对源程序汇编。在汇编时若发现源程序有语法错误或跳转超出范围等情况,系统会将错误显示给用户。用户在改正错误后,需再对源程序进行汇编,直到源程序完全没有语法错误。此时汇编程序会生成与其对应的目标文件。一般情况下是生成HEX(十六进制)和BIN(二进制)文件。没有语法错误并不等于程序开发成功,一般来说还要对程序进一步调试、修改,运行无误后,程序才算最终完成。这时才可将目标文件写入到程序存储器中。汇编语言程序设计方法单片机应用系统软件一般由汇编语言或其他高级语言写成,一个单片机程序中由主程序、若干个子程序、中断程序组成,从程序结构上分为顺序程序、分支程序、循环程序、子程序、中断程序等。4-2汇编语言程序设计步骤一、依项目方案、参数指标等确定设计方案和计算方法;二、了解应用系统的硬件配置、性能指标;三、建立系统数学模型,确定控制算法和操作步骤;四、画程序流程图;表示程序结构和程序功能。五、编制源程序。1.合理分配存储器单元和了解I/O接口地址。2.按功能设计程序,明确各程序之间的相互关系。3.用注释行说明程序,便于阅读、修改和调试。开始结束YN条件满足?处理处理处理处理常用程序结构:4-3顺序程序顺序程序又称简单程序,程序走向只有一条路径。例:双字节求补程序(设数据在R4R5中):CLRCMOVA,R5;取低字节CPLAADDA,#01H;低字节变补MOVR5,AMOVA,R4;取高字节CPLAADDCA,#00H;高字节变补MOVR4,A开始结束处理处理处理顺序程序、分支程序、循环程序。例:三字节无符号数相加,其中被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、54H和55H单元中;要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的00H位中。20H内部RAM...50H53H55H54H52H51H加数被加数CY和00H低字节低字节中字节中字节高字节高字节52H51H50H+55H54H53H52H51H50H00HCY高字节高字节低字节低字节R0→R1→MOVR0,#52HMOVR1,#55HMOVA,@R0ADDA,@R1MOV@R0,ADECR0DECR1MOVA,@R0ADDCA,@R1MOV@R0,ADECR0DECR1MOVA,@R0ADDCA,@R1MOV@R0,ACLRAADDCA,#00HMOVR0,#00HMOV@R0,A;被加数的低字节地址;加数的低字节地址;低字节相加;存低字节相加结果;中间字节带进位相加;存中间字节相加结果;高字节带进位相加;存高字节相加结果;存放进位的单元地址;进位送00H位保存程序:更高效的方法是编制循环程序后面讲CLRCMOV00H,C例:压缩式BCD码分解成为单字节BCD码。MOVR0,#40H;设指针MOVA,@R0;取一个字节MOVR2,A;暂存ANLA,#0FH;高半字节清0INCR0;指针指向41HMOV@R0,A;保存数据个位MOVA,R2SWAPA;十位换到低半字节ANLA,#0FH;高半字节清0INCR0;指针指向42HMOV@R0,A;保存数据十位片内RAM42H0十41H0个40H十个分支程序就是在程序执行过程中要判断某些条件,当条件成立后程序转移到不同的功能处运行。在MCS-51单片机中条件转移指令都可以用在分支程序中。(复习、参见书P38---39)(1)测试条件符合转移,如:JZ、JNB…等4--4分支程序(参见书P49-57)(2)比较不相等转移,如:CJNER0,#2FH,LOOP(3)减1不为0转移,如:DJNZR7,LOOP(4)根据某些单元或寄存器的内容转移,如:JMP@A+DPTR4-4-1单重分支程序一个判断决策框,程序有两条出路。两种分支结构:YN条件满足?影响条件处理1处理2YN条件满足?影响条件处理段由条件转移指令构成程序判断框部分,形成程序分支结构。例:假定在外部RAM中有ST1、ST2和ST3共3个连续单元,其中ST1和ST2单元中分别存放着两个8位无符号二进制数,要求找出其中的大数并存入ST3单元中。START:CLRCMOVDPTR,#ST1MOVXA,@DPTRMOVR2,AINCDPTRMOVXA,@DPTRSUBBA,R2JNCBIG1XCHA,R2BIG0:INCDPTRMOVX@DPTR,ARETBIG1:MOVXA,@DPTRSJMPBIG0;进位位清“0”;设置数据指针,指向ST1;取第一个数;第一个数存R2;数据指针加1,指向ST2;取第二个数;两数比较(第二个数-第一个数);第二个数大转BIG1(C=0无借位跳);第一个数大整字节交换继续;指向ST3单元;存大数;重取第二个数4-4-2多重分支程序例:求符号函数Y=SGN(X),X在片内RAM40H,结果放入片内RAM41H+1(当X0)SGN(X)=0(当X=0)-1(当X0)SYMB:MOVA,40H;取XJZSTOR;X=0跳,Y=XJBACC.7,MINUS;X<0(A.7=1跳)MOVA,#01H;X>0,Y=+1SJMPSTORMINUS:MOVA,#0FFH;X<0,Y=-1STOR:MOV41H,A;保存YRET开始结束YNX=0?取XY=+1X<0?Y=-1Y=0保存YNY内部RAM41H40H......X(变量)Y(函数)多次使用条件转移指令,形成两个以上判断框。参见书P49例1按分支号转移如:当分支号=0
本文标题:第4章 汇编语言程序设计
链接地址:https://www.777doc.com/doc-3515793 .html