第四章 汇编语言程序设计
- 格式:docx
- 大小:55.62 KB
- 文档页数:17
汇编语⾔程序设计第4章汇编语⾔程序设计§4.1 汇编语⾔的模式⼀、汇编语⾔源程序的⼀般模式[Name 模块名][Title 标题][定义宏][定义数据段][定义附加段][定义堆栈段]定义代码段源程序结束中括号括起的部分可以省略,可见在⼀个汇编语⾔源程序中必须要定义代码段,并且必须有源程序结束指令。
⼆、8086汇编语⾔程序的⼀个例⼦Pg90。
§4.2 语句⾏的构成汇编语⾔中的语句⼀般分为两种类型:指令性语句和指⽰性语句。
指令性语句的格式为:[标号:] 助记符 [操作数1[,操作数2]] [;注释]指⽰性语句的格式为:[名称] 助记符 [参数1,参数2,……] [;注释]标号和名称都是编程⼈员根据需要和⼀定的规则任意取的。
也可以认为汇编语⾔的语句⾏是由标记和分隔符(空格)构成。
⼀、标记1.IBM宏汇编的字符集(1)字母(2)数字符(3)特殊字符2.界符⽤于定界⼀个标记的结束或⼀个标记的开始,本⾝具有⼀定的意义。
3.常量出现在汇编语⾔源程序中的固定值称为常量。
(1)数值常量①⼆进制:以字母B结束。
②⼗进制:以字母D或⽆字母结束。
③⼋进制:以字母Q(或O)结束。
④⼗六进制:以字母H结束。
(2)字符常量指⽤单引号或双引号引起的字符或字符串。
4.标识符由程序员⾃⼰建⽴的字符序列(标号或名称)。
⼀个标识符不能超过31个字符,不能以数字开头。
5.保留字汇编语⾔中具有特殊意义的字符序列。
6.注释⼀⾏中分号以后的部分。
⽤于对⼀段或⼀⾏程序进⾏说明,便于阅读和理解。
⼆、符号具有⼀定意义的字符序列。
1.寄存器名2.变量段属性、偏移属性、类型属性3.标号段属性、偏移属性、类型属性4.常数5.其它三、表达式由操作数和运算符组合⽽成的序列。
1.操作数(1)⽴即数(2)寄存器操作数(3)存储器操作数2.运算符(1)算术运算符+、-、*、/、MOD(求余)(2)逻辑运算符AND、OR、NOT、XOR(3)关系运算符EQ、NE、LT、LE、GT、GE结果为“假”时,返回0,结果为“真”时,返回⼆进制全1。
第四章汇编语言程序设计本章的汇编语言程序设计的主要容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。
(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。
在介绍之前,我们还是来学习汇编语言的一些基础知识)4.1 汇编语言程序设计概述1、计算机的汇编语言以助记符表示的指令,每一条指令就是汇编语言的一条语句。
(汇编语言程序设计实际上就是使用汇编指令来编写计算机程序。
汇编语言的语句有严格的格式要求)2、汇编语言的语句格式MCS-51汇编语言的语句格式表示如下:[<标号>]: <操作码> [<操作数>]; [<注释>]标号:指令的符号地址,有了标号,程序中的其它语句才能访问该语句。
①标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。
②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。
(同一个标号在程序中只能定义一次,不能重复定义;一条语句可以有标号,也可以没有标号,所以是否有标号,取决于程序中是否需要访问该语句。
)操作码:规定语句执行的操作容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。
操作数:给指令的操作提供数据或地址。
注释:是对语句或程序段的解释说明。
(在单片机中,这四个部分怎么加以区分呢?使用分界符)分界符(分隔符):用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。
冒号(:)用于标号之后空格()用于操作码和操作数之间逗号(,)用于操作数之间,分割两个以上的操作数分号(;)用于注释之前。
第四章汇编语言程序设计1、编程将片内40H~60H单元中的内容送到以3000H为首的存储区内。
答:MOV R1,#40HMOV R2,#21HMOV DPTR,#3000HL1: MOV A,@R1MOVX @DPTR,AINC R1INC DPTRDJNZ R2,L12、编程计算下列算式的程序(1)23H+45H+ABH+03H=MOV A,#23HADD A,#45HADD A,#0ABHXCH A,B ;溢出处理ADDC A,#00HXCH A,BADD A,#03H ;A中为结果低位,B中为高位(2)CDH+15H-38H-46H=MOV A,#0CDHADD A,#15HSUBB A,#38HSUBB A,#46H(3)1234H+8347H=MOV A,#34HADD A,#47HMOV 30H,AMOV A,#12HADDC A,#83HMOV 31,A ;30H存结果低位,31H存结果高位(4)AB123H-43ADCH=CLR CMOV A,#23HSUBB A,DCHMOV 30H,AMOV A,#0B1HSUBB A,#3AHMOV 31H,AMOV A,#0AHSUBB A,,#04HMOV 32H,A ;30H为低位,32H为高位3、设有两个4位BCD码,分别存放在23H、22H单元和33H、32H单元中,求他们的和,并送入43H、42H单元中(低位在低字节,高位在高字节)。
答: MOV A ,22HADD A ,32HMOV 42H ,AMOV A ,23HADDC A ,33HMOV 43H ,A4、略5、编程计算片内RAM 区50H ~59H 单元中数的平均值,结果存放在5AH 中。
答: MOV R0,#8MOV R1,#50HMOV A ,#00HL1: ADD A ,@R1INC R1DJNZ R0,L1MOV B ,#8DIV ABMOV 5AH ,A6、编写计算下式的程序。
设乘积和平方结果均小于255。
a 、b 值分别存在片外3001H 和3002H 单元中,结果存于片外3000H 单元中。
(1)⎪⎩⎪⎨⎧÷⨯=b a b a Y 25b a b a b a ><=,,,MOV DPTR ,#3001HMOVX A ,@DPTRMOV 30H ,A ;a 暂存30H 单元INC DPLMOVX A ,@DPTRCJNE A ,30H ,L1 ;是否a=bMOV A ,#25SJMP SAVE L1:JNC L2MOV B ,30HMUL ABSJMP SAVE L2:MOV B ,AMOV A ,30HDIV AB SAVE:MOV DPTR ,#3000H MOVX @DPRT ,A (2)⎪⎩⎪⎨⎧-++++=10)()(10)(222b a b a b a Y 10)(,10)(,10)(,222>+=+<+b a b a b aMOV DPTR,#3001HMOVX A,@DPTRMOV 30H,AINC DPTRMOVX A,@DPTRADD A,30HMOV B,AMUL AB ; (a+b)2MOV 31H,ACJNE A,#10,L1SJMP SAVEL1: JC L2CLR CSUBB A,#10SJMP SAVEL2: ADD A,#10SAVE: MOV DPTR,#3000HMOVC @DPTR,A7、设有两个长度均为15的数组,分别存放在以200H和210H为首地址的存储区中,试编程求其对应项之和,结果存放到以220H为首地址的存储区中。
答:MOV DPH,#02HMOV R1,#15MOV R2,#00H ;数组1首地址低位MOV R3,#10H ;数组2首地址低位MOV R4,#20H ;和首地址低位L1: MOV DPL,R2MOVX A,@DPTRMOV R1,AMOV DPL,R3MOVX A,@DPTRADD A,R1MOV DPL,R4MOVX @DTPR,AINC R2INC R3INC R4DJNZ R1,L1SJMP $8、设有100个无符号数,连续存放在以2000H为首地址的存储区中,试编程统计正数、负数和零的个数。
答:MOV 30H,#00H ;正数计数器MOV 31H,#00H ;负数计数器MOV 32H,#00H ;零计数器MOV DPTR,#2000HL4: MOVX A,@DPTRINC DPTRCJNE A,#0,L1INC 32HSJMP L2L1: JC L3INC 30HSJMP L2L3: INC 31HL2: DJNZ R1,L4SJMP $9、将片外数据存储器地址为1000H~1030H的数据块,全部搬迁到片内RAM 30H~60H中,并将原数据块区域全部清零。
答:MOV R0,#30HMOV R2,#31HMOV DPTR ,#1000HLP: MOVX A,@DPTRMOV @R0,AAND A,#00HMOVX @DPTR,AINC R0INC DPTRDJNZ R2,LPSJMP $10、试编写一子程序,是R1、R0指向的两个片外RAM连续单元中的高4位二进制数,合并成一个字节,装入累加器A中。
已知R0指向低地址,并要求该单元高四位放在A中高四位。
答:MOVX A,@R1ANL A,#0F0HSWAP AMOV R2,AMOVX A,@R0ANL A,#0F0HORL A,R211、试编程把以2040H为首地址的连续50个单元的无符号数按降序排列,存放到以3000H 为首地址的存储区中。
答:MOV R2,#50MOV R3,#20HMOV R4,#40H ;源地址MOV R5,#30HMOV R6,#00H ;目的地址SEND: MOV DPH,R3 ;SEND将2040H数据块移入3000H存储区MOVX A,@DPTRINC DPTRMOV R3,DPHMOV R4,DPLMOV DPH,R5MOV DPL,R6MOVX @DPTR,AINC DPTRMOV R5,DPHMOV R6,DPLDJNZ R2,SENDMOV R2,#49 ;重复次数CMP1: MOV DPTR,#3000HMOV R3,#49 ;比较次数CMP2: MOVX A,@DPTRMOV B,AINC DPTRMOVX A,@DPTRCJNE A,B,L1L1: JC NOMOVEMOV 30H,ACLR CMOV A,DPLSUBB A,#01HMOV DPL,AMOV A,30HMOVX @DPTR,AINC DPTRMOV A,BMOVX @DPTR,ANOMOVE: DJNZ R3,CMP2 ;50个数重复一遍?DJNZ R2,CMP1 ;排序结束?LJMP $12、试编一查表程序,从首地址为2000H,长度为100的数据块中找出ASCII码为A,将其地址送到20A0H和20A1H单元中。
答:MOV DPTR,#2000HMOV R2,#100GO_ON: MOVX A,@DPTRCJNE A,#41H,IFENDMOV A,DPHMOV B,DPLMOV DPTR,#20A0HMOVX @DPTR,AINC DPTRXCH A,BMOVX @DPTR,ASJMP OVERIFEND: INC DPTRDJNZ R2,GO_ONOVER: SJMP OVER13、设在200H~204H单元中,存放5个压缩BCD码,编程将他们转换成ASCII码,存放到以205H单元为首地址的存储区。
答:MOV R2,#05HMOV R3,#02HMOV R4,#00HMOV R5,#02HMOV R6,#05HCHLP: MOV DPH,R3MOV DPL,R4MOVX A,@DPTRINC DPTRMOV R3,DPHMOV R4,DPLMOV B,ASWAP AANL A,#0FHORL A,#30HMOV DPH,R5MOV DPL,R6MOVX @DPTR,AINC DPTRMOV A,BANL A,#0FHORL A,#30HMOVX @DPTR,AMOV R5,DPHMOV R6,DPLDJNZ R2,CHLP14、有一无符号数据块长度在30H单元中,其首地址为31H单元,求出数据块中最大值,并存入40H中。
答:MOV R0,#31HMOV R1,30HMOV 40H,#00HLOOP: MOV A,@R0CJNE A,40H,L1SJMP AGAINL1: JNC L2SJMP AGAINL2: MOV 40H,AAGAIN: INC R0DJNZ R1,LOOPSJMP $15、略16、在以2000H为首地址的存储区内,存放20个用ASCII码表示的0~9之间的数,试编程,将它们转换成BCD码,并以压缩BCD码的形式存在3000H~3009H单元中。
答:MOV R2,#10MOV R3,#20HMOV R4,#00HMOV R5,#30HMOV R6,#00HLP: MOV DPH,R3MOV DPL,R4MOVX A,@DPTRANL A,#0FHSWAP AXCH A,BINC DPTRMOVX A,@DPTRANL A,#0FHORL A,BINC DPTRMOV R3,DPHMOV R4,DPLMOV DPH,R5MOV DPL,R6MOVX @DPTR,AINC DPTRMOV R5,DPHMOV R6,DPLDJNZ R2,LPSJMP $17、试编程实现下列逻辑表达式功能。
设P1.7~P1.0为8个变量的输入端,而其中P1.7又作为变量的输出端。
;输入端定义X0 EQU P1.0X1 EQU P1.1X2 EQU P1.2X3 EQU P1.3X4 EQU P1.4X5 EQU P1.5X6 EQU P1.6X7 EQU P1.7(1)76543210X X X X X X X X Y +++=MOV C ,X0ANL C ,X1ANL C ,/X2ORL C ,X3MOV 00H ,CMOV C ,X4ANL C ,X5ANL C ,X6ORL C ,/X7ORL C ,00H MOV P1.7,C(2)76543210X X X X X X X X Y ++=MOV C ,X0ANL C ,X1CPL CMOV 00H ,CMOV C ,X2ANL C ,X3ANL C ,X4CPL CMOV 01H ,CMOV C ,X5ANL C ,X6ANL C ,X7CPL CORL C ,O1HCPL CORL C ,00HMOV P1.7,C18、略19、略20、试编写延时1s 、1min 、1h 子程序。