汇编语言程序设计.pptx
《汇编语言程序设计.pptx》由会员分享,可在线阅读,更多相关《汇编语言程序设计.pptx(86页珍藏版)》请在冰点文库上搜索。
![汇编语言程序设计.pptx](https://file1.bingdoc.com/fileroot1/2023-4/30/bbbbed65-4c41-4bcb-86d8-2f103bbd9cce/bbbbed65-4c41-4bcb-86d8-2f103bbd9cce1.gif)
计算机硬件技术基础计算机硬件技术基础汇编语言程序设计汇编语言程序设计第四章第四章主讲教师主讲教师赵晓安赵晓安计算机科学与软件学院计算机基础教学部计算机科学与软件学院计算机基础教学部本章重点本章重点教学目标:
教学目标:
本章内容是本章内容是软件编程的软件编程的关键,地位重要。
关键,地位重要。
程序结构(顺序、分支、循环、子程序);程序结构(顺序、分支、循环、子程序);应用实例;应用实例;熟练掌握程序设计的思路方法和技巧;熟练掌握程序设计的思路方法和技巧;要求掌握典型算法;要求掌握典型算法;找到分析问题和解决问题的着眼点;找到分析问题和解决问题的着眼点;学会抓住不同问题的规律性;学会抓住不同问题的规律性;举一反三,独立思考,有创意,有新意,独到。
举一反三,独立思考,有创意,有新意,独到。
一、将高级语言程序设计方法迁移到汇编语言程序设计中来一、将高级语言程序设计方法迁移到汇编语言程序设计中来二、分清可执行指令和非执行指令及其功能二、分清可执行指令和非执行指令及其功能三、特别注意汇编语言是面向机器的,要记住三、特别注意汇编语言是面向机器的,要记住CPU的资源;的资源;存储器结构与寻址方式;存储器结构与寻址方式;I/O口、定时口、定时/计数器、中断系统等关键的参数;计数器、中断系统等关键的参数;寄存器间接寻址中指针的选择和使用技巧。
寄存器间接寻址中指针的选择和使用技巧。
四、从宏观上看,四、从宏观上看,MCS-51汇编语言程序的整体结构汇编语言程序的整体结构从微观上看,微机中各组成部分是如何通过程序联系起从微观上看,微机中各组成部分是如何通过程序联系起来。
来。
汇编语言程序设计的要点:
汇编语言程序设计的要点:
4411汇编语言程序设计基础汇编语言程序设计基础442MCS-512MCS-51单片机汇编语言程序设单片机汇编语言程序设计计第四章汇编语言程序设计第四章汇编语言程序设计441111汇编语言指令的分类汇编语言指令的分类441122汇编语言的格式汇编语言的格式441133伪指令伪指令441144汇编语言源程序的汇编汇编语言源程序的汇编441155汇编语言程序设计的一般步汇编语言程序设计的一般步骤骤4411汇编语言程序设计基汇编语言程序设计基础础1汇编语言的指令类型汇编语言的指令类型MCS-51单片机汇编语言,包含两类不单片机汇编语言,包含两类不同性质的指令。
同性质的指令。
(1)可执行指令:
即指令系统)可执行指令:
即指令系统中的指令。
它们都是机器能够执行的指令,中的指令。
它们都是机器能够执行的指令,每一条指令都有对应的机器码。
每一条指令都有对应的机器码。
(基本指基本指令令)
(2)伪指令:
汇编时供汇编程)伪指令:
汇编时供汇编程序识别和执行的指令,用于在汇编过程中对序识别和执行的指令,用于在汇编过程中对数据的存储环境等实施的控制。
它们都是机数据的存储环境等实施的控制。
它们都是机器不执行的指令,无机器码。
器不执行的指令,无机器码。
(非执行指非执行指令)令)4.1.1汇编语言的指令分类汇编语言的指令分类4.1.2汇编语言的格式汇编语言的格式标号段:
LABEL操作码段OPCODE,操作数段OPRAND;注释段COMMENT22、可执行指令格式:
、可执行指令格式:
33、伪指令格式:
、伪指令格式:
或或标号:
标号:
定义符项表;注释定义符项表;注释名字定义符参数,名字定义符参数,参数;注释,参数;注释汇编语言一般由四部分组成。
汇编语言一般由四部分组成。
1标号段标号段标号段位于语句的开头,指明标号所在指令的标号段位于语句的开头,指明标号所在指令的首地址,标号又称为标号地址或符号地址,是一个可选首地址,标号又称为标号地址或符号地址,是一个可选项,只有需要时才设置。
项,只有需要时才设置。
由英文字母开头,不能超过由英文字母开头,不能超过8个字符;个字符;绝对不允许把指令的保留字、寄存器号及伪指令字绝对不允许把指令的保留字、寄存器号及伪指令字符作为语句的标号;符作为语句的标号;同一标号在同一程序单位中只能出现一次。
同一标号在同一程序单位中只能出现一次。
2、操作码段操作码段操作码段可以是可执行指令的助记符,操作码操作码段可以是可执行指令的助记符,操作码段用于指示计算机进行何种操作,因此,是任何一条段用于指示计算机进行何种操作,因此,是任何一条语句中的必选项,汇编语言根据这一字段生成目标代语句中的必选项,汇编语言根据这一字段生成目标代码。
码。
操作码段也可以是伪指令的定义符,对汇编程操作码段也可以是伪指令的定义符,对汇编程序下命令,在汇编时起作用。
序下命令,在汇编时起作用。
LOOP:
MOVA,R0DJNZR2,LOOP3、操作数段、操作数段操作数段用于存放指令的操作数或操作数地址操作数段用于存放指令的操作数或操作数地址,操作数操作数的个数因指令的不同而不同,通常有三种情况:
的个数因指令的不同而不同,通常有三种情况:
无操作数无操作数RET单操作数单操作数JCLOOP双操作数双操作数MOVA,B操作数有操作数有5种表示形式种表示形式:
(1)操作数是立即数操作数是立即数,可用二进制、十进制和十六进制形式可用二进制、十进制和十六进制形式
(2)作寄存器、寄存器间址和特殊功能寄存器名作寄存器、寄存器间址和特殊功能寄存器名MOVA,PSW(3)直接地址、标号地址直接地址、标号地址DJNZR7,NEXT(4)带加、减运算符的表达式,例:
带加、减运算符的表达式,例:
MOVA,#100-1(5)$符号符号4、注释段:
注释指令或程序的含义,便于阅读程序、维护程序。
注释段:
注释指令或程序的含义,便于阅读程序、维护程序。
必须用“;”隔开,续行时,也必须以“;”开头。
必须用“;”隔开,续行时,也必须以“;”开头。
441133伪指令伪指令定义:
定义:
在机器汇编时供汇编程序识别和执行的指令,用来对汇编过程进行某种控制,或对符号、标号赋值,在汇编时不产生目标代码。
起始汇编伪指令:
起始汇编伪指令:
ORG结束汇编伪指令:
结束汇编伪指令:
END定义字节伪指令:
定义字节伪指令:
DB定义字伪指令:
定义字伪指令:
DW定义位伪指令:
定义位伪指令:
BIT赋值伪指令:
赋值伪指令:
EQUDATA汇编起始伪指令汇编起始伪指令格式:
格式:
ORG16位地址位地址功能:
功能:
指定汇编源程序编译成机器语言程序指定汇编源程序编译成机器语言程序的起始地址的起始地址例如:
例如:
ORG1000HStart:
MOVA,#5AHSJMP$END程序中可以有多条程序中可以有多条ORG语句,但定义的起始地址语句,但定义的起始地址既不要交叉,也不要重叠既不要交叉,也不要重叠。
必须从小地址向大地址分必须从小地址向大地址分配程序所占空间。
配程序所占空间。
74H74H5AH5AHROMROM单元单元1000H1000H1001H1001H汇编结束伪指令汇编结束伪指令格式:
格式:
标号标号:
END功能:
停止汇编功能:
停止汇编示例:
示例:
ORG0000HLjmp0100HLjmp0100HORG0100HORG0100HStart:
movA,#5AhStart:
movA,#5Ahsjmp$sjmp$ENDEND一个源程序可以包含主程一个源程序可以包含主程序和若干个子程序,但在序和若干个子程序,但在程序最后必须有且只能有程序最后必须有且只能有一条一条ENDEND指令。
指令。
注意:
注意:
定义字节伪指令定义字节伪指令格式:
格式:
DBDB功能:
把项或项表的数值存入从标号开始的连续单元,其功能:
把项或项表的数值存入从标号开始的连续单元,其中项或项表可以是一个中项或项表可以是一个88位二进制数或多个用逗号隔开位二进制数或多个用逗号隔开的的88位二进制数,位二进制数,88位二进制数可以是二进制、十进制位二进制数可以是二进制、十进制、十六进制或以引号括起来的字符串。
、十六进制或以引号括起来的字符串。
该指令只能为程序存储器赋该指令只能为程序存储器赋初值。
初值。
注意:
注意:
1000H11HFFH41H42H程序存储器程序存储器43H44H补码补码ASCII码码ORG1000HDat:
DB11h,-1,A,BCDEND定义字伪指令定义字伪指令格式:
格式:
DWDW功能:
功能:
把项或项表的数值存入从标号开始的连把项或项表的数值存入从标号开始的连续单元,其中项或项表是一个字续单元,其中项或项表是一个字(两字节两字节),1616位二进制数。
位二进制数。
ORG1000HDat:
DW1122h,3344h,-1END1000H11H22H33H44H程序存储器程序存储器只对程序存储器起作用只对程序存储器起作用FFHFFH定义位伪指令定义位伪指令格式:
符号名格式:
符号名BITBIT位地址位地址功能:
给位地址定义一个符号名功能:
给位地址定义一个符号名UBIT20H.0VBIT20H.1WBIT20H.2XBITP1.0YBITP2.4ZBITP3.2QBITTCON.2注意:
注意:
符号名不可以是助记符,符号名不可以是助记符,也不可以是寄存也不可以是寄存器名。
器名。
例:
例:
Abitp1.0是不可以的是不可以的赋值伪指令赋值伪指令格式:
符号名格式:
符号名EQUEQU数据数据功能:
给符号名赋值功能:
给符号名赋值XEQU05HYEQU06HNEXTEQU2000H注意:
“符号名”必须先赋值后使用;注意:
“符号名”必须先赋值后使用;在程序它即可作为数据,也可作为地在程序它即可作为数据,也可作为地址;址;所赋的值既可是所赋的值既可是8位的,也可是位的,也可是16位的。
位的。
赋值伪指令赋值伪指令格式:
符号名格式:
符号名DATADATA表达式表达式功能:
给符号名赋值(功能:
给符号名赋值(88位)位)ONEDATA30H(数据或地址)(数据或地址)TWODATAONE+1格式:
符号名格式:
符号名XDATAXDATA表达式表达式功能:
给符号名赋值(功能:
给符号名赋值(1616位)位)DATA(XDATA)DATA(XDATA)与与EQUEQU伪指令功能相似,不同之处为伪指令功能相似,不同之处为:
EQUEQU必须必须“先定义后使用,而先定义后使用,而DATA(XDATA)DATA(XDATA)没没此规定。
此规定。
441144汇编语言源程序的汇编汇编语言源程序的汇编汇编可分成两种:
汇编可分成两种:
人工汇编人工汇编机器汇编机器汇编机器汇编是用机器自动把汇编语言源程序翻译成可以运行机器汇编是用机器自动把汇编语言源程序翻译成可以运行的目标代码程序,即二进制程序的过程,它是一种用机器来代替人的目标代码程序,即二进制程序的过程,它是一种用机器来代替人脑的汇编,完成这一汇编过程的软件称为“汇编程序”。
脑的汇编,完成这一汇编过程的软件称为“汇编程序”。
汇编汇编机器语言目标程序机器语言目标程序汇编语言源程序汇编语言源程序汇编程序汇编程序汇编汇编机器语言目标程序机器语言目标程序汇编语言源程序汇编语言源程序人工查指令机器码表人工查指令机器码表441144程序设计的方法程序设计的方法结构化设计结构化设计模块化设计模块化设计开发方法开发方法自底向上开自底向上开发发先底层开先底层开发发自顶向下开自顶向下开发发先顶层开先顶层开发发混合方法混合方法底底顶顶441166汇编语言程序设计的一般步骤汇编语言程序设计的一般步骤分析题目,确定算法分析题目,确定算法根据算法画出流程图根据算法画出流程图根据流程图编写程序根据流程图编写程序上机汇编和调试,排除错误上机汇编和调试,排除错误流程图图例流程图图例起止框起止框处理框处理框判断框判断框连线连线开始结束XX+1YY-1F5?
YN程序设计步骤流程图程序设计步骤流程图442211简单程序设计简单程序设计442222分支程序设计分支程序设计442233循环程序设计循环程序设计442244运算程序设计运算程序设计442255查表程序设计查表程序设计442266散转程序设计散转程序设计442277子程序设计子程序设计442MCS-512MCS-51单片机汇编语言程序设计单片机汇编语言程序设计442211简单程序设计简单程序设计语句1语句2语句n结束特点:
从第一条指令开始依次特点:
从第一条指令开始依次执行每一条指令,直到程序执行完执行每一条指令,直到程序执行完毕,中间没有转移指令,没有分支毕,中间没有转移指令,没有分支。
只有一个入口一个出口。
只有一个入口一个出口。
入口入口出口出口ORG1000HMOVR0,#30HMOVA,R0ANLA,#0FHORLA,#30HINCR0MOVR0,AMOVA,30HANLA,#0F0HSWAPAORLA,#30HINCR0MOVR0,ASJMP$END1、例例43两位压缩的两位压缩的BCD码转换成相应的码转换成相应的ASCII码码存储存储两位压缩的两位压缩的BCD码指两位码指两位BCD数占一个单元数占一个单元,相应的相应的ASCII码占二码占二个单元个单元算法算法1ANL拆字、拆字、ORL#30H拼字拼字算法算法2DIV拆字、拆字、ADD#30H拼字拼字8630H30H3631H31H3832H32HR0R02、例例44将将8位无符号二进制数转换成三位位无符号二进制数转换成三位BCD码码存储存储8位无符号二进制数占一个单元位无符号二进制数占一个单元,个位、十位和百位各占一个个位、十位和百位各占一个单元单元算法算法1DIV100得百位,再得百位,再DIV10的十位和个位的十位和个位ORG2000HBAIDATA32HSHIDATA31HGEDATA30HMOVA,40HMOVB,#100DIVABMOVBAI,AMOVA,BMOVB,#10DIVABMOVSHI,AMOVGE,BSJMP$END算法算法2DIV10的个位,再的个位,再DIV10的十位和百位的十位和百位01H30H30H0231H31H0632H32H12640H40H条件满足?
ANY(a)条件满足?
ABYN(b)(c)A0A1AnK=0K=1K=nK=?
分支程序结构流程图分支程序结构流程图11分支程序的三种基本形式分支程序的三种基本形式入口入口出口出口入口入口入口入口出口出口出口出口4.2.2分支程序设计分支程序设计
(1)先建立可供条件转移指令测试的条件。
)先建立可供条件转移指令测试的条件。
(2)选用合适的条件转移指令。
)选用合适的条件转移指令。
(3)在转移的目标地址处设定标号。
)在转移的目标地址处设定标号。
2.分支程序的设计要点分支程序的设计要点根据不根据不同的条件,执行不同的条件,执行不同的程序段。
同的程序段。
JZ、JNZ、JC、JNC、JB、JNB、JBC、CJNE、DJNZ正确合理地运用正确合理地运用1)用条件转移语句实现二分支用条件转移语句实现二分支条件语句组1语句组2YesNo入口出口条件语句组YesNo入口出口举例举例movA,R0JnzL1L1:
movR1,AL2:
sjmp$endy=xx0xx0开始结束yxx0?
NY(R0)x(R1)y判零判零分支间分支间隔离隔离sjmpL2movA,R0JzL1movR1,AsjmpL2L1:
movR1,#0L2:
sjmp$endy=(R0)x(R1)y举例举例0x=0x0x=0xx0x0开始结束yxy0x=0?
NYY判零判零分支间分支间隔离隔离实现三分支举例实现三分支举例movA,R0JzL2JnbACC.7,L1movR1,#0FFhsjmpL3L1:
movR1,#01hsjmpL3L2:
movR1,#0L3:
sjmp$endy=开始结束y0y-1y+1x=0?
x0?
YYNN(R0)x(R1)y判正负判正负判零判零分支间隔离000011xxx2)用用cjne与与jc/jnc配合实现三分支配合实现三分支Cjne编程要点:
编程要点:
1、两个无符号数比较、两个无符号数比较1)两数相等)两数相等=,顺序执行;,顺序执行;2)两数不等于则转移;判)两数不等于则转移;判c
(1)用)用jc指令判小于指令判小于2、如何实现?
、如何实现?
Cjne指令实现三分支流程图指令实现三分支流程图1?
Cy=0?
语句组1语句组2语句组3入口YesYesNoNoCJNE出口或CY=1?
JCJNCCjne指令实现三分支流程图指令实现三分支流程图2?
Cy=0?
语句组2语句组3入口YesYesNoNoCJNE出口或CY=1?
JC小于等于JNC?
Cy=0?
语句组2语句组3入口YesYesNoNoCJNE出口或CY=1?
JCJNCCjne指令实现三分支流程图指令实现三分支流程图3大于等于大于等于用用cjnecjne实现三分支实现三分支cjneR0,#0,L1movR1,#0sjmpL3L1:
movA,R0jnbACC.7,L2movR1,#0FFhsjmpL3L2:
movR1,#01hL3:
sjmp$endy=开始结束y0y-1y+1x=0?
x0?
YYNN(R0)x(R1)yJNCL2判正负判正负判零判零分支间隔离000011xxxy=(R0)x(R1)y22、判正负、判正负CJNER0,#0,NZEROCLRCMOVA,R0SUBBA,#0JZZEROMOVA,R0JZZERO其它方法?
其它方法?
分析:
分析:
11、判零、判零MOVA,R0JNBACC.7,positiveCJNER0,#7FH,DO1SJMPpositiveDO1:
JCpositive;negativePositive:
.0FFH80Hnegative00H7FHpositive017fh80h0ffh017fh80h0ffh正数正数负数负数补码补码表示表示000011xxxORG1000HONEDATA30HTWODATA31HMAXDATA32HCLRCMOVA,ONESUBBA,TWOJZXMAXJBACC.7,NEGJBOV,YMAXSJMPXMAXNEG:
JBOV,XMAXYMAX:
MOVA,TWOSJMPRMAXXMAX:
MOVA,ONERMAX:
MOVMAX,ASJMP$END例例46ONE和和TWO单元中的两个带符号数比较大小,将较大单元中的两个带符号数比较大小,将较大者存入者存入MAX单元中。
两数相等则任一个存入单元中。
两数相等则任一个存入MAX即可。
即可。
若若XY差的符号位为差的符号位为1,则则OV=0,XY若若XY差的符号位为差的符号位为0,则则OV=0,XY;OV=1,XYP108passpass442233循环程序设计循环程序设计循环程序通常有两种编制方法循环程序通常有两种编制方法循环结构程序的组成循环结构程序的组成循环程序结构循环程序结构循环问题的类型循环问题的类型循环程序设计举例循环程序设计举例1、先循环处理后循环控制,称为直到型循环、先循环处理后循环控制,称为直到型循环;2、先循环控制后循环处理,称为当型循环。
先循环控制后循环处理,称为当型循环。
1.1.循环程序通常有两种编制方法循环程序通常有两种编制方法循环体循环体循环体循环体2、循环结构程序的组成、循环结构程序的组成循环初始化:
循环控制变量的初始化、循环初始化:
循环控制变量的初始化、工作寄存器、数据变工作寄存器、数据变量的初始化量的初始化循环处理部分:
循环体,重复执行的部分循环处理部分:
循环体,重复执行的部分循环控制部分:
循环体,修改循环变量、控制循循环控制部分:
循环体,修改循环变量、控制循环的执行环的执行循环结束处理部分:
这部分程序用于存放执行循循环结束处理部分:
这部分程序用于存放执行循环程序所得结果以及恢复各单元的初值。
环程序所得结果以及恢复各单元的初值。
33循环程序的结构循环程序的结构循环程序按结构形式,有单重循环与多重循环。
循环程序按结构形式,有单重循环与多重循环。
在多重循环中,只允许外重循环嵌套内重循环。
在多重循环中,只允许外重循环嵌套内重循环。
不允许循环相互交叉,也不允许从循环程序的外部不允许循环相互交叉,也不允许从循环程序的外部跳入循环程序的内部。
跳入循环程序的内部。
外循环外循环中循环中循环内循环内循环外循环外循环内循环内循环外循环外循环内循环内循环内循环内循环(a)嵌套正)嵌套正确确(b)嵌套正)嵌套正确确(c)交叉不正确)交叉不正确循环问题的类型循环问题的类型11、计数型、计数型循环次数已知,循环次数已知,用计数方法控制用计数方法控制循环的终止。
循环的终止。
22、条件型、条件型循环次数未知,循环次数未知,根据某种条件判断根据某种条件判断是否终止循环。
是否终止循环。
33、计数型、计数型+条件型条件型11、单循环、单循环22、多重循环、多重循环例例4477内部内部RAMRAM块传块传,遇到遇到“#”字符结束。
字符结束。
例例33:
50ms50ms延时程序延时程序例例448803188031外部外部RAMRAM中中数据的冒泡排序法数据的冒泡排序法循环程序设计举例循环程序设计举例例例1:
内部数据区清零内部数据区清零例例4477内部内部RAMRAM块传,块传,数据块长度已知数据块长度已知内部RAM23H98H0A8H0FDH例例11:
内部数据区清零:
内部数据区清零ORG0000HZero:
movR0,#30HmovR7,#10movA,#00HLoop:
movR0,AincR0djnzR7,Loopsjmp$END30HR023H98H0A8H0FDH00000010个个计数型计数型单循环程序举例单循环程序举例例例3:
50ms延时程序延时程序Delay:
movR7,#200Del1:
movR6,#123nopDel2:
djnzR6,Del2djnzR7,Del1sjmp$;(不计不计入入);1机器周期机器周期;1机器周期机器周期;1机器周期机器周期;2机器周期机器周期;2机器周期机器周期T=200(1+1+1232+2)+11us=50001us=50ms例例47把内部把内部RAM中起始地址为中起始地址为BLK1的数据块传送到外部的数据块传送到外部RAM以以BLK2为为起始地址的区域,数据块长度在起始地址的区域,数据块长度在R1中。
中。
参考程序如下:
参考程序如下:
ORG2000HBLK1EQU30HBLK2EQU1000HNEQU100MOVR0,#BLK1;BLK1数据块起始地址数据块起始地址MOVDPTR,#BLK2;BLK2数据块起始地址数据块起始地址MOVR1,#N;块长度块长度XH:
MOVA,R0;取数据;取数据MOVXDPTR,A;数据传送;数据传送INCR0INCDPTRDJNZR1,XH;循环控制;循环控制计数计数STOP:
SJMP$END计数型计数型增加增加例例47把内部把内部RAM中起始地址为中起始地址为BLK1的数据块传送到外部的数据块传送到外部RAM以以BLK2