第4章--汇编语言程序设计_第1页
第4章--汇编语言程序设计_第2页
第4章--汇编语言程序设计_第3页
第4章--汇编语言程序设计_第4页
第4章--汇编语言程序设计_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

1、第第4 4章章 汇编语言程序设计汇编语言程序设计教学目的教学目的(1) 了解汇编语言编程的基础知识。了解汇编语言编程的基础知识。(2) 了解汇编语言程序设计的基本步骤和方法。了解汇编语言程序设计的基本步骤和方法。(3) 了解汇编语言目标程序效率高、占存储空间少、运了解汇编语言目标程序效率高、占存储空间少、运行速度快、实时性强等特点。行速度快、实时性强等特点。(4) 掌握掌握MCS-51汇编语言的顺序、分支、循环及子程汇编语言的顺序、分支、循环及子程序的结构、设计。序的结构、设计。本章重点本章重点与难点与难点分支程序、循环程序的设计分支程序、循环程序的设计子程序的编写与应用子程序的编写与应用结束

2、取数据低4位转换成ASCII码存ASCII码取数据高4位转换成ASCII码存ASCII码开始 将将30H单元内的两位单元内的两位BCD码拆开并转换成码拆开并转换成ASCII码,存入码,存入RAM两个单元两个单元31H和和32H中,高字节存中,高字节存32H。例例1ORG2000HMOV A,30H;取值ANLA,#0FH;取低4位ADDA,#30H;转换成ASCII码MOV 31H,A;保存结果MOV A,30H;取值SWAP A ;高4位与低4位互换ANL A,#0FH ;取低4位(原高4位)ADDA,#30H;转换成ASCII码MOV 32H,A;保存结果 SJMP $ END 设设X、Y

3、两个小于两个小于10的整数分别存于片内的整数分别存于片内30H、31H单元,试求两数的平方和并将结果存于单元,试求两数的平方和并将结果存于32H单元。单元。例例2结束取数据X求X2暂存X2取数据Y求Y2求X2+Y2开始保存平方和ORG2000HMOV A,30H;取30H单元数据MOV B,A;将X送入B寄存器MUL AB;求X2,结果在累加器中MOV R1,A;将结果暂存于R1寄存器中MOV A,31H;取31H单元数据MOV B,A;将Y送入B寄存器MUL AB;求Y2,结果在累加器中ADDA,R1;求X2+ Y2MOV 32H,A;保存数据SJMP $;暂停END MOV DPTR, #

4、2002HMOVX A, DPTRMOV DPTR, #2004HMOVX DPTR, AMOV DPTR, #2001HMOVX A, DPTRMOV DPTR, #2003HMOVX DPTR, AMOV DPTR, #2000HMOVX A, DPTRMOV DPTR, #2002HMOVX DPTR, ASJMP $例例 3将地址为将地址为2000H、2001H、2002H的片外数据存储的片外数据存储器单元的内容分器单元的内容分别传送到别传送到2002H、2003H、2004H存储单元中去。存储单元中去。例例4 字节加法程序字节加法程序被加数在内部被加数在内部RAM的的50H、51H、

5、52H单元中;加数单元中;加数在内部在内部RAM 的的53H、54H、55H单元中;相加之和存单元中;相加之和存放在放在50H、51H、52H单元中,进位位存放在位寻址区单元中,进位位存放在位寻址区的的20H单元中。单元中。INC R0INC R1MOV A, R0ADDC A, R1MOV R0, ACLR AADDC A, #00HMOV R0, #20HMOV R0, AENDMOV R0, #50HMOV R1, #53HMOV A, R0ADD A, R1MOV R0, AINC R0INC R1MOV A, R0ADDC A, R1MOV R0, A例例5 乘法运算乘法运算设被乘数

6、为设被乘数为16位无符号数,低位无符号数,低8位存放在地址为位存放在地址为K的单元,高的单元,高8位存放在地址为位存放在地址为K+1的单元。乘数为的单元。乘数为8位无符号数,存放在位无符号数,存放在M单单元。编程求出二者乘积,并将乘积的元。编程求出二者乘积,并将乘积的07位存放在位存放在R1,815位存放在位存放在R2,1623位存放在位存放在R3中。中。16位无符号数与8位无符号数相乘的步骤示意如下:MOV R0, #K ;设置被乘数地址指针MOV A, R0 ;被乘数送A中MOV B, M ;乘数送B中MUL AB ;(K)(M) MOV R1, A ;乘积的07位存入R1MOV R2,

7、B ;暂存积的815位INC R0 ;指向被乘数高8位地址MOV A, R0 ;取被乘数高8位MOV B, M ;乘数送B中MUL AB ;(K+1)(M)ADD A, R2 ;求得乘积的815位MOV R2, A ;乘;积的815位存入R2MOV A, BADDC A, #00H ;求;得乘积的1623位MOV R3, A ;乘;积的1623位存入R3 编程将内部编程将内部RAM的的20H单元和单元和30H单单元的内容互换元的内容互换.程序如下: ORG 4000H START: MOV R0, #20H MOV A, R0 MOV R1, #30H XCH A, R1 MOV R0, A

8、SJMP $ END 设变量放在片内RAM的60H单元,取值范围为00H09H,要求查出变量的平方值,并放入片内RAM的61H单元. ORG 4000H START:MOV DPTR,#TAB MOV A,60H MOVC A,A+DPTR MOV 61H,A SJMP $ TAB: DB 00,01,04,09,16 DB 25,26,49,64,81 END单分支转移结构举例单分支转移结构举例 仅有两个出口,两者选一。仅有两个出口,两者选一。 例例6 6 求单字节有符号数的二进制补码求单字节有符号数的二进制补码参考程序:参考程序:CMPTCMPT:JNB Acc.7JNB Acc.7,RE

9、TURN ;RETURN ;(A A)00,不需转换,不需转换 MOV CMOV C,Acc.7Acc.7 ; ;符号位保存符号位保存 CPL ACPL A ; ;(A A)求反,加)求反,加1 1 ADD A ADD A,#1#1 MOV Acc.7 MOV Acc.7,C C ; ;符号位存符号位存A A的最高位的最高位RETURNRETURN:RETRET思考:该程序能否改进? 例例7 片内片内RAM ONE和和TWO两个单元中存有两个无符号数两个单元中存有两个无符号数,将两个数中的小者存入,将两个数中的小者存入30H单元,大者存单元,大者存40H单元。单元。MOV A,ONECJNE

10、A,TWO,NEQSJMP STORENEQ:JC STOREMOV A,TWO MOV 40H, ASTORE: MOV 30H,A SJMP $ END程序如下:单分支转移结构举例单分支转移结构举例 仅有两个出口,两者选一。仅有两个出口,两者选一。START:CLR C;进位位清0MOV DPTR, #ST1 ;设置数据指针MOVX A, DPTR;取第1个数MOV R2, A;第1个数存于R2INCDPTR;数据指针加1MOVX A, DPTR;取第2个数SUBB A, R2;两数比较JC BIG1;若第2个数大,则转向BIG1 MOVX A, DPTRSJMP BIG0BIG1: XC

11、H A, R2;若第1个数大,则整字节交换BIG0: INC DPTRMOVX DPTR, A;存大数RET单分支结构举例单分支结构举例 例例9 9 求符号函数的值。求符号函数的值。符号函数定义如下:符号函数定义如下:010001XXXY当当当多重单分支结构举例 多重单分支结构,程序的判别部分有两个以上的多重单分支结构,程序的判别部分有两个以上的出口流向。出口流向。假定假定X X存放在存放在40H40H单元,单元,Y Y存存放在放在41H41H单元。单元。程序如下:程序如下:SIGNFUC: MOV A, 40H CJNE A, #00H, NZERO SJMP ZERONZERO: JB A

12、CC.7, NEGT MOV A, #01H SJMP ZERONEGT: MOV A, #0FFHZERO: MOV 41H, A SJMP$ 假定假定X存放在存放在40H单元,单元,Y存放在存放在41H单元。单元。 多重单分支结构举例例例10 10 两个有符号数比较两个有符号数比较 内部内部RAM的的20H单元和单元和30H单元各存放了一个单元各存放了一个8位有位有符号数,请比较这两个数的大小,比较结果显示在实训实验板上。结果如下:符号数,请比较这两个数的大小,比较结果显示在实训实验板上。结果如下: 若若(20H)=(30H),则,则P1.0管脚连接的管脚连接的LED发光;发光; 若若(2

13、0H)(30H),则,则P1.1管脚连接的管脚连接的LED发光;发光; 若若(20H)(30H),则,则P1.2管脚连接的管脚连接的LED发光。发光。三分支程序分支结构举例三分支程序分支结构举例 (1) 题意分析题意分析 有符号数在计算机中的表示方式与无符号数是不相同的:正数以有符号数在计算机中的表示方式与无符号数是不相同的:正数以原码形式表示,负数以补码形式表示,原码形式表示,负数以补码形式表示,8 8位二进制数的补码所能表示的位二进制数的补码所能表示的数值范围为数值范围为+127-128+127-128。 计算机本身无法区分一串二进制码组成的数字是有符号数或无符号计算机本身无法区分一串二进

14、制码组成的数字是有符号数或无符号数,也无法区分它是程序指令还是一个数据。编程员必须对程序中出数,也无法区分它是程序指令还是一个数据。编程员必须对程序中出现的每一个数据的含义非常清楚,并按此选择相应的操作。例如,数现的每一个数据的含义非常清楚,并按此选择相应的操作。例如,数据据FEH看作无符号数其值为看作无符号数其值为254,看作有符号数为,看作有符号数为-2。 比较两个有符号数比较两个有符号数X和和Y大小要比无符号数麻烦得多。这里提供一种大小要比无符号数麻烦得多。这里提供一种比较思路:先判别两个有符号数比较思路:先判别两个有符号数X和和Y的符号,如果的符号,如果X、Y两数符号相反,两数符号相反

15、,则非负数大;如果则非负数大;如果X、Y两数符号相同,将两数相减,然后根据借位标志两数符号相同,将两数相减,然后根据借位标志CY进行判断。这一比较过程如图所示。进行判断。这一比较过程如图所示。三分支程序分支结构举例三分支程序分支结构举例开始X、Y 符号相同XYNCY1XY 点P1.0 连接的灯XY 点P1.1 连接的灯XY 点P1.2 连接的灯结束XY 点P1.2 连接的灯XY 点P1.1 连接的灯X0XYYYNNYNY XDATA 20H YDATA 30H ORG 0000H MOV A,X XRLA,Y ;(X)与(Y)进行异或操作 JB ACC.7,NEXT1;累加器A的第7位为1,两

16、数符号不同,转NEXT1 MOV A,X CJNE A,Y,NEQUAL;(X)(Y),转移到NEQUAL CLR P1.0 ;(X)=(Y),点亮P1.0连接的LED SJMP FINISH NEQUAL: JC XXY ;(X)(Y),转移到XDY NEXT1: MOV A,X JNB ACC.7,XDY ;判断(X)的最高位D7,以确定其正负XXY: CLR P1.2 ;(X)(Y),点亮P1.1连接的LED FINISH: SJMP $ END (2) 汇编语言源程序汇编语言源程序 (3) 程序说明程序说明 判断两个有符号数符号异同的方法判断两个有符号数符号异同的方法 本例中使用逻辑异

17、或指令,将本例中使用逻辑异或指令,将(X)与与(Y)进行异或操作,那么,进行异或操作,那么,(X)的符号位的符号位(X)7与与(Y)的符号位的符号位(Y)7异或的结果如下:异或的结果如下: 若若(X)7与与(Y)7相同,则相同,则(X)7 (Y)70;若;若(X)7与与(Y)7不相同,则不相同,则(X)7 (Y)71。 本例中,本例中,(X)与与(Y)的异或结果存放在累加器的异或结果存放在累加器A中,因此判断中,因此判断ACC.7是否为零是否为零即可知道两个数的符号相同与否。即可知道两个数的符号相同与否。 比较两个有符号数的其它方法。比较两个有符号数的其它方法。 除了本例中使用的比较两个有符号

18、数的方法之外,我们还可以利用溢出标志除了本例中使用的比较两个有符号数的方法之外,我们还可以利用溢出标志OV的状态来判断两个有符号数的大小。具体算法如下:的状态来判断两个有符号数的大小。具体算法如下: 若若X-Y为正数,则为正数,则 OV=0 时时 XY;OV=1 时时XY。 若若X-Y为负数,则为负数,则 OV=0 时时 XY。多重单分支结构举例多重单分支结构举例(散转程序散转程序)例例11 11 使用单片机的并行口使用单片机的并行口P1的输出功能来控制的输出功能来控制8个个LED的显示。的显示。当开关当开关K0接通接通2时,时,P3.4管脚接地,管脚接地,P3.4=0;当;当K0接通接通1时

19、,时,P3.4接接+5V,P3.4=1。同样,当开关。同样,当开关K1接通接通2时,时,P3.5管脚接管脚接地,地,P3.5=0;当;当K1接通接通1时,时,P3.5接接+5V,P3.5=1。假设要求P3口的开关状态对应的P1口的8个LED的显示方式如下:P3.5 P3.4显示方式0 0 全亮0 1 交叉亮1 0低四位亮,高四位灭1 1低四位灭,高四位亮8031.+5V4.7K4.7KP3.4P3.5K0K1121289C51+5VP1.7+5VP1.0.多重单分支结构举例多重单分支结构举例(散转程序散转程序) 开始读P3口的引脚状态A屏蔽掉A中无关位,并将相应位移到最低位修正A的值,A*2A

20、转移指令表基地址DPTR 结束散转指令显示方式1显示方式2显示方式3显示方式4 结束 结束 结束多重单分支结构举例多重单分支结构举例(散转程序散转程序)多重单分支结构举例多重单分支结构举例(散转程序散转程序)程序说明程序说明(1)MCS-51的四个I/O端口共有三种操作方式:输出数据方式,读端口数据方式和读端口引脚方式。输出数据方式举例:MOVP1,#00H ;输出数据00HP1端口锁存器P1引脚读端口数据方式举例:MOVA,P3 ;AP3端口锁存器读端口引脚方式举例:MOVP3,#0FFH ;P3口端口锁存器各位置1MOVA,P3;AP3端口引脚状态注意:读引脚方式必须连续使用两条指令,首先

21、必须使欲读的端口引脚所对应的锁存器置位,然后再读引脚状态。多重单分支结构举例多重单分支结构举例(散转程序散转程序)程序说明程序说明(2)散转指令是单片机指令系统中专为散转操作提供的无条件转移指令,指令格式如下:JMPA+DPTR;PCDPTR+A 一般情况下,数据指针DPTR固定,根据累加器A的内容,程序转入相应的分支程序中去,本例采用最常用的转移指令表法,就是先用无条件转移指令按一定的顺序组成一个转移表,再将转移表首地址装入数据指针DPTR中,然后将控制转移方向的数值装入累加器A中作变址,最后执行散转指令实现散转。由于无条件转移指令AJMP是两字节指令,因此控制转移方向的A中的数值为:A=0

22、 转向,AJMP ONE ;A=2 转向,AJMP TWO; A=4 转向,AJMPTHREE;A=6 转向 AJMP FOURDPTRTABLETWOONEAJMPTABLE+1TABLE+2TABLE+3TABLE+4TABLE+5TABLE+6TABLE+7AJMPAJMPAJMPTHREEFOURA=0A=2A=4A=6多重单分支结构举例多重单分支结构举例(散转程序散转程序)程序说明程序说明(3)三种无条件转移指令LJMP、AJMP和SJMP 的比较三种无条件转移指令在应用上的区别有以下三点:1)转移距离不同,LJMP可在64Kbytes范围内转移,AJMP指令可以在本指令取出后的2K

23、bytes范围内转移,SJMP的转移范围是以本指令为核心的-128+127bytes范围内转移;2)汇编后机器码的字节数不同,LJMP是三字节指令,AJMP和SJMP都是两字节指令。3)LJMP和AJMP都是绝对转移指令,可以计算得到转移目的地址,而SJMP是相对转移指令,只能通过转移偏移量来进行计算。 选择无条件转移指令的原则是根据跳转的远近,尽可能选择占用字节数少的指令。例如动态暂停指令一般都选用SJMP $,而不用LJMP $。 设X存在30H单元中,根据下式X+2 X0Y = 100 X=0 求出Y值,Y值存入31H单元。 X X0解:根据数据的符号位判别该数的正负,若最高位为0,再判别该数是否为0。练习练习参考程序如下:ORG 1000HMOV A,30H;

温馨提示

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

评论

0/150

提交评论