第4章汇编语言.

合集下载

汇编语言设计实践:第4部分 基本汇编语言

汇编语言设计实践:第4部分 基本汇编语言
第四章 基本汇编语言
4.1 汇编语言语句种类及其格式
汇编语言的程序格式
• 完整的汇编语言源程序由段组成,段由指令语句与 伪指令语句构成
• 一个汇编语言源程序可以包含若干个代码段、数据 段、附加段或堆栈段,段与段之间的顺序可随意排 列
• 需独立运行的程序必须包含一个代码段,并指示程 序执行的起始点,一个程序只有一个起始点
• 所有的指令语句必须位于某一个代码段内,伪指令 语句可根据需要位于任一段内或段外
汇编语言的语句可以分为指令语句和伪指令语句
•指令语句——产生使CPU产生动作、可供机器
执行的机器目标代码
•伪指令语句——不产生CPU动作、在程序执行
前由汇编程序处理的说明性语句,例如,数据说明、 变量定义等等
2
一、指令语句
每一条指令语句在汇编时都要产生一个可供CPU执 行的机器目标代码,它又叫可执行语句。
指令语句的一般格式为: 标号 : 操作码
, 操作数
; 注释
一条指令语句最多可以包含4个字段 例 L1:MOV AH,0A0H ;将0A0H放入AH
3
1.标号字段
标号是可选字段,它后面必须有“:”。标号是一条 指令的符号地址,代表了该指令的第一个字节存放 地址。
注释字段可以是一条指令的后面部分,也可以是 整个语句行。
例:
LABEL1: ADD AX,BX; 功能为AX<=(AX)+(BX)
;后面的程序段将完成两次对存储器的访问
MOV AX, W_VAR1
MOV W_VAR2, AX
7
二、伪指令语句
伪指令语句又叫命令语句。 伪指令本身并不产生对应的机器目标代码。它仅 仅是告诉汇编程序对其后面的指令语句和伪指令 语句的操作数应该如何处理。

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

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

第四章汇编语言程序设计本章的汇编语言程序设计的主要容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。

(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。

在介绍之前,我们还是来学习汇编语言的一些基础知识)4.1 汇编语言程序设计概述1、计算机的汇编语言以助记符表示的指令,每一条指令就是汇编语言的一条语句。

(汇编语言程序设计实际上就是使用汇编指令来编写计算机程序。

汇编语言的语句有严格的格式要求)2、汇编语言的语句格式MCS-51汇编语言的语句格式表示如下:[<标号>]: <操作码> [<操作数>]; [<注释>]标号:指令的符号地址,有了标号,程序中的其它语句才能访问该语句。

①标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。

②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。

(同一个标号在程序中只能定义一次,不能重复定义;一条语句可以有标号,也可以没有标号,所以是否有标号,取决于程序中是否需要访问该语句。

)操作码:规定语句执行的操作容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。

操作数:给指令的操作提供数据或地址。

注释:是对语句或程序段的解释说明。

(在单片机中,这四个部分怎么加以区分呢?使用分界符)分界符(分隔符):用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。

冒号(:)用于标号之后空格()用于操作码和操作数之间逗号(,)用于操作数之间,分割两个以上的操作数分号(;)用于注释之前。

第4章 汇编 语言程序设计

第4章  汇编 语言程序设计

DJNZ R1,LOOP ;R1减1不为零,则跳LOOP处 NOP
HERE:SJMP
HERE
上述4个字段应该遵守的基本语法规则如下。
10
1.标号字段
语句所在地址的标志符号,才能被访问。如标号 “START”和“LOOP”等。有关标号规定如下: (1)标号后必须跟冒号“:”。 (2)标号由1~8个ASCII码字符组成,第一个字符必须是
8
汇编语言语句是符合典型的汇编语言的四分段格式:
标号字段 (LABLE) 操作码字段 (OPCODE) 操作数字段 (OPRAND) 注释字段 (COMMENT)
标号字段和操作码字段之间要有冒号“:”分隔; 操作码字段和操作数字段间的分界符是空格; 双操作数之间用逗号相隔;
操作数字段和注释字段之间的分界符用分号“;”。
表示的机器语言程序,才能识别和执行。
完成“翻译”的程序称为汇编程序。经汇编程序“汇编”得 到的以“0”、“1”代码形式表示的机器语言程序称为目标 程序。
5
优点:用汇编语言编写程序效率高,占用存储空间小,运行 速度快,能编写出最优化的程序, 缺点:可读性差,离不开具体的硬件,是面向“硬件”的语 言通用性差。 2.高级语言
功能是把P1.6的位地址赋给变量QA。
4.2
汇编语言源程序的汇编
“汇编”?汇编可分为手工汇编和机器汇编两类。
22
4.2.1
手工汇编
通过查指令的机器代码表(表3-2),逐个把助记符指令 “翻译”成机器代码,再进行调试和运行。 手工汇编遇到相对转移偏移量的计算时,较麻烦,易出 错,只有小程序或受条件限制时才使用。实际中,多采用“ 汇 编程序”来自动完成汇编。
16
重叠。例如:
ORG …… ORG …… ORG …… 2000H 2500H 3000H

单片机第4章汇编语言程序设计

单片机第4章汇编语言程序设计
将汇编语言程序汇编成目标程序后,还要进行 调试,排除程序中的错误。只有通过上机调试并得 出正确结果的程序,才能认为是正确的程序。
4.2 伪指令
伪指令是在机器汇编中告诉汇编程序 如何汇编、对汇编过程进行控制的命令。 伪指令与汇编语言指令不同,只在源程序 中出现,不产生任何机器代码,在程序的 运行过程中不起作用,故称为“伪指令”。
处理 判断 连接
2.绘制程序流程图 简单的问题可由文字说明, 当问题复杂时,将文字说明的步骤以图形符号表示, 称流程图。
3.编写源程序 用汇编语言把流程图所表明的 步骤描述出来,实现流程图中每一框内的要求,从 而编制出一个有序的指令流,即汇编语言源程序。
4.汇编、调试 汇编语言是用指令助记符代替机 器码的编程语言,所编写的程序是不能在计算机上 直接执行的,因此利用它所编写的汇编语言程序必 须转换为单片机能执行的机器码形式的目标程序才 能运行,我们把这一过程称为汇编,进行汇编的程 序称为汇编程序。
4. 定义字伪指令DW
[标号:] DW 16位字数据表
该指令的功能与DB相似, 区别仅在于从指定地
址开始存放的是指令中的16位数据, 而不是字节串。
每个16位数据要占两个存储单元, 高8 位先存(低位
地址), 低 8 位后存(高位地址)。
1403H 3CH
ORG 1400H DATA1:DW 324AH,3CH
散转程序是分支程序的一种, 它可根据运算结果或输入数 据将程序转入不同的分支。MCS - 51 指令系统中有一条跳转指 令JMP@A+DPTR,用它可以很容易地实现散转功能。该指令 把累加器的8位无符号数与16位数据指针的内容相加, 并把相加 的结果装入程序计数器PC,控制程序转向目标地址去执行。

汇编语言学习第4章

汇编语言学习第4章

不同而不同。
(名字项,常称为标号) 标号是程序设计人员自己定义的表示符号,用来表示本语句的符号地址
(即该指令的偏移地址,也就是该单元与其所处段基址的偏移量)是可有
可无的,只有当需要用符号地址来访问该语句时才需要。 2.operation(操作符)
操作符项可以是指令、伪操作或宏指令的助记符。对于指令,作用是指出
1.等价语句EQU
等价语句的一般使用格式如下: SYMBOL EQU EXPRESSION
作用是用左边的符号名代表右边的表达式。
注意:等价语句不会给符号名分配存储空间,符号名不能与其它符号同名, 也不能被重新定义。
(1)用符号名代表常量或表达式
例4.14 (2)用符号名代表字符串 例4.15 (3)用符号名代表关键字或指令助记符 例4.16
例4.21
2.定义字变量的伪指令为DW
一个变量占一个字空间
例4.22:WORD1 DW DW 89H, 1909H, -1 0ABCDH, ?, 0
上面的定义语句经汇编后所产生出的内存单元分配情况如下:
… 89 00 09 19 FF FF CD AB --00 00 …
例4.23
3.双字变量定义伪指令DD 每个双字变量占用二个连续的字单元(四个字节)。
功能和作用,而不应该只写出指令的动作。
4.2运算符号
4.2.1算术运算符
算术运算符有:+、-、*、/和MOD。 其中: +、-、*、/就是我们算术中常用的加、减、乘、除。 MOD算符是模运算。指除法运算后得到的余数。 例如:5 MOD 2为1。 注意:算术运算符可以用于数字表达式或地址表达式中,但当它用于地址 表达式时,只有当其结果有明确的物理意义时才是有效的。 例如:将两个地址相乘或相除是无意义的。地址可以做加减运算,但也必 须注意物理意义。例如把两个不同段的地址相加减也是无意义的。 例4.1 例4.2

第04章 汇编语言程序设计 39页 0.2M PPT版

第04章 汇编语言程序设计 39页 0.2M PPT版

MOV AL,10100000B OR 00000101B ;(AL)←10100101B
例4-4 关系运算符的应用
MOV AX,5 EQ 101B ;(AX)←0FFFFH
MOV BH,10H GT 16 ;(BH)←0
例4-5 数值返回运算符的应用
K1 DB 30H,31H,32H
K2 DW 4041H,4043H
(4)STACK
(5)MEMORY
(6)AT表达式
4. 类别名
返回
4.2.4 段寻址伪指令
格式:
ASSUME 段寄存器名:段名,段寄存器名:段名,……
例4-15 求从NUM开始的12个无符号字节数的和,结果放在SUM字单元中。
DATA SEGMENT NUM DB 95H,83H,36H,2DH DB 33H,22H,1AH,34H DB 62H,45H,75H,49H SUM DW ?
例4-13
STR1 DB ‘COMPUTER’ ;定义一个字符串,字符串的首地址为STR1 STR2 DW ‘AA’,‘BC’,‘DE’ ;给两个字符组成的字符串分配两个字节存储单元 DATA DW ?,?,? ;为DATA预留6个存储单元
例4-14
DATA1 DB 20 DUP(?) ;为变量DATA1分配20个字节的空间,初值为任意值 DATA2 DW ? ;为变量DATA2分配2个字节的空间,初值为任意值 DATA3 DB 20 DUP(30H) ;为变量DATA3分配20个字节的空间,初值均为30H
K3 DW 20H DUP(0)
K4 DD 50515253H
MOV AL,TYPE K1 ;等效于MOV AL,1
MOV AH,TYPE K2 ;等效于MOV AH,2

第4章汇编语言程序设计知识

第4章汇编语言程序设计知识

图4-1 分支程序结构
例4-1
JMP_128:MOV RL MOV JMP JMPTAB:AJMP AJMP ┇ AJMP A,R3 A DPTR,#JMPTAB @A+DPTR ROUT00 ROUT01 ┇ ROUT7F
128个子程序首址
二、分支程序

说明:此程序要求128个转移目的地址(ROUT00 ~
三、反汇编

将二进制机器语言程序翻译成汇编语言程序的过程 称反汇编。

汇编和反汇编的过程如图4-3所示。
汇编(汇编程序)
源程序 (汇编语言)
反汇编(汇编程序)
目标码 (机器语言)
图4-3 汇编和反汇编过程
§4.2.3 伪指令

伪指令不是真正的指令,无对应的机器码,在汇编 时不产生目标程序,只是用来对汇编过程进行某种 控制。
格式:字符名称
DATA
表达式
功能:与EQU类似,但有以下差别:
1、EQU定义的字符名必须先定义后使用,而DATA定义的 字符名可以后定义先使用。
ORG START
2000H MOV R0,#21H ;21H→(R0) MOV A,20H ; (20H)→(A) ANL A,#0FH ;A^#0FH→(A),取低位 MOV @R0,A ; (A)→((R0))),低 位置 21H 中 INC R0 ;R0+1→(R0) MOV A,20H ; (20H)→(A) SWAP A, ;A0~3-((A4~7),低位 与高位交换 ANL A,#0FH ;A^#0FH,取高位 MOV @R0,A ; (A)→((R0)),高位 置 22H
序执行程序。

分支程序又分为单分支和多分支结构。 多分支程序是首先把分支程序按序号排列,然后按序号值进 行转移。

第四章汇编语言语法

第四章汇编语言语法

LABEL FAR MOV AX,[SI] ,
3、段定义伪指令语句 、 SEGMENT…ENDS (1)段结构定义伪指令语句 SEGMENT ENDS 指令格式: 指令格式: 段名 逻辑段内容 段名 ENDS SEGMENT 定位类型 组合类型 分类名’ ‘ 分类名 ’
功能:将一个逻辑段的内容定义成一个整体。 功能:将一个逻辑段的内容定义成一个整体。 4种定位类型:PARA、BYTE、WORD和PAGE 种定位类型:PARA、BYTE、WORD和 6种组合类型:NONE、PUBLIC、COMMON、AT、STACK和MEMORY 种组合类型:NONE、PUBLIC、COMMON、AT、STACK和 (2)段分配伪指令语句 指令格式: CS:段名,DS:段名,SS:段名,ES: 指令格式:ASSUME CS:段名,DS:段名,SS:段名,ES:段名 功能:定义当前有效的4个逻辑段,指明段和段寄存器的关系。 功能:定义当前有效的4个逻辑段,指明段和段寄存器的关系。
1、数据定义伪指令语句 共有五条: DB、 DW、 DD、 DQ和 DT, 分别用来定义字节、 共有五条 : DB 、 DW 、 DD 、 DQ 和 DT , 分别用来定义字节 、 字 、 双 字、8字节和10字节。 字节和10字节。 10字节 指令格式: 指令格式:
变量名 变量名 助记符 助记符 操作数1 操作数2 操作数n 操作数1,操作数2,……操作数n 操作数 n ;注释 DUP(操作数1 操作数2 操作数n DUP(操作数1,操作数2,……操作数n) ;注释 操作数
第4章 汇编语言语法和 章 汇编语言语法和DOS功能调用 功能调用
4.1 汇编语言程序的格式 例4-1 试求小于100的所有非零偶数,并把结果存入以BUFF开始 的内存区。 1 2 3 4 5 MY_DATA SEGMENT BUFF DB 50 DUP(?) MY_DATA ENDS MY_CODE SEGMENT ASSUME CS:MY_CODE, DS: MY_DATA 6 START: MOV AX, MY_DATA 7 MOV DS, AX ; 定义数据段 ; 设置缓冲区 ; 定义数据段结束 ; 定义代码段 ; 规定CS和DS的内容 ; DS初始化为MY_DATA
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

其中,?表示只保留内存空间,未定义初始值。DUP子句的格式为:
重复次数 DUP (操作数,...,操作数)
2018/9/21
80x86汇编语言程序设计
说明:
(1)变量可以定义在任何段(包括代码段),但一般定义在数据段。
(2)用DW/DD/DQ/DF/DT定义的数据在内存按“低字节在低地址”的方式存放。例如: S1 S2 DB DW 'AB' 'AB' ; 等价于 S1 DB 41H, 42H ; 等价于 S2 DW 4142H
2018/9/21
80x86汇编语言程序设计
例:
P8
EQU DS:[BP+8] ┆ MOV AX, P8 等价于 ┆ EMP = 7 ┆ EMP = EMP + 1 ┆
MOV
AX, DS:[BP+8]
2018/9/21
80x86汇编语言程序设计
4. 变量定义伪指令
变量定义伪指令用来为数据分配内存空间,并设臵相应内存单元的初始值。 形式: 变量名 变量定义符 操作数,,...,操作数
80x86汇编语言程序设计
若该指令序列出现在段的开始,那么,在汇编相应指令时,地址 计数器的值如左侧所示。例如,第1条MOV指令始于偏移地址0, 由于该MOV指令是2字节,故下一条指令始于偏移地址2,等等。
2018/9/21
80x86汇编语言程序设计
4.2 基本伪指令
1. 处理器选择伪指令
在缺省方式下,MASM只承认8086指令。 为了使用更高的CPU指令,必须使用处理器选择伪指令,主要包 括: .8086 .486 .286 .486P .286P .586 .386 .586P .386P .686 .686P
; 字操作指令,将0作为1个字送到地址OP2 + 2
然而,下列两条指令是错误的: MOV MOV OP1, AX OP2, AL ; 类型不匹配 ; 类型不匹配

MOV
AX, 4C00H INT 21H END
2018/9/21
80x86汇编语言程序设计
(三) 段组定义伪操作
汇编程序自动地把名数据段组成一个段组DGROUP,以便程序在访问 数据段时使用一个数据段寄存器DS。 格式:grpname GROUP segname [, segname …] 说明:grpname为段组名,segname则为段名。 例2:DSEG1 SEGMENT WORD PUBLIC ‘DATA’ ┆ DSEG1 ENDS DSEG2 SEGMENT WORD PUBLIC ‘DATA’ ┆ DSEG2 ENDS DATAGROUP GROUP DSEG1, DSEG2 CSEG SEGMENT PARA PUBLIC ‘CODE’ ASSUME CS: CSEG, DS: DATAGROUP START: MOV DS, AX ┆ MOV AX, 4C00H INT 21H CSEG ENDS END START 2018/9/21 80x86汇编语言程序设计
2018/9/21
80x86汇编语言程序设计
2
组 合类 型( Combine ) —— 说明程序连接时的段合并方法 。 PRIVATE :本段与其他段没有逻辑关系,不与其他段合并,每 段都有自己的段地址。这是完整段定义伪指令的默认段组合方 式。 PUBLIC:连接程序把本段与所有同名同类别的其它段相邻的连 接在一起,然后为所有这些段指定一个共同的段地址,即合成 一个物理段符号定义伪指令
基本形式:
符号名
符号名
EQU
=
表达式
常数表达式
功能:给表达式指定一个等价的符号名。 说明:
(1)= 后的表达式只能是常数,对于字符或字符串,汇编时按整数处理。例如:
COUNT MOV = 20 ; 等价于MOV CX, 20
CX, COUNT
(2)EQU后的表达式可以是数值、字符串、寄存器名、指令助记符等。 (3)EQU不能重复定义,而 = 可重复定义,其作用域从定义点到重新定义之前。
其中,变量名是一个符号地址,表示其后操作数的首地址, 变量名为可选项,给出变量名只是为了按名存取其对应的内存单元。 变量定义符主要包括下列几种: • DB(Define Byte):定义字节,后面的每个操作数占1个字节。 • DW(Define Word):定义字,后面的每个操作数占1个字。 • DD(Define Dword):定义双字,后面的每个操作数占2个字。 操作数可以是常数、用EQU或=定义的符号常量、表达式、?和DUP子句等。
2018/9/21 80x86汇编语言程序设计
3 与简化段定义有关的预定义符号 如数据段的装入: ①数据段有段名时----完整段定义 MOV AX, DATA_SEG1 MOV DS, AX ②数据段没有段名时----简化段定义 MOV AX, @DATA MOV DS, AX 例 1: .MODEL SMALL .STACK 100H .DATA ┆ START .CODE START: MOV AX, @DATA MOV DS, AX
ARRAY2

--
2018/9/21
80x86汇编语言程序设计
(4)变量在定义后,其类型便被确定,使用时要注意类型匹配。例如:
OP1
OP2
DB
DW
?, ?
?, ?
下列两条指令执行不同类型的操作: MOV OP1 + 1, 0 ; 字节操作指令,将0作为1个字节送到地址OP1 + 1
MOV
OP2 + 2, 0
简化段定义伪操作(在程序一开始须有存储模型定义): .CODE[name]对于一个代码段的模型,段名为可选项。 对于多个代码段的模型,则应为每个代码段 指定段名。 .DATA .DATA ? .FARDATA[name]可指定段名,如不指定,则将以FAR_DATA命名。 .FARDATA ?[name]可指定段名,如不指定,则将以FAR_BSS命名。 .CONST .STACK [size]可指定堆栈段大小。如不指定,则默认值为1KB。
(3)当DW与DD后的操作数是地址表达式时,分别表示其16位偏移地址和32位分段地址(段 地址在高字,偏移地址在低字)。例如:
X ADDR1 DB DW 10 DUP (?) X ; ADDR1的内容(字)为变量X的偏移地址
ADDR2
DD
X
; ADDR2的高字为X的段地址,低字为X的偏移地址
2018/9/21

地址计数器的值表示当前偏移地址。在缺省情况下,段的偏移地 址从0开始。 例如,下列指令序列: 0: 2: 5: 7: A: mov and mov shr bl, al bl, 0fh bh, al bh, 4 ; 机器码为2字节 ; 机器码为3字节 ; 机器码为2字节 ; 机器码为3字节
2018/9/21
分别表示其后面的代码使用相应 CPU的指令。其中,结尾的'P'表示 使用特权指令。 若使用 32位 CPU 新增指令以及寄存器或内存寻址方式,则至少 要用.386伪指令。
2018/9/21
80x86汇编语言程序设计
2. 段定义伪指令 段定义由SEGMENT与ENDS伪指令实现,基本形式如下: 段名 SEGMENT [ align_type][combine_type][use_type][calss]
第4章汇编语言程序格式 讲授要点
常用伪指令与操作符。 汇编语言源程序的基本框架。 汇编语言程序的开发过程以及程序的调试方法。
2018/9/21
80x86汇编语言程序设计
4.1 地址计数器
汇编器在将源程序转换为目标程序的过程中,每汇编一个段,都 需要跟踪其中代码或数据的偏移地址,这就是地址计数器。
2018/9/21
80x86汇编语言程序设计
Model options允许用户指定三种选项: 高级语言接口、操作系 统、堆栈距离 例: .MODEL SMALL, C .MODEL LARGE, PASCAL, OS_DOS, FARSTACK
2018/9/21
80x86汇编语言程序设计
2
简化的段定义伪操作 简化的标准段有下列几种: . code 代码段 . initialized data 初始化数据段 . uninitialized data 末初始化数据段 . far initialized data 远初始化数据段 . far uninitialized data 远末初始化数据段 . constants 常数段 . stack 堆栈段 说明:这种定义方法主要为了与高级语言兼容,即便于被高级语言调用。
80x86汇编语言程序设计
例:ARRAY1 DB 2 DUP(0, 1, 2, ?) ARRAY2 DB 100 DUP(?) 例:DUP操作可以嵌套。 ARRAY3 DB 100 DUP(0, 2 DUP(1, 2), 0, 3)
ARRAY1 00 01 02 -00 01 02 --ARRAY3 00 01 02 01 02 00 03 ┆ 100个字节 00 01 02 01 02 00 03 重复100次 共700个字节
MEMORY:与PUBLIC 同义。
2018/9/21
80x86汇编语言程序设计
3 段字属性/寻址类型(Use)——这是为32位段设臵的属性。 对于16位x86CPU默认的是16位段,即USE16; 对于汇编32位x86CPU指令时,默认采用32位段,即USE32,但可以用 USE16指定标准的16位段。 编写运行于实地址方式(8086工作方式)的汇编语言程序,必须采 用16位段。即,对于80386及以上,可以设定为USE16或USE32,代表16 位寻址或 32 位寻址,当处理器是 386 级以上时,保护模式下缺省为 USE32,其它模式为USE16,对于386以下的CPU,不具备32位寻址方式, 只能是USE16。
相关文档
最新文档