第四章--汇编语言程序设计
汇编语言程序设计

汇编语⾔程序设计第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章 汇编语言程序设计
例4.4 显示两位压缩BCD码值(00~99) ,要求不显示前导0。 本例一方面要排除前导0的情况,另一方面 对于全0情况又必须显示一个0,所以形 成了两个双分支结构的程序。
第4章 汇编语言程序设计 DATA SEGMENT BCD DB 04H ; 给出一个BCD码数据 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA BEGIN: MOV AX, DATA MOV DS, AX MOV DL,BCD ;取BCD码 TEST DL,0FFH ;如果这个BCD码是0,则显示为0 JZ ZERO TEST DL,0F0H ;如果这个BCD码高位是0,不显示 JZ ONE MOV CL,4 ;BCD码高位右移为低位 SHR DL,CL OR DL,30H ;转换为ASCII码 MOV AH,2 ;显示 INT 21H
第4章 汇编语言程序设计 ADC MOV MOV MUL ADD DX,0 W+4,DX AX,A B+2 W+2,AX ;部分积2的高16位与进位相加 ;结果保存到从W+4开始的内存单元 ;取被乘数的低16位 ;与乘数的高16位相乘,得到部分积3 ;部分积3的低16位与W+2开始的内存单元相加 ;结果保存在从W+2开始的内存单元 ;部分积3的高16位与W+4开始的内存单元及 ;进位相加,结果保存在从W+4开始的内存单元 ;把进位值保存在从W+6开始的内存单元 ;取被乘数的高16位 ;与乘数的高16位相乘,得到部分积4 ;部分积4的低16位与W+4开始的内存单元相加 ;结果保存在从W+4开始的内存单元 ;部分积4的高16位与W+6开始的内存单元及 ;进位相加,结果保存在从W+6开始的内存单元
第4章 汇编语言程序设计

因此, 因此,对例子中的存储器地址作如下运 算: SUM+2 CYCLE-5 NOT_DONE-GO 是有效的表达式。 是有效的表达式。而 SUM-CYCLE
(2)逻辑运算符 逻辑运算符是按位操作的AND、OR、 、 逻辑运算符是按位操作的 、 XOR和NOT。 和 。 1010 1010 1010 1010B AND 1100 1100 1100 1100B=1000 1000 1000 1000B 1100 1100 1100 1100B OR 1111 0000 1111 0000B=1111 1100 1111 1100B NOT 1111 1111 1111 1111B=0000 0000 0000 0000B
ASSUME CS:MY_CODE, ;规定 和DS 规定CS和 : 的内容 DS:MY_DATA : PORT_VA1 EQU 3 ;端口的符号名 GO: MOV AX, MY_DATA ;DS : 初始化为MY_DATA 初始化为 MOV DS, AX MOV SUM, 0 ;清SUM单元 单元
变量可以具有以下几种寻址方式: 变量可以具有以下几种寻址方式: ① 直接寻址 ② 基址寻址 变址(索引) ③ 变址(索引)寻址 ④ 基址变址寻址
2.运算符(Operators) .运算符( ) 算术运算符( Operators) ① 算术运算符(Arithmetic Operators) 逻辑运算符( Operators) ② 逻辑运算符(Logical Operators) 关系运算符( Operators) ③ 关系运算符(Relational Operators) 分析运算符( Operators) ④ 分析运算符(Analytic Operators) 合成运算符( Operators) ⑤ 合成运算符(Synthetic Operators)
四章汇编语言程序设计ppt课件

ENDS,ASSUME,END ,…. 保留字:SEGMENT ENDS OFFSET SIZE DB
DW DD MOV PUSH ADD SUB MUL DIV INC DEC LOOP PROC ENDP CALL RET END
类别名
CODE、DATA、STACK(同名同类别段连续存放)
第4章 汇编语言程序设计
伪操作命令之三:段定义伪指令
段寄存器说明伪指令ASSUME
ASSUME 段寄存器名:段名[段寄存器名:段名[…..]]
例:
CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
MAIN:
……
CODE ENDS ENDS MAIN
;指定第一条要执行的指令标号
注:1、该伪指令用于明确用SEGMENT定义的段的类型, 使编译程序能生成目标代码程序。
2、在源程序中,该伪操作放在可执行程序的前面。 3、该指令没有给段寄存器赋予实际的初值。这项工作要通
过写指令来完成,其中代码段不需要赋值。
+、-、*、/、MOD、SHL、SHR 都可应用于数字运算。 +、- 可以用于表示存储器操作数的地址,或两个存储器
单元(同一段内)的地址偏移量之差。 例:SUM - 2
CYCLE - GO
第4章 汇编语言程序设计
运算符之二:逻辑运算符
AND、OR、XOR、NOT 按位的逻辑运算 例:IN AL,PORT_VAL
DATA2 DB 0C1H,36H,9EH,0D5H,20H;加数
DATA ENDS;数据段结束
CODE SEGMENT;定义代码段
第四章-汇编语言程序的设计

第四章汇编语言程序设计本章的汇编语言程序设计的主要容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。
(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。
在介绍之前,我们还是来学习汇编语言的一些基础知识)4.1 汇编语言程序设计概述1、计算机的汇编语言以助记符表示的指令,每一条指令就是汇编语言的一条语句。
(汇编语言程序设计实际上就是使用汇编指令来编写计算机程序。
汇编语言的语句有严格的格式要求)2、汇编语言的语句格式MCS-51汇编语言的语句格式表示如下:[<标号>]: <操作码> [<操作数>]; [<注释>]标号:指令的符号地址,有了标号,程序中的其它语句才能访问该语句。
①标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。
②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。
(同一个标号在程序中只能定义一次,不能重复定义;一条语句可以有标号,也可以没有标号,所以是否有标号,取决于程序中是否需要访问该语句。
)操作码:规定语句执行的操作容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。
操作数:给指令的操作提供数据或地址。
注释:是对语句或程序段的解释说明。
(在单片机中,这四个部分怎么加以区分呢?使用分界符)分界符(分隔符):用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。
冒号(:)用于标号之后空格()用于操作码和操作数之间逗号(,)用于操作数之间,分割两个以上的操作数分号(;)用于注释之前。
单片机应用技术(第三版)第四章汇编语言程序设计课件

第4章 汇编语言程序设 计 实训4 信号灯的控制2
4.1 概述 4.2 简单程序设计 4.3 分支程序设计 4.4 循环程序设计 4.5 查表程序 4.6 子程序设计与堆栈技术 本章小结 习题4
第4章 汇编语言程序设计
实训4 信号灯的控制2
1. 实训目的 (1) 掌握汇编语言程序的基本结构。 (2) 了解汇编语言程序设计的基本方法和思路。 2. 实训设备与器件 (1) 实训设备:单片机开发系统、微机等。 (2) 实训器件与电路:参见实训1电路图。 3. 实训步骤与要求 (1) 运行程序1,观察8个发光二极管的亮灭状态。
ORG 0000H ;程序从地址0000H开始存放
START: MOV P1,#00H
;把立即数00H送P1口,点亮
;所有发光二极管
ACALL DELAБайду номын сангаас ;调用延时子程序
MOV P1,#0FFH
;灭掉所有发光二极管
第4章 汇编语言程序设计
(2) 在单片机开发调试环境中,将内部RAM的20H单元内
容修改为00H,运行程序2,观察8个发光二极管的亮灭状态;
重新将内部RAM的20H单元内容修改为80H,再次运行程序2,
观察8个发光二极管的亮灭状态。
(3) 运行程序3,观察8个发光二极管的亮灭状态。
程序1:所有发光二极管不停地闪动。
第4章汇编语言程序设计课件

29
MASTERLI
‘H’‘E’‘L’‘L’‘O’
例2:操作数可以是字符串MASTERLI DB ‘HELLO’汇编后如下:
注意下面的不同DB ‘AB’41 ‘A’ 42 ‘B’
‘AB’‘B’ ‘A’
42
41
DW
30
例3:ABC DB 0, 1, ?, ?, ?LPI DW ?, 54, ? 汇编后如下图示:
第4章 汇编语言程序设计4.1 汇编语言源程序机器语言—用二进制来表示指令和数据。B0 64 什么意思?这就是机器语言。既不直观, 又不易理解和记忆。MOVAL,64H ;大家很清楚,这就是助记符。助记符—反映指令的功能和主要特征,便于人们 理解和记忆。
1
指令除了操作码以外,还有一个操作数问题。操作数可能放在存储器中,这就涉及一个地址问 题。程序中遇到转移指令或调用指令,涉及地址转 移,若采用具体地址就不很方便,一旦有错,改动就 很麻烦。于是人们采用标号或符号来代替地址,例:LP1: …┇LOOP LP1汇编语言 是用助记符、符号地址以及标号等符号 书写的程序。用汇编语言编写的程序叫源程序。
18
(3) 关系运算符EQ(相等),NE(不等),LT(小于),GT(大于), LE(小于或等于),GE(大于或等于)。关系运算符的两个操作数必须都是数字或者是 同一段内的两个存储器地址。关系为真,结果为0FFFFH;关系为假,结果为0。例:MOV BX, PORT_VAL GE 5若PORT_VAL的值大于等于5,则汇编后为:MOV BX, 0FFFFH若PORT_VAL的值小于5,则汇编后为:
(4) 取值运算符和属性运算符:分析和规定存储器的属性。
20
若BUFFER1存储区是用如下伪指令定义的: BUFFER1 DB 100 DUP(?)则 TYPE BUFFER1等于1。
第4章-汇编语言程序设计

*
目标文件中的段与目标存储器之间的关系:
目标文件
目标存储器
.bss
.data
.text
RAM
E2PROM
ROM
第4章 汇编语言程序设计
*
3. 段定义伪指令
汇编器对段的处理是通过段伪指令来区别各个段的,并将段名相同的语句汇编在一起。 汇编器有5条伪指令可识别汇编语言程序的各个部分:
;初始化数据段 ;3组数据放入.data段 ;在.bss段保留10个单元 ;0123h放入.data段 ;初始化文本段 ;1字指令 ;2字指令 ;2字指令
;初始化数据段 ;3组数据放入.data段
第4章 汇编语言程序设计
*
汇编语言源程序:
链接器能够读/写所有类型的COFF文件,默认时链接器生成的是COFF2文件,采用-vn链接选项可以选择不同类型的COFF文件。
第4章 汇编语言程序设计
*
4.2.1分段结构 所谓“段”就是在存储器映像中占据连续空间的一段独立的代码或数据。每个目标文件都分成若干段。
COFF目标文件包含以下三个默认的段: .text 段:通常内含可执行代码; .data段:通常内含已初始化数据; .bss段:是为没有初始化的数据保留空间的。
第4章 汇编语言程序设计
*
C源文件
C编译器
汇编 源文件
汇编器
汇编 源文件
COFF 目标文件
链接器
可执行的 COFF文件
宏源文件
存档器
宏库
存档器
目标 文件库
建库工具
运行时 支持库
EPROM 编程器
交叉引用 列表器
调试工具
绝对地址 列表器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章汇编语言程序设计1编程将片内40H〜60H单元中的内容送到以3000H为首的存储区内。
答:MOV R1,#40HMOV R2,#21HMOVDPTR,#3000HL1:MOVA,@R1MOVX@DPT,R AINCR1INC DPTRDJNZ R2,L12、编程计算下列算式的程序1) 23H+45H+ABH+03H=MOV A,#23HADDA,#45HADDA,#0ABHXCH A,B;溢出处理ADDCA,#00HXCH A,BADDA,#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、略答: MOV R0, #8MOV R1, #50HMOV A , #00HL1: ADD A , @R1INC R1DJNZ R0, L1MOV B , #8DIV ABMOV 5AH , A6、编写计算下式的程序。
设乘积和平方结果均小于 255。
a 、b 值分别存在片外3002H 单元中,结果存于片外 3000H 单元中。
25 ,a b1)Y a b ,a ba b ,a bMOV DPTR , #3001HMOVX A , @DPTRMOV 30H , A ;a 暂存30H 单元INC DPLMOVX A , @DPTRCJNE A , 30H , L1 ;是否 a=bMOV A , #25SJMP SAVEL1: JNC L2MOV B , 30H5、编程计算片内 RAM 区 50H H 59H 单元中数的平均值,结果存放在 5AH 中。
3001H 和MUL ABSJMP SAVEL2:MOV B,AMOV A,30HDIV ABSAVE:MOV DPTR,#3000HMOVX@DPR,T A(a b) 2 10,(a b)210(2)Y(a b)2,(a b)210 (a2b) 2 10,(a b)210MOV DPTR,#3001HMOVX A,@DPTRMOV30H,AINC DPTRMOVX A,@DPTRA,30HADDMOV B,A(a +b)2MUL AB;MOV31H,ACJNE A,#10,L1SJMP SAVEL1:JC L2CLR CSUBB A,#10SJMP SAVE7、设有两个长度均为 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 @DTP ,R AINC R2INC R3INC R4DJNZ R1, L1SJMP $数和零的个数。
SAVE: MOV DPTR ,#3000HMOVC @DPT ,R AL2: ADD A ,#10答: MOV 30H , #00H ;正数计数器8、设有 100 个无符号数,连续存放在以 2000H 为首地址的存储区中,试编程统计正数、负MOV31H,#00H;负数计数器MOV32H,#00H;零计数器MOVDPTR,#2000HMOVR1,#100L4:MOVX A,@DPTRINC DPTRCJNEA,#0,L1INC32HSJMP L2L1:JCL3INC30HSJMP L2L3:INC31HL2:DJNZR1,L4SJMP$9、将片外数据存储器地址为1000H〜1030H的数据块,全部搬迁到片内并将原数据块区域全部清零。
答:MOV R0,#30HMOVR2,#31HMOVDPTR,#1000HLP:MOVX A,@DPTRMOV@R,0 AANDA,#00HMOVX@DPT,R AINC R0RAM 30H〜60H 中,DJNZR2, 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为首地址的存储区中。
INCDPTR 答: MOV R2, #50 MOV R3, #20H MOV R4, #40H MOV R5, #30H MOV R6, #00H MOV DPH , R3 MOV DPL , R4 MOVX A , @DPTR INCDPTR MOV R3, DPH SEND: ;源地址;目的地址 ;SEND 各2040H 数据块移入3000H 存储区MOV MOV MOV R4,DPL DPH,R5 DPL,R6MOVX@DPT,R 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 NOMOVEMOV30H,ACLR CMOV A,DPLSUBB A,#01HMOV DPL,AMOV A,30HMOVX@DPT,R AINC DPTRMOV A , BMOVX @DPT ,R ANOMOVE: DJNZ R3, CMP2 ; 50 个数重复一遍?DJNZ R2, CMP1 ;排序结束?LJMP $12、试编一查表程序,从首地址为 2000H,长度为100的数据块中找出 ASCII 码为A,将其 地址送到 20A0H 和20A1H 单元中。
13、设在200H 〜204H 单元中,存放5个压缩BCD 码,编程将他们转换成ASCII 码,存放到 以205H 单元为首地址的存储区。
答: MOV R2, #05HMOV R3, #02H 答: MOV MOV GO_ON: MOVX CJNE MOVMOVMOV MOVX INC XCH MOVX SJMP IFEND: INC DJNZ OVER: SJMP DPTR , #2000HR2, #100A , @DPTRA , #41H ,IFENDA , DPHB , DPLDPTR , #20A0H@DPT ,R ADPTRA , B@DPT ,R AOVERDPTRR2, GO_ONOVERMOV R4,#00H MOV R5,#02H MOV R6,#05H MOV DPH,R3 MOV DPL,R4MOVXA,@DPTRINC DPTR MOV R3,DPH MOV R4,DPL MOV B,A SWAP AANL A,#0FH ORL A,#30H MOV DPH,R5 MOV DPL,R6MOVX@DPT,R AINC DPTR MOV A,B ANL A,#0FH ORL A,#30HMOVX@DPT,R AMOV R5,DPHMOV R6,DPLDJNZ R2,CHLP CHLP:14、有一无符号数据块长度在 30H 单元中,其首地址为 31H 单元,求出数据块中最大值, 并存入 40H 中。
答:MOV R0, #31HMOVR1, 30HMOV 40H ,#00HLOOP: MOVA , @R0CJNEA , 40H , L1SJMPAGAIN L1:JNC L2SJMPAGAIN L2:MOV40H , A AGAIN: INCR0DJNZR1, LOOPSJMP$15、略16、在以2000H 为首地址的存储区内,存放 20个用ASCII 码表示的0〜9之间的数,试编BCD 码,并以压缩 BCD 码的形式存在 3000H 〜3009H 单元中。
答: MOVR2, #10 MOV DPL , R4 MOVX A , @DPTR ANL A , #0FH程,将它们转换成 LP:MOVR3, #20HMOV R4,#00HMOV R5,#30HMOV R6,#00HMOV DPH, R3SWAP A XCH A,B INCDPTRMOVXA,@DPTRANLA,#0FHORL A,BINCDPTRMOV R3,DPHMOV R4,DPLMOV DPH,R5MOVDPL,R6MOVX@DPT,RAINCDPTRMOV R5,DPHMOVR6,DPLDJNZ R2,LPSJMP$17、试编程实现下列逻辑表达式功能。
设P1.7〜P1.0为8个变量的输入端,而其中又作为变量的输出端。
;输入端定义X0EQUP1.0X1EQUP1.1X2EQUP1.2X3EQUP1.3X4EQU P1.4P1.7X6 EQU P1.6 X7EQUP1.7(1) 丫 X °X !X 2 X 3X 4X 5X 6 X 7MOV C, X0 ANL C, X1 ANL C, /X2 ORL C, X3 MOV OOH, C MOV C, X4 ANL C, X5 ANL C, X6 ORL C, /X7 ORLC, OOH MOVP1.7, CMOV c, X O ANL c, X 1CPL CMOV OOH,(MOV C, X 2 ANL C, X 3 ANL C, X 4CPLCX5 EQU P1.5 (2) Y XXX 2X 3X 4X 5X 6X 7MOV01H,CMOVC,X5ANL C,X6ANL C,X7CPL CORLC,O1HCPL CORL C,00HMOV P1.7 ,C18、略19、略20、试编写延时1s、1min、1h 子程序。