2019最新第4章 汇编语言程序设计简介 41 伪指令 42 汇编语言程序设计物理
汇编语言程序设计第四章-汇编语言程序格式
RESB/RESW/RESD
定义未初始化的字节/字/双字 型数据。
格式化输入和
MOV指令
将数据从内存传输到寄存器或将寄存器中 的数据传输到内存。
DIV指令
将第一个操作数除以第二个操作数并将商 存储在目标操作数中,余数存储在另一个 目标操作数中。
ADD指令
将两个操作数相加并将结果存储在目标操 作数中。
使用观察窗口
在调试器中设置观察窗口,实时监控变量的 变化。
04
汇编语言程序的应用
汇编语言程序在系统编程中的应用
系统内核开发
汇编语言常用于操作系统的内核开发,如Linux内核 中的启动代码部分。
系统工具开发
汇编语言用于开发系统工具,如磁盘驱动程序、文件 系统等。
系统优化
在性能敏感的系统软件中,如数据库管理系统,汇编 语言用于优化关键部分的性能。
伪指令(Pseudo-instructions)
伪指令是汇编语言中的特殊指令,用于为汇编器提供信息或指导其如何处理代码。例如, ORG、END、DB等。
汇编语言程序的组成
01
指令(Instructions)
指令是汇编语言中的基本单位,用于描述计算机执行的操作。例如,
MOV、ADD、SUB等。
02
操作数(Operands)
汇编语言程序设计第 四章-汇编语言程序
格式
目录
• 汇编语言程序的基本结构 • 汇编语言程序的格式化 • 汇编语言程序的调试 • 汇编语言程序的应用
01
汇编语言程序的基本结构
段和伪指令
段(Segment)
在汇编语言中,段是一个内存区域,用于存储程序代码、数据或堆栈。例如,代码段 (Code Segment)、数据段(Data Segment)和堆栈段(Stack Segment)。
第4章汇编语言程序设计伪指令的功能和应用程序设计的步骤和基本方法汇编的概念顺序程序分支程序循环程序子
AQ BIT P0.0 DEF BIT 00H
把P0.0的位地址赋给字符AQ,把位地址00H赋 给字符DEF。在其后的编程中,AQ可作P0.0使用, DEF可作位地址30H使用。
7.定义空间伪指令:
格式:〔标号:〕DS 表达式 功能:从标号指定的地址单元开始,保留若干个存储
常用的伪指令有以下几种:
⒈ 起始伪指令 ORG(Origin)
格式:ORG 16位地址 功能:规定ORG下面第一条指令的起始地址为
ORG指定的16位地址。
ORG 0100H START:MOV A,#05H
ADD A,#08H MOV 20H,A
①MOV A,#05H指令的第一个字节地址为0100H, ②标号START代表的地址为0100H。
⒉ 结束伪指令 END
格式:END 功能:汇编语言源程序的结束标志。
在END后面的指令,不被汇编。
⒊ 等值伪指令 EQU(Equate)
格式:字符名称 EQU 数据或符号
例如: PW EQU 2000H MOV DPTR, #PW ;(DPTR)=2000H
这里将PW等值为数值2000H,在指令中PW就可 以代替2000H来使用。
第二节 汇编语言程序设计举例
一. 顺序程序
顺序程序是指按顺序依次执行的程序, 顺序程
序结构虽然比较简单,但它是构成复杂程序的基础。
• 【例4-2】编写16位二进制数求补程序。 • 设16位二进制数存放在R1、R0中,求补以后的
结果则存放于R3、R2中。
CONT:
ORG 0200H
MOV A,R0 CPL A ADD A,#1 MOV R2,A MOV A,R1 CPL A ADDC A,#80H MOV R3,A RET
汇编语言程序设计第四章
添加标题
注意:默认是8086 方式。
数据与符号定义伪指令
定义符号伪指令
包括EQU, =, LABEL,它们只用来定义名字,不分配存储空间.
格式: 名字 EQU 表达式
名字 =
表达式
注意 (1)EQU的表达式可以是常量,变量名,标号,指令助记符,寄存器名;而=的表 达式只能是数字表达式,主要用来定义符号常量. 同一个源程序,EQU符号名不能重复定义,=则可以. 同一个源程序中同一符号名,不能同时用EQU和=语句定义.
NOT; AND ; OR,XOR; SHORT
从高到低排列:
4.2 汇编伪指令语句
添加标题
方式伪指令
添加标题
code ends
添加标题
包 括:.8086, .386, . 386P等,用来指定 CPU的类型.
添加标题
例如: .386
添加标题
.8086
添加标题
code segment …
添加标题
○ COUNT =60*60 ○ MOV ECX, COUNT ; COUNT=3600 ECX
算法运算符共7种: +, -, *, /, MOD, SHR, SHL
○ 对于语句:MOV AL,2
可用下列语句替换:
VAL EQU 5
MOV AL, VAL SHL 1 ; VAL=5=00000101B 逻辑右移1 位为:00000010B=2
地址表达式
地址表达式形成的结果是存储器的地址,用来表标指令中的标号或变量操作数,有 3个属性:段地址,EA和类型。
而数值表达式的结果只有大小没有属性。 地址表达式可由变量、标号、常量、寄存器及一些运算符组成。
第4章 伪指令及汇编语言源程序
第 4章
符号定义伪指令
2、 等号伪指令 = = 伪指令的格式与功能和 EQU 类似。不同的是, 在同一个程序中 = 可以对一个符号重复定义, EQU不能对同一个符号重复定义。 Y1=7 Y1=128 的定义是正确的。 而 Y1 EQU 7 Y1 EQU 128 的定义是错误的。
2019/4/12
24
第 4章
组合类型
组合类型规定本段与其他段的关系,有 4 种方式(默 认方式为NONE): NONE:连接时,表示本段与其他段在逻辑上没有 关系。 PUBLIC:连接时,本段将与其他同名、同类别的段 相邻地连接在一起,形成一个物理段,段的长度为 各PUBLIC段长度之和。 COMMON:连接时,本段将与其他同名、同类别 的段相覆盖,形成一个物理段,段的长度为最长的 COMMON段的长度。 STACK:表示此段为堆栈段,连接方式与PUBLIC 段相同。
2019/4/12
偏移地址低字节
偏移地址高字节
偏移地址低字节 偏移地址高字节
段地址低字节
段地址高字节
图4.2
15
第 4章
操作数是字符串
操作数为字符串时,内存中存放的是各字符的ASCII码。 例4-5 下面3个定义语句是等价的。 STR1 DB ‘ABCD’ STR1 DB ‘A’, ‘B’, ‘C’, ‘D’ STR1 DB 41H,42H,43H,44H 例4-6 下面2个定义语句是等价的 STR2 DB ‘AB’ STR2 DW ‘BA’ 当定义的字符串中字符多于2个时,只能使用DB定义,不 能使用DW。 STR3 DW ‘ABCD’ 是错误的定义方式。
2019/4/12
5
第 4章
操作码与操作数
汇编 第四章伪指令及汇编语言源程序结构
MOV AL, BUF1
ADD AL, BUF2 MOV SUM, AL
;取第一个加数
;两数加 ;和放入SUM单元
3
伪指令(指 示性)语句: 提供相关辅 助信息。
指令性语句: 完成一定功 能,能翻译 成机器码。
伪指令语句
DATA SEGMENT ;DATA段定义开始 BUF1 DB 34H BUF2 DB 27H SUM DB ? DATA ENDS ;DATA段定义结束 CODE SEGMENT ;CODE段定义开始 ASSUME CS:CODE ASSUME DS:DATA ;段性质规定 START: MOV AX,DATA MOV DS,AX ;给DS赋值 MOV AL, BUF1 ;取第一个加数 ADD AL, BUF2 ;两数加 MOV SUM, AL ;和放入SUM单元 MOV AH,4CH INT 21H ;返回DOS CODE ENDS ;CODE段定义结束 END START ;源程序结束
14
二、= 等号伪指令
格式:符号名 = 表达式 功能:为常量、表达式及其他各种符号定义一个等价的符号 名,并能对所定义的符号多次重复定义,且以最后一次定义 的值为准。 例:COST = 20 M = MOV LOST = COST+10 ;30→LOST M = ADD ;M=ADD 注 : “ = ” 伪 指 令 的 格 式 和 功 能 与 EQU 类 似 。 二者区别:在同一程序中,“=”可以对一个符号重 复定义,EQU不能对同一符号重复定义。
26
三、变量、标号的分析运算和合成运算
例:DATA SEGMENT A DB ‘ABCDEF’ B DW 10 DUP(1,2DUP(2)) C DB 3,20 DUP(0) DATA ENDS ┆ MOV AX,LENGTH A ;1→AX MOV BX,LENGTH B ;10→BX MOV CX,LENGTH C ;1→CX ┆
第4章 伪指令、汇编语言程序结构及上机过程
表达式 表达式有算术表达式、关系表达式、逻辑表达式, 其对应的运算符见课本37页。
4.2 伪指令
伪指令是向汇编程序提供诸如:哪个段是数据段。 哪个段是代码段,程序何时结束、数据据段中的ห้องสมุดไป่ตู้内存变量等相关信息。 (1)数据定义伪指令 (2)段定义伪指令
(3)假定伪指令ASSUME (4)程序结束伪指令 (5)过程定义伪指令 (6)其它
(5)程序的调试:DEBUG 下面介绍几个最常用的DEBUG命令: (1)先进入DEBUG 并装入要调试的程序(例: SSD.EXE)
DEBUG SSD.EXE
(2)用反汇编命令U来确定所要设定的断点地 址.
-U
(3)从U命令的显示情况可确定要设置的断点 的位置.在确定断点后,就可以用G命令使程 序启动运行,同时设置断点. 例:-G=0 001D ;执行程序(从0到001D 单元) 程序将停在断点处,并显示出所有寄存器发 及各标志位的当前值,最后一行给出下一条 将要执行指令的地址、机器语言及汇编语 言.我们可以从寄存器的内容来了解程序运 行是否正确.
0C 08 34 12 41 42
SUM A1
STR
说明: (1)这里的SUM,A1,STR其实质为符号地址, 不同于高级语言的内存变量,也就是说不 能按内存变量一样去访问对应的数据。 (2)定义的16位数在内存存放时,其形式为 低8位在低地址,高8位在高地址。 (3)定义的字符数据按其ASCII码存放。
第四章 伪指令、汇编语言源程序结构及上机过 程
4.1 4.2 4.3 4.4 汇编语言中的语句 伪指令 源程序结构 汇编语言的上机过程
4.1 汇编语言中的语句
1.语句种类 (1)指令语句:完成一定的操作,能够翻译成机器代码 的语句,第三章介绍的指令所形成的语句. (2)伪指令语句:只是为程序在翻译语言程序时提供 有关信息,并不翻译成机器代码的语句. 注:汇编语言中还可以出现宏指令语句(12章)。
第4章 汇编 语言程序设计
汇编时,遇到“ 就停止“翻译” 因此, 汇编时,遇到“;” 就停止“翻译”。因此,注释字 段不会产生机器代码。 段不会产生机器代码。 4.1.3 伪指令 在汇编语言源程序中应有向汇编程序发出的指示信息, 在汇编语言源程序中应有向汇编程序发出的指示信息, 向汇编程序发出的指示信息 告诉它如何完成汇编工作,这是通过伪指令来实现。 伪指令来实现 告诉它如何完成汇编工作,这是通过伪指令来实现。 伪指令不属于指令系统中的汇编语言指令,它是程序员 伪指令不属于指令系统中的汇编语言指令, 发给汇编程序的命令,也称为汇编程序控制命令。 发给汇编程序的命令,也称为汇编程序控制命令。 命令 汇编程序控制命令 只有在汇编前的源程序中才有伪指令。 “伪”体现在 只有在汇编前的源程序中才有伪指令。 汇编后,伪指令没有相应的机器代码产生。 汇编后,伪指令没有相应的机器代码产生。 没有相应的机器代码产生 伪指令具有控制汇编程序的输入/输出、 伪指令具有控制汇编程序的输入/输出、定义数据和符 号、条件汇编、分配存储空间等功能。 条件汇编、分配存储空间等功能。
6
经过十几年努力,C51已成为单片机的实用高级编程语言。 经过十几年努力,C51已成为单片机的实用高级编程语言。 已成为单片机的实用高级编程语言 尽管目前已有不少设计人员使用C51来进行程序开发, 尽管目前已有不少设计人员使用C51来进行程序开发,但在 C51来进行程序开发 对程序的空间和时间要求较高的场合,汇编语言仍必不可少 程序的空间和时间要求较高的场合, 空间 要求较高的场合 。 在这种场合下,可使用C语言和汇编语言混合编程。 在这种场合下,可使用C语言和汇编语言混合编程。在很多 需要直接控制硬件且对实时性要求较高的场合,则更是非用 需要直接控制硬件且对实时性要求较高的场合, 汇编语言不可。 汇编语言不可。 掌握汇编语言并能进行程序设计, 掌握汇编语言并能进行程序设计,是学习和掌握单片机程 序设计的基本功之一。 序设计的基本功之一。 基本功之一 4.1.2 汇编语言语句和格式
第四章-汇编语言程序的设计
第四章汇编语言程序设计本章的汇编语言程序设计的主要容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。
(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。
在介绍之前,我们还是来学习汇编语言的一些基础知识)4.1 汇编语言程序设计概述1、计算机的汇编语言以助记符表示的指令,每一条指令就是汇编语言的一条语句。
(汇编语言程序设计实际上就是使用汇编指令来编写计算机程序。
汇编语言的语句有严格的格式要求)2、汇编语言的语句格式MCS-51汇编语言的语句格式表示如下:[<标号>]: <操作码> [<操作数>]; [<注释>]标号:指令的符号地址,有了标号,程序中的其它语句才能访问该语句。
①标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。
②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。
(同一个标号在程序中只能定义一次,不能重复定义;一条语句可以有标号,也可以没有标号,所以是否有标号,取决于程序中是否需要访问该语句。
)操作码:规定语句执行的操作容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。
操作数:给指令的操作提供数据或地址。
注释:是对语句或程序段的解释说明。
(在单片机中,这四个部分怎么加以区分呢?使用分界符)分界符(分隔符):用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。
冒号(:)用于标号之后空格()用于操作码和操作数之间逗号(,)用于操作数之间,分割两个以上的操作数分号(;)用于注释之前。
第四章 伪指令
数据定义伪指令的格式为: [变量名] DB(DW、DD、DQ、DT) 表达式1,表达式2,… 表达式1,表达式2……是给变量或指定的存储单元赋予初值,它们有以下几种形式: (a)数值表达式 数据定义伪指令可以为一个或连续的存储单元设置数值初值。 (b)字符串表达式 对于DB伪指令,字符串的长度允许超过2个字符,但不能超过255个字符,字符 串必须用单引号括起来,它可为字符串中的每个字符分配1字节单元,字符串 从左至右以字符的ASCII码形式按地址递增的顺序依次存放。 (c)?表达式 不带引号的?,用于为变量预留内存单元,暂时不存入数据,即表示所定义的 变量无确定的初值。 例如:A DW ?,?为变量A预留2个字单元。 (d)地址表达式 操作数为地址表达式时,只适用于DW和DD这两种数据定义伪指令。如果地址表 达式为一变量(标号)名,用DW伪指令则是取它的偏移地址来初始化变量;用 DD伪指令则是取它的段首地址和偏移地址来初始化变量。 (e)带DUP的表达式 格式为:n DUP (表达式),其中n为重复因子,只能取正整数,它表示定义了 n个相同的数据存储单元。
在8086汇编语言中,运算符分为:算术运算符、逻辑运算符、关系运算
符、数值返回运算符、属性运算符和字节分离运算符。
(一)、表达式
(1)数值表达式 数值表达式是由常量与算术运算符、逻辑运算符或关系运算符构成的有意 义的式子。数值表达式在汇编期间进行运算,运算结果为一数值常量,它 只有大小而没有属性。
数据定义伪指令的格式为: [变量名] DB(DW、DD、DQ、DT)
Байду номын сангаас
表达式1,表达式2,„
其中:变量名是可选项,它仅代表所定义数据存储区第一个单元的地址; DB、DW、DD、DQ和DT是伪指令符,具体一条数据定义伪指令取5种之一。 DB定义的是字节类型的变量,每个表达式被分配1个字节单元。 DW定义的是字类型的变量,每一个表达式被分配1个字单元(2个字节)。 DD定义的是双字类型的变量,每一个表达式被分配2个字单元(4个字节)。 DQ定义的是四字类型的变量,每一个表达式被分配4个字单元(8个字节)。 DT定义的是十字节类型的变量,每一个表达式被分配10个字节单元。
第4章 汇编语言程序设计1(汇编语言源程序的结构、语句格式、伪指令)
注意: 指令性语句汇编时生成机器码;
指示性语句汇编时不生成机器码。
11
语句的构成元素:
标号——指令的符号地址,用来代表指令在存储器中的 地址。只能出现在指令性语句中,标号后应加上冒号。 名字——段、过程、变量的名字,用来代表它们在存储 器中的地址。只能出现在指示性语句中,名字后不加冒 号。 指令助记符——8086助记符、伪指令 操作数——即指令的操作对象 – 对指令性语句(真指令)——0,1,2个 – 对指示性语句(伪指令)——根据需要而定 – 操作数之间以逗号分隔 – 操作数可以是:寄存器、存储单元、常数或表达式 例如:AX,[DI+BX+10],200,16*8+TABLE,等等
逻辑运算符只能用于数字表达式中。 例: MOV CL,36H AND 0FH 经汇编后:MOV CL,06H 注意: 不要把逻辑运算符与逻辑运算指令混淆: 例:AND AX, 3FC0H AND 0FF00H 汇编后源操作数被翻译为:3F00H,所以上述指 令与 AND AX, 3F00H等价。
21
26
4.2 伪指令
由汇编程序执行的指令,它本身不被汇编 成机器指令。常用的伪指令有: 数据定义 伪指令 符号定义 伪指令 段定义和段寄存器指定伪指令 过程定义 伪指令 结束 伪指令
27
4.2.1 数据定义伪指令
用于定义变量,即内存单元或数据区。数 据定义伪指令的格式为:
变量名 数据定义伪指令 操作数,操作数,…
1)算术运算符—— +、-、*、/,MOD
用于数字表达式,
例: MOV AX,4*1024 汇编后的形式为: MOV AX,4096 用于地址表达式, 例: LEA SI,TAB+3 若TAB的偏移地址为1000H,则汇编后的形式为: LEA SI,[1003H]
第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 编程器
交叉引用 列表器
调试工具
绝对地址 列表器
汇编语言程序设计第4章
这条语句指出所定义的CODE代码段到此结束。
9)
END
START
END是保留字,指示整个程序模块到此结束。 按上述格式写出的一个程序如例4-2所示:
第4章 伪指令及汇编语言源程序结构
例4-2 NAME FIRST_DATA STRING_DA FIRST_DATA SIMPLE_EXAMPLE SEGMENT DB 'This is My First Program $' ENDS ;要显示的字符串
令语句的功能相当于若干条指令语句的功能。宏指令语句实际
上是一个指令序列,汇编时产生对应的目标代码序列。
第4章 伪指令及汇编语言源程序结构 注释语句——以分号“;”开始的说明性语句,汇编程序 不予以处理,只起注释作用,使程序易于理解。 空行语句——为保持程序书写清晰,仅包含回车换行符的 语句行。 注意:有关逻辑段的定义和说明伪指令,以及其他伪指令/
80x86系列微处理器的存储器采用了分段管理的方法,其汇
编语言是以逻辑段为基础,按段的概念来组织代码和数据的,
汇编语言源程序的结构特点有:
(1) 由若干逻辑段组成,各逻辑段由伪指令语句定义和说
明。
(2) 整个源程序以END伪指令结束。
第4章 伪指令及汇编语言源程序结构 (3) 每个逻辑段由语句序列组成,各语句可以是: 指令语句——完成一定操作功能,能够翻译成机器代码 的语句,即为第3章介绍的指令所形成的语句。指令语句对应 于CPU指令系统中的一条指令,因此为可执行语句。汇编时汇
是程序名称,用户可用任意一个标识符为程序命名。
第4章 伪指令及汇编语言源程序结构 2) DATA SEGMENT (数据定义伪指令序列) … DATA ENDS
第四章汇编语言程序设计知识
3、子程序的参数传递 主程序在调用子程序时,经常需要 传送一些参数,子程序运行完后也经常 将一些参数回送给主程序,这叫参数传 递。
♦ 用工作寄存器和累加器传递参数
【例4-11 】 编程计算c = a2 +b2。(a,b=0~9) 编程说明:这个问题中,计算某数的平方可以 用子程序来实现,两次调用该子程序,并求和 便得到所需结果。设a、b 分别存于内部RAM 的30H、31H单元,结果C存于内部RAM的 40H单元。
【例4-10】 将1位十六进制数,转换成相应ASCⅡ码。 用计算求解和查表求解,进行比较。 (1) 计算求解: 编程说明: 设待转换的一位十六进制数存放在40H 单元中,转换后的ASCⅡ码仍存放在40H 中。 编程思路: 十六进制数 0 ~ 9 的 ASCⅡ 为 41H ~ 46H,当待转换的数≤9时,加30H,既是其对应的 ASCⅡ码;当待转换的数>9时,加37H。程序流程 如图所示。
7、结束汇编指令 格式: END END指示源程序到结束,常将其放在汇 编语言源程序的末尾。 8、BIT 位地址符号命令 格式:符号名 BIT 位地址
4.1.3 汇编语言程序设计过程
♦ 1、分析任务,确定算法或解题思路 ♦ 2、根据算法和解决思路画出程序流程图
流程图是由一些框图和流程线组合而成:
通过流程图把具有一定功能的各部分有机的联系起来。
3、根据流程图编写程序 4、上机调试程序
4.2 汇编程序结构
4. 2. 1 顺序结构程序设计 按照程序编写的顺序,依次执行。任何复杂的 程序,都含有较大成份的顺序结构程序。 【例4-1】 将两位压缩BCD码转换成二进制数 编程思路:(a1a0)BCD= a1×10+a0 编程说明:待转换的两位压缩BCD码存放于 R2,转换结果存回R2。 程序流程图如图4-1所示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第 4 章 汇编语言程序设计简介
例 2 将两个半字节数合并成一个一字节数。
设内部RAM 40H, 41H单元中分别存放着 8 位二进制数, 要求取出两个单元中的低半字节, 并成一个字节后, 存入 50H单元中。 程序如下:
START: MOV R1, #40H MOV A, @R1 ANL A, #0FH SWAP A INC R1 XCH A, @R1 ANL A, # 0FH ORL A, @R1 MOV 50H, A RET
第 4 章 汇编语言程序设计简介
ORG 1000H
BUF1: DB 38H, 7FH, 80H
BUF2: DB 45H, 66H ORG伪指令指定了标号BUF1的地址为1000H, 而DB伪 指 令 是 将 其 后 的 二进 制 数 表 38H, 7FH, 80H 依次存 放 在 1000H, 1001H, 1002H 3 个连续单元之中, BUF2也是一个标 号, 其地址与前一条伪指令连续, 即1003H, 1004H地址单元 中依次存放 45H, 66H。
第 4 章 汇编语言程序设计简介
五、 定义字指令DW 指令格式: [标号:] DW 16 位数据表 该指令的功能与DB相似, 区别仅在于从指定地址开始存 放的是指令中的 16 位数据, 而不是字节串。每个 16 位数据 要占两个存储单元, 高8 位先存, 低 8 位后存。
第 4 章 汇编语言程序设计简介
第 4 章 汇编语言程序设计简介
例 11 根据工作寄存器R0 内容的不同, 使程序转入相 应的分支。
(R0)=0 对应的分支程序标号为PR0; (R0)=1 对应的分支程序标号为PR1;
(R0)=N 对应的分支程序标号为PRN。
…
第 4 章 汇编语言程序设计简介
程序如下: LP0: MOV DPTR, #TAB
程序的基本算法结构有 4 种: 顺序结构、 分支(选择) 结构、循环结构和子程序结构。
第 4 章 汇编语言程序设计简介
4.2.1 顺序程序设计
顺序结构是最简单的一种基本结构。 例 1 两个无符号双字节数相加。 设被加数存放于内部RAM的40H(高位字节), 41H(低 位字节), 加数存放于50H(高位字节), 51H(低位字节), 和数存入 40H和41H单元中。
第 4 章 汇编语言程序设计简介
第4章 汇编语言程序设计简介
4.1 伪指令 4.2 汇编语言程序设计
第 4 章 汇编语言程序设计简介
4.1 伪 指 令
1. 汇编程序
MCS—51 指令所编写的汇编语言源程序, 还必须经过从 汇编源程序到机器语言目标程序的“ 翻译”, 才能在 51 系列 单片机运行, 这种翻译的过程称为汇编。 完成汇编工作有两种 途径: 一种是人工汇编; 一种是机器汇编。 对于量小、 简单的 程序, 程序员经过查指令系统表, 将汇编源程序逐条翻译成机 器代码, 完成手工汇编, 再从单片机开发装置的键盘上输入目 标程序进行调试、 运行。
第 4 章 汇编语言程序设计简介
2. 伪 指 令
在汇编源程序的过程中, 还有一些指令不要求计算机进 行任何操作, 也没有对应的机器码, 不产生目标程序, 不影响 程序的执行, 仅仅是能够帮助汇编进行的一些指令, 称之为伪 指令。 它主要用来指定程序或数据的起始位置, 给出一些连 续存放数据的确定地址, 或为中间运算结果保留一部分存储 空间以及表示源程序结束等等。 不同版本的汇编语言, 伪指 令的符号和含义可能有所不同, 但是基本用法是相似的。 下 面介绍几种常用的基本伪指令。
PA8155 EQU 8001H 即给标号PA8155赋值为8001H。
第 4 章 汇编语言程序设计简介
四、 定义字节指令DB 指令格式:
[标号: ] DB 8位二进制数表 功能: 把 8 位二进制数表依次存入从标号开始的连续的 存储单元中。
格式中, 标号区段可有可无, DB指令之后的 8 位二进制 数表是字节常数或用逗号隔开的字节串, 也可以是用引号括 起来的ASCII码字符串 (一个 ASCII字符相当于一个字节)。 例:
; 跳至不同的分支
第 4 章 汇编语言程序设计简介
二、 汇编结束指令END 指令格式:
END 功能: 提供汇编结束标志。汇编程序遇到 END后就停 止汇编, 对 END以后的语句不予处理, 故 END应放在程序 的结束处。
第 4 章 汇编语言程序设计简介
三、等值指令EQU 指令格式: 字符名称 EQU 数字或汇编符号
第 4 章 汇编语言程序设计简介
例 3 x, y均为8位二进制数, 设 x存入R0, y存入R1, 求解:
1 y 1
0
x0 x0 x0
分析:
图 4.2
第 4 章 汇编语言程序设计简介
程序如下:
START: CJNE R0, #00H, SUL1 ; R0中的数与00比较不等转移
; 设置R1为数据指针 ; 取出第一个单元中的内容 ; 取第一个数的低半字节 ; 移至高半字节 ; 修改数据指针 ; 取第二个单元中的内容 ; 取第二个数的低半字节 ; 拼字 ; 存放结果
第 4 章 汇编语言程序设计简介
4.2.2 分支程序设计
在实际的程序设计中, 有很多情况往往还需要程序按照给 定的条件进行分支。 这时就必须对某一个变量所处的状态进 行判断, 根据判断结果来决定程序的流向。 这就是分支(选 择)结构程序设计。
第 4 章 汇编语言程序设计简介
程序如下: START: CLR C
MOV R0, #41H MOV R1, #51H AD1: MOV A, @R0 ADD A,@R1 MOV @R0, A DEC R0 DEC R1 MOV A, @R0 ADDC A, @R1 MOV @R0, A RET
; 将Cy清零 ; 将被加数地址送数据指针R0 ; 将加数地址送数据指针R1 ; 被加数低字节的内容送入A ; 两个低字节相加 ; 低字节的和存入被加数低字节中 ; 指向被加数高位字节 ; 指向加数高位字节 ; 被加数高位字节送入A ; 两个高位字节带Cy相加 ; 高位字节的和送被加数高位字节
第 4 章 汇编语言程序设计简介
4.2 汇编语言程序设计
用汇编语言进行程序设计的过程和用高级语言进行程序 设计相类似。 对于比较复杂的问题, 首先要掌握解决它的方 法和步骤——算法, 有了合适的算法常常可以起到事半功倍的 效果; 其次, 就是用操作框、 带箭头流程线、 框内外必要的 文字说明所组成的流程图来描述算法; 最后是根据流程图用 程序设计语言来编制程序。
第 4 章 汇编语言程序设计简介
例: ORG 2000H MOV SP, #60H MOV R0, #2FH MOV R2, # 0FFH
ORG伪指令说明其后面程序的目标代码在存储器中存放的 起始地址是2000H, 即
存储器地址 目标程序
ቤተ መጻሕፍቲ ባይዱ
2000H 2003H 2005H
75 81 60 78 2F 7A FF
MOV DPTR, #TAB MOV A, R0 MOV B, #03H MUL AB XCH A, B
; 长跳转指令占 3 个字节
第 4 章 汇编语言程序设计简介
ADD A, DPH MOV DPH, A XCH A, B JMP @A+DPTR
; 跳至散转表中相应的位置
…
TAB: LJMP PR0 LJMP PR1
第 4 章 汇编语言程序设计简介
2. 伪 指 令
一、 汇编起始指令 ORG 指令格式为:
ORG nn 该指令的作用是指明后面的程序或数据块的起始地址, 它总是出现在每段源程序(主程序、 子程序)或数据块的开 始。 式中, nn为 16 位地址, 汇编时nn确定了此语句后面第一 条指令或第一个数据的地址,此后的源程序或数据块就依次连 续存放在以后的地址内, 直到遇到另一个ORG指令为止。
第 4 章 汇编语言程序设计简介 例 4 比较两个无符号数的大小。 设外部RAM的存储单元ST1和ST2中存放两个不带符号的
二进制数, 找出其中的大数存入外部RAM中的ST3单元中。
图 4.3
第 4 章 汇编语言程序设计简介
程序如下:
START: MOV DPTR, #ST1 ; 第一个数的指针
功能: 使指令中的字符名称等价于给定的数字或汇编符号。 使用等值指令可给程序的编制、调试、修改带来方便, 如果在 程序中要多次使用到某一地址,由EQU指令将其赋值给一个字 符名称, 一旦需要对其进行变动, 只要改变EQU命令后面的数字 即可, 而不需要对程序中涉及到该地址的所有指令逐句进行修 改。 但要注意, 由 EQU等值的字符名称必须先赋值后使用, 且 在同一个源程序中, 同一个标号只能赋值一次。 例:
六、 定义存储空间指令DS 指令格式: [标号:] DS 表达式 该伪指令的功能是从标号指定的单元开始, 保留若干字 节的内存空间以备源程序使用。
例如: ORG 1000H DS 20H DB 30H, 8FH
汇编后: 从 1000H开始, 预留 32(20H)个字节的内存单元, 然后从 1020H开始, 按照下一条DB指令赋值, 即 (1020H)=30H, (1021H)=8FH
MOV R1, #00H
; 相等, R1← 0
SJMP SUL2
SUL1: JC NEG MOV R1, #01H
; 两数不等, 若(R0)<0, 转向NEG ; (R0)>0, 则 R1←01H
SJMP SUL2
NEG: MOV R1, #0FFH
; (R0)<0, 则 R1←0FFH
SUL2: RET
MOVX A, @DPTR ; 取第一个数
MOV R2, A
; 保存
MOV DPTR, #ST2 ; 第二个数的指针