汇编 第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
二、伪指令语句
伪指令语句又叫命令语句。 伪指令本身并不产生对应的机器目标代码。它仅 仅是告诉汇编程序对其后面的指令语句和伪指令 语句的操作数应该如何处理。
汇编 第四章伪指令及汇编语言源程序结构
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章 汇编语言程序设计
因此, 因此,对例子中的存储器地址作如下运 算: 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)
第四章-汇编语言程序的设计
第四章汇编语言程序设计本章的汇编语言程序设计的主要容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。
(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。
在介绍之前,我们还是来学习汇编语言的一些基础知识)4.1 汇编语言程序设计概述1、计算机的汇编语言以助记符表示的指令,每一条指令就是汇编语言的一条语句。
(汇编语言程序设计实际上就是使用汇编指令来编写计算机程序。
汇编语言的语句有严格的格式要求)2、汇编语言的语句格式MCS-51汇编语言的语句格式表示如下:[<标号>]: <操作码> [<操作数>]; [<注释>]标号:指令的符号地址,有了标号,程序中的其它语句才能访问该语句。
①标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。
②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。
(同一个标号在程序中只能定义一次,不能重复定义;一条语句可以有标号,也可以没有标号,所以是否有标号,取决于程序中是否需要访问该语句。
)操作码:规定语句执行的操作容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。
操作数:给指令的操作提供数据或地址。
注释:是对语句或程序段的解释说明。
(在单片机中,这四个部分怎么加以区分呢?使用分界符)分界符(分隔符):用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。
冒号(:)用于标号之后空格()用于操作码和操作数之间逗号(,)用于操作数之间,分割两个以上的操作数分号(;)用于注释之前。
第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
汇编语言程序
2020/12/27
16
4.2.4 表达式
在80x86汇编语言中,有数值表达式和地址 表达式两种。
数值表达式 由各种常量与数值运算符连接而成的式子,
称为数值表达式。数值表达式的计算结果是 一个数值,它只有大小而没有属性。 算术、关系、逻辑运算符
2020/12/27
17
地址表达式
由常量、变量、标号、寄存器和数值运算符、 地址运算符组合而成的有意义的式子,称为 地址表达式,单个变量、标号是地址表达式 的最简形式。由于变量和标号具有段 (SEG)、偏移(OFFSET)、类型 (TYPE)3种属性,这就决定了对它们的访 问是多种形式的。
Байду номын сангаас第四章 汇编语言程序
4.1 汇编语句 4.2 汇编语言数据 4.3 8086指令系统 4.4 汇编语言伪指令 4.5 汇编源程序结构 4.6 上机操作过程
2020/12/27
1
4.1 汇编语句
4.1.1 语句种类 汇编语言有3种语句类型,指令语句、伪指令语句、宏指令语
句。
指令语句是可执行语句,在汇编时可产生供机器执行的二进制
2020/12/27
3
2.名字
名字是一串字符序列,最多包含31个字符。在汇 编语言中,名字的应用范围很广,有寄存器名、变 量名、常量名、标号、指令名等等。在语句格式中 作为第一可选成分出现的<名字>,在不同的语句 中具有不同的含义。它在指令语句中表示标号,后 面必须跟有冒号“:”;而在伪指令语句中表示变 量名,常量名,段名,过程名,后面不能有冒号。 这是两种语句在格式上的主要不同之处。
指令语句中的标号和伪指令语句中变量名,段名, 过程名是一种符号地址,可作为汇编指令的一个操 作数,但常量名不是符号地址,不能用做目的操作 数。不同的标号、变量和常量不能同名。
汇编语言学习第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
第四章 汇编语言程序格式
26
6.字符串常数:用引号(单引号)括起来的一个 或多个字符,这些字符以它的ASCII码形式存储 在内存。
例如`B`在内存中为42H,`ABC`为41H 42H 43H。 在内存中的存储如图所示。
15
MOV CX,CC+1 LODS BYTE PTR [SI] DEC CX MOV AH,0 CLC AGAN:ADC SUM,AX LODS BYTE PTR [SI] LOOP AGAN MOV AH,4CH INT 21H 段定义 CODE ENDS END BEGIN
;预置次数 ;取一个数并修改指针 ;修改次数 ;清AX的高字节 ;清CF位 ;累加 ;再取数并修改指针 ;控制循环 ;完成,返回DOS
第四章 汇编语言程序格式
本章主要教学内容
l 汇编语言语句的种类及格式 l 汇编语言中数据的表示和定义 l 运算符、程序的段结构及定义 l 过程定义
1
教学目的: 掌握8086/8088中数据的表示及定
义、程序的段结构和定义、过程的定义
教学重点:数据的定义、程序的段结构和定义、
过程的定义
教学难点:数据的定义、程序的段结构及定义
低地址
41H 42H 43H ….
高地址
27
…..
常数在程序中可以用在以下几种情况: (1)作指令语句的源操作数 MOV AX, 0B2F0H ADD AH, 64H (2)在指令语句的直接寻址方式、变址(基址)寻 址方式或基址变址寻址方式中作位移量。 MOV BX,32H [SI] MOV 0ABH [BX],CX ADC DX,1234H [BP][DI] (3)在数据定义伪指令中使用 DB 10H DW 3210H
第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
汇编语言程序设计
第四章汇编语言程序设计(assembly languageprogramming)§4.1 汇编语言(assembly language)一.概述汇编语言:一种符号语言,它用助记符表示指令的操作码和操作数,用标号或符号代表地址、常量和变量,与机器语言几乎一一对应汇编语言程序:用汇编语言编写的程序汇编:把汇编语言源程序翻译成机器语言目标程序的过程汇编语言源程序手工汇编或汇编程序机器语言目标程序汇编程序:用来完成汇编工作的程序,有小汇编ASM宏汇编MASM动态调试程序DEBUG二.汇编语言的语句格式: [名称] 指令助记符 [操作数] [;注释]带方括号的项有时可没有,注释项完全可以没有每个部分用空格分开每行最多可有132个字符,但最好不要超过屏宽80语句可分成指令性语句和指示性语句(伪指令语句)指令性语句汇编后可生成机器码[标号:] 指令助记符 [操作数] [;注释]指示性语句指示汇编程序处理一些工作[名称] 伪指令(指示符) [操作数] [;注释]1.名称(或称标识符)给指令或存储单元地址起的名字,由字母、数字、字符组成字母:A~Z ,a~z数字:0~9字符:可打印+-*/=()[]〈〉;.' ’ ,_:?@$&(非打印空格制表符TAB 回车换行)(界符:,;:.()[]〈〉+-*/=?_@&$' ’界符用来表示某个标志的结束)数字不能作名称的第一个字符,圆点.仅能作第一个字符保留字不能作标识符($、?是保留字,与其它字符组合除外)名称最长为31个字符当名称后跟冒号,表示该名称是其后指令的标号,代表该指令的开始地址,其他指令可以用该标号作为转移地址当名称不跟冒号,它可能是标号或变量名,伪指令前的名称不跟冒号冒号隐含NEAR属性,例:供段内调用写成 OUTPUT:OUT DX ,AL供段间调用写成 OUTPUT OUT DX ,AL2.指令助记符8086/8088指令,也可以是伪指令,如果指令有前缀(LOCK、REP等)则前缀和指令用空格分开3.操作数指令执行的对象,可能有一、二个或没有名称指令助记符操作数注释RET ;返回(无操作数)COUNT: INC CX ;CX加1(1个操作数)MOV AL,BL ;ALBL(2个操作数)伪指令可有多个操作数COST DB 3,4,5,6,7,8 ;(6个操作数,用逗号分开)操作数可以是常数、寄存器名、标号、变量、表达式,MOV AX,[BP+4];(第二个操作数为表达式)4.注释可选项,使程序易读,汇编时不作处理注释前面要加分号,它可位于操作数之后,也可位于行首三.常量与变量1.常量,也叫常数,没有属性的纯数,汇编时已确定的值·数字常量为0~65535中的数(16位寄存器使用,伪操作可定义32位),进制加后缀说明,十进制加D(可省),二进制加B,八进制加Q,十六进制加H,若十六进制第一位为字母,则前头应加0·字符和字符串叫串常量,是ASCII码字符串,必须加单(或双)引号例:‘A’,“ABC”,汇编后变成41H,414243H2.变量,用于表达数值(或串)的标识符,有三个属性① 段属性(SEGMENT)② 偏移地址属性(OFFSET)③ 类型属性(TYPE),用DB、DW、DD定义§4.2 伪指令(pseudo-instruction)一.符号定义伪指令1.等值EQU格式:符号名 EQU 表达式用来给符号定义一个值,程序中出现该符号就用其值代替,EQU只能定义一次DATA EQU 1234 ;代表一个数XYZ EQU ALPHA[SI] ;代表一个地址2.等号 =格式:符号名 = 表达式意义与EQU一样,但程序中可重新定义符号的值EMP = 6 ;EMP代表6EMP =EMP + 1 ;EMP现在代表73.解除PURGE格式:PURGE 符号名(符号1,符号2,……,符号n)用于解除所定义的符号使该符号在以后的定义中有效例:原定义 TAB EQU 5可用 PURGE TAB 来解除然后可重新定义 TAB EQU 10二.数据定义伪指令用于预置存储器或定义变量1.定义字节DB格式:[变量名称] DB 表达式例:DATA1 DB 2,3,4,5;从DATA1单元开始存放4字节数据2.定义字DW格式:[变量名称] DW 表达式例:TAB DW 1234H;TAB单元内容为34H,TAB+1单元内容为12H 3.定义双字DD格式:[变量名称] DD 表达式每个数据二字(四字节)低位部分在低地址,高位部分在高地址·用DB/DW/DD定义的数每行不得超过16项,超过16项必须换行DB/DW/DD用法<1> SUM DB ? ;给SUM单元分配一个字节,内容未定<2> TAB DB 20 DUP(0);给TAB开始单元分配20字节,内容为0<3> TIME DW 100 DUP(?);给TIME开始单元分配100字,内容未定<4> ADDR DD TABLE ;TABLE的地址(双字)给ADDR例:DATA SEGMENTORG 100HTABLE DB 1,2,3,4ADDR DD TABLEDATA ENDS假设汇编后DS=13A2H(如果ADDR用DW定义,只得偏移量)(如果TABLE是变量,ADDR得地址,是常量,ADDR得数值)<5> LETTER DB ‘ABCDEFG’;将字符串以ASCII码形式填入LETTER开始的内存<6> HIS DB 3 DUP(‘WELCOME!’,0DH,0AH);从HIS单元开始重复3次存放WELCOME!和回车换行符4.标号LABEL格式:标号名 LEBEL 类型标号用于说明可执行代码在汇编语言程序中的位置,即符号地址,供调用和转移之用标号有三个属性段属性偏移量属性距离属性(即格式中的类型):NEAR(近程)和FAR(远程)NEAR:本标号为段内标号,调用本标号只提供偏移地址,段基址为当前代码段FAR:本标号为段间标号,调用本标号提供偏移地址和段基址一个具有NEAR属性的标号也可用标号加冒号作后缀,并排列在代码行的开头来隐含如 AGAIN LABEL NEARXOR AX,BUFF[BX]可写成 AGAIN:XOR AX,BUFF[BX]例:ROOT LABEL NEAR ;以下程序所用的ROOT标号是段内属性COMP PROC NEAR ;以下程序所用的过程下的标号是段内属性TIME PROC FAR ;以下程序所用的过程下的标号是段间属性三.运算符1.算术运算符+、-、*、/、MOD即加、减、乘、除、除法取余数(如19 MOD 7=5)操作数是数字,结果也是数字存储器地址运算时只有加减,例TAB+2、BETA-5等2.逻辑运算符AND、OR、XOR、NOT即与、或、异或、非操作数是数字,结果也是数字例:AND BX,DAT AND 0FEH3.关系算符EQ、NE、LT、GT、LE、GE即相等、不等、小于、大于、小于等于、大于等于若关系是假结果为0,若关系是真结果为0FFFFH例:MOV BX,PAD LT 3则PAD的值小于3时,汇编成MOV BX,0FFFFH否则,汇编成MOV BX,04.分析运算符可把存储器操作数分解成它的组成部分,如段值、段内偏移量、类型5.合成算符由已存在的存储器操作数生成一个段值与偏移量相同,而类型不同的新的存储器操作数以下讨论分析算符和合成算符1.取段基址SEG它加于一个变量或标号之前,回送段基址,例:ASSUME CS:SEG BEGIN ;令CS为BEGIN程序段段基址MOV AX,SEG VARN ;将VARN的段基址送AX2.取偏移量OFFSET它加于一个变量或标号之前,取其偏移量,例:MOV BX,OFFSET SUM ;将SUM的段内偏移量存入BX3.取类型码TYPE它加于一个变量或标号之前,取其类型代码DB DW DD DQ DT NEAR FAR1 2 4 8 10 -1 -2例:NG1 DB ‘A’,‘D’,3NG2 DW 88,265……MOV AL,TYPE NG1 ;NG1定义字节,AL 1MOV AL,TYPE NG2 ;NG2定义字,AL 24.取长度LENGTH它加于一个变量之前,取分配给变量的项数例:TAB DB 150 DUP(?);150项,150字节FUM DW 150 DUP(?);150项,300字节则,MOV CX,LENGTH TAB ;CX 150MOV AX,LENGTH FUM ;AX 150·注意:LENGTH返回的存储区必须用DUP()来定义,否则返回为1 5.取字节数SIZE它加于一个变量之前,取回变量所占字节总数,有SIZE = LENGTH * TYPE由上例,LENGTH TAB = 150,TYPE TAB = 1LENGTH FUM = 150,TYPE FUM = 2可知: SIZE TAB = 150SIZE FUM = 300以上5个叫数值返回算符6.类型指示PTR格式:类型 PTR 地址表达式表示PTR右边的(存储器)操作数是左边的类型,有:BYTE、WORD、DWORD、NEAR、FAR例:INC BYTE PTR [BX] ;将BX指向的单元字节加1MOV WORD PTR [DI],99 ;立即数99送DI指向的字中JMP NEAR PTR FOK ;以近程方式跳转到FOK(只取FOK偏移地址)7.指定符THIS(合成算符)用于定义当前所指单元中的类型格式:THIS 类型/距离经THIS定义过的标号具有当前汇编段、偏移量和所规定的类型或距离等属性,例:FOOB EQU THIS BYTE;下面的字类型变量FOOW在这里指定为字节型FOOBFOOW DW 120 DUP(?)定义后,对同一数据块(FOOB和FOOW有相同的段和段内偏移量)有两种类型访问FOOB时为字节操作,访问FOOW时为字操作ADD AL,FOOB[3] ;将数组第四字节与AL相加MOV AX,FOOW[4]将数组第五六字节组成的字送AX也可以这样来构成FOOB:FOOB EQU BYTE PTR FOOW又例:DATAF EQU THIS FARDATAN:MOV AX,FOO这时 JMP DATAN为近程转移JMP DATAF为远程转移8.段修改符:用于对某一地址表达式指定临时段基址,如MOV AX,ES:[BX];指定ES为BX的段基址,对当前指令有效9.短程符SHORT与NEAR、FAR功能类似,位移量一字节范围 -128~+127,对应一条短转移指令例:JMP SHORT LAB;转移到标号LAB的地址10.方括号 [ ]表示操作数(加方括号)是一个地址偏移量,不是数值格式:[表达式] 或者 [表达式][ ]例:MOV [BX],AX ;将AX内容送BX所指单元MOV [BX+7],AX ;将AX内容送BX+7所指单元MOV AX,[BX][SI] ;将BX+SI所指单元内容送AX11.取高/低字节HIGH/LOW用来分离常量的高/低字节,对存储器操作数无效例:DATA EQU 789AHMOV AL,HIGH DATA ;AL=78HMOV AL,LOW DATA ;AL=9AH四.段定义伪指令1.SEGMENT—ENDS格式:[段名] SEGMENT [定位类型] [组合类型] [‘类别名’]┇[段名] ENDS·段名·定位类型(Align),给出实际段地点的种类或段长度的信息<1> PARA 段起始地址从一个节(paragraph)的边界开始<2> BYTE 段地址可从任意绝对地址开始<3> WORD 段地址从任意一个字的边界开始<4> PAGE 段地址从某一页的边界开始(一页等于256字节)<5> INPAG 段长度小于一页未说明定位类型时则默认为PARA·组合类型(Combine),又称联合类型,程序中各程序段的连接和定位方法<1> PUBLIC 将段名相同的程序段(亦称模块)依此紧密连接,但彼此不相互覆盖<2> COMMON将段名相同的程序段连接,各段都从同一地址开始<3> AT表达式段定位在由表达式(结果必须是常数)所指定的节的边界上例:AT 1234H,则段地址被定位在物理地址为12340H处,如果希望从12345H开始,则在SEGMENT命令的下一行写上ORG 5AT 不能向前引用<4>STACK 表示这个段是运行期间的堆栈段<5>MEMORY 该段是相互连接的几个段中地址最高的段<6>NONE本段与其他段无组合关系未说明联合类型时则默认为NONE,不和别的段连接·‘类别名’(Class),也叫组名,加单引号,汇编后类别名相同的程序段代码集中在一起定位,形成一个统一的物理段,类别名可自定,约定的有CODE (代码段)、DATA(数据段)、STACK(堆栈段)、CONST(常数)、MEMORY(存储)等2.ASSUME段寄存器说明伪指令,指明所定义的段名所使用的段寄存器(告诉汇编程序在运行期间通过哪一个段寄存器寻址才能找到所要的指令和数据),本语句一般在定义的代码段中第一条出现格式:ASSUME 段寄存器:段名 [,…]例: ASSUME CS:CODE,DS:DATA ;用SEGMENT—ENDS定义ASSUME CS:SEG KGF,DS:SEG BEGIN;由算符定义ASSUME ES:NOTHING ;用关键字定义,表示不使用ES(取消ES段寄存器)(保留字NOTHING在这里作为一个段名参数,ASSUME NOTHING表示取消所有段寄存器,各个段寄存器只能在指令性语句中由MOV指令赋值)·ASSUME只是设定段寄存器与逻辑段的对应关系,并没给段寄存器装入实际值,所以程序中必须对DS、ES、SS赋值,而CS由系统赋值3.ORG定点伪指令(段内定位),用以确定下一条指令(或变量)在当前段中的偏移地址格式:ORG 表达式表达式以65536(64K)为模计算,超过64K则取其余数本语句前未定义过的变量不可出现在表达式中,表达式可包含$(程序计数器当前值)如:ORG OFFSET $+1000表达式必须为正值,若为负值,就会从当前段的地址高端开始表达式最好不要写成OFFSET $-1000,以免把汇编过的1000个字节覆盖掉ORG指令不能带标识符,如START:ORG 0和SKIP ORG 100都是错的例:CODE SEGMENT ;段起始ORG 100H ;本程序代码从偏移地址100H开始装入ASSUME CS:CODE ;装入代码段地址到CS中START:IN AL,30H ;程序段SHL AL,1OUT 32H,ALJMP STARTCODE ENDS ;程序段结束END START ;汇编结束例:DATA SEGMENTORG 50HDAT DW 1,2,$+1┇DATA ENDS注意DAT不能定义为字节,否则与$不匹配五.过程定义伪指令格式:过程名 PROC 属性┇过程体RET过程名 ENDP·过程名不可缺省,它和标号一样有三个属性:段属性、偏移地址属性、距离属性·距离属性在PROC后指定,有NEAR和FAR,如果希望过程能让别的程序调用,则必须是FAR属性·一个过程允许多个入口,入口处有标号,标号要说明距离属性例:延时100ms子程序DELAY PROC ;隐含NEARMOV BL,10 4TDLY1: MOV CX,2801 ;内循环延时10ms 10TWAIT0: LOOP WAIT0 9/5T DEC BL 2TJNZ DLY1 8/4TRET 8TDELAY ENDP六.结束伪指令·NAME:给模块(源程序)命名格式:NAME 模块名称它出现在源程序的最前端·END:汇编结束格式:END [标号名]它通知汇编程序本模块汇编到此结束标号名是可选项,若选取,应指向执行本程序的起始地址若一个源程序是多模块,只有主模块的END后加标号,子模块只有END七.宏指令宏指令:在汇编语言源程序中多次重复出现的程序段,用一个名字来定义,然后当成一条指令来使用宏汇编:源程序中的宏指令经汇编程序翻译后扩展成对应程序段的机器码宏指令用MACRO—ENDM来定义,如:CRLF MACROMOV DL,0DHMOV AH,02HINT 21H┇ENDM(CRLF作回车换行)§4.3 汇编语言程序设计(assembly language programming)一.设计要求1.程序简明、易读、易调试、易修改2.程序占用内存要少(包括程序长度及运行时所需空间)3.程序运行速度要快二.基本设计方法1.选择合适的计算方法2.绘制程序流程图3.编制程序4.上机调试三.汇编语言程序格式和基本结构一般一个完整的汇编语言程序至少应包括以下三个程序段简化段格式:.MODEL SMALL.STACK 64H.DATA……;紧接指令代码从偶地址开始存放.CODESTART: MOV AX,@DATAMOV DS,AX……END STARTDATA SEGMENT ‘DATA’┇数据段DATA ENDSSTACK SEGMENT ‘STACK’┇堆栈段STACK ENDSCODE SEGMENT ‘CODE’ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AX┇代码段CODE ENDSEND START程序的基本结构分为顺序结构、分支结构、循环结构和子程序结构(一)顺序结构一种简单程序,按顺序执行例1.将200H单元的低4位和高4位分别送入201H和202H单元的低4位,这二单元的高4位清0200HX X201H 0202H 0DATA SEGMENTORG 200HBCD DB 47HDB 2 DUP(?)DATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACK MOV SS,AXMOV AX,TOPMOV SP,AXMOV BX,OFFSET BCD MOV AL,[BX]AND AL,0FHMOV [BX+1],AL MOV AL,[BX]MOV CL,4ROL AL,CLAND AL,0FHMOV [BX+2],AL HLTCODE ENDS END START例2.将ADDR1和ADDR2两单元开始的二个16位无符号数相加,考虑到进位,将其结果存放在SUM开始的三个单元中DATA SEGMNETADDR1 DW 7854HADDR2 DW 9981HSUM DB 3 DUP(0)DATA ENDSSATCK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV AX,ADDR1ADD AX,ADDR2MOV WORD PTR SUM,AXADC SUM+2,0HLTCODE ENDSEND START例3.查表将DATA1单元中字节类型数据(0~0FH)转换成ASCII码,并存入ASCII单元中DATA SEGMENTASCTAB DB 30H,31H,32H,33H,34H,35H,36H,37HDB 38H,39H,41H,42H,43H,44H,45H,46HDATA1 DB 09HASCII DB ?DATA ENDSSTACK SEGMENT STACKDW 10 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART PROC FARASCTAB 30 031 1┇93941 A42 B┇46 F┇ASCIIPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV BX,OFFSET ASCTABMOV AL,DATA1XLATMOV ASCII,ALRETSTART ENDPCODE ENDSEND START例4.将200H和201H单元字节的高4位对调,低4位不变CODE SEGMENT200H201HORG 200HDATA1 DB 0F3H,47HASSUME CS:CODE,DS:CODESTART:MOV AX,CODEMOV DS,AXMOV CL,4MOV AX,WORD PTR DATA1 ;AX=47F3HROL AX,CL ;AX=7F34H ROL AH,CL ;AX=F734H ROL AL,CL ;AX=F743H MOV WORD PTR DATA1,AXHLTCODE ENDSEND START(二)分支结构通过判断产生分支,借助于条件转移指令跳转到相应的分支地址执行分支程序分支程序由三部分组成① 测试部分,负责产生决定分支的条件② 定向部分,根据测试条件是否满足,决定程序是否分支③ 标注部分,标明分支的去向利用跳转表也可使程序转移到分支地址例1.16位二进制补码X在DATA1单元,求其绝对值送DATA2单元(设X≠8000H)∣X∣= X,X≥0-X, X<0DATA SEGMENTDATA1 DW 9F87HDATA2 DW ?DATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STA STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV AX,DATA1AND AX,AXJNS ABS0NEG AXABS0: MOV DATA2,AXHLTCODE ENDSEND START例2.多重分支学生成绩按分数段划分为:A、90~100(5AH~64H)B、80~89 (50H~59H)C、70~79 (46H~4FH)D、60~69 (3CH~45H)E、 <60 ( <3CH)已知分数存放在MARK单元,请用ASCII码的A、B、C、D、E去代表MARK单元中的分数所属的段,并存于GRADE单元DATA SEGMENTMARK DB 81GRADE DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXMOV BX,OFFSET MARKMOV AL,[BX]CMP AL,3CHJC LPECMP AL,46HJC LPDCMP AL,50HJC LPCCMP AL,5AHJC LPBMOV AL,41H ;‘A’JMP SHORT DONELPB: MOV AL,42H ;‘B’JMP SHORT DONELPC: MOV AL,43H ;‘C’JMP SHORT DONELPD: MOV AL,44H ;‘D’JMP SHORT DONELPE: MOV AL,45H ;‘E’DONE: MOV BX,OFFSET GRADE MOV [BX],ALHLTCODE ENDSEND START法2:直接查表转换(顺序结构)DATA SEGMENTTAB DB ‘EEEEEEDCBAA’MARK DB 81GRADE DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXMOV BX,OFFSET TABMOV AL,MARKMOV AH,0MOV CL,10DIV CLXLATMOV GRADE,ALHLTCODE ENDSEND START(三)循环结构使机器重复执行一系列指令,是一种闭合的分支结构循环程序由四部分组成① 初始化部分(或预置部分),负责设置循环初值② 处理部分,循环过程的主体③ 控制部分,修改初值,判断是否循环循环次数由一计数器控制循环次数由某一指定条件是否满足来决定④ 结束部分,处理循环程序的最后结果例1.将DTAB单元开始的一组字节补码数(≤255个)求平均值,结果存入AVE单元,若结果为负,在SYM置FFH否则置0DATA SEGMENTDTAB DB 0FDH,0FCH,05H,0F8H,……DB 08H,25H,83H,97H,……COUNT EQU $-DTABAVE DB ?SYM DB ?DATA ENDSSTACK SEGMENT STACKSTA DB 20 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK AVER PROC FARSTART:PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXLEA BX,DTABMOV CX,COUNTXOR DX,DXNEXT: MOV AL,[BX]CBWADD DX,AXINC BXLOOP NEXTMOV AX,DX MOV CL,COUNTIDIV CLMOV AVE,ALMOV SYM,0AND AL,ALJNS DONEMOV SYM,0FFHDONE: RETAVER ENDPCODE ENDSEND START循环控制方法:循环次数由计数器控制例2.将8位二进制小数规格化设需规格化的小数在DATA1单元,要求规格化后使其最高位为1,并存入DATA2单元,办法是把小数左移至最高为位为1为止,左移次数存入DATA3单元,若小数是0,则在DATA2和DATA3单元存入0示例:DATA1 DATA2 DATA322H 88H 02H01H 80H 07HCBH CBH 00H00H 00H 00HDATA SEGMENTDATA1 DB 22HDATA2 DB ?DATA3 DB ?DATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STA STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV CL,0MOV AL,DATA1 ;取数AND AL,AL ;设ZF、SF标志JZ DONECHKSF:JS DONEINC CLADD AL,AL ;左移一位JMP SHORT CHKSFDONE: MOV DATA2,ALMOV DATA3,CLHLTCODE ENDSEND START循环控制方法:循环次数由某一指定条件是否满足来决定例3.多重循环将n个无符号字节数从小到大排序,方法是依此比较相邻两单元的数,若前小后大不交换第一轮比较n-1次,最大数沉底(高地址)第二轮比较n-2次,次大数沉到最大数上面第n-1轮比较完若在某一轮比较时没有出现交换,说明顺序已排好,不必后续比较,故设交换标志AH=1代表不交换,AH=2代表有交换DATA SEGMENTLIST DB 18,6,11,3,1,2,3,9,8,7,6 DB 111,110,99,112,115,114,113,98,96,97 COUNT EQU $-LISTDATA ENDSSTACK SEGMENT STACKSTA DW 10 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSET PROC FARSTART:PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV DX,COUNT-1 ;n-1轮(外循环)EXGO:MOV CX,DX ;每轮次数(内循环)MOV AH,01H ;交换标志MOV BX,OFFSET LIST ;数据块首址INGO: MOV AL,[BX]INC BXCMP AL,[BX]JC NEXT ;数1小,不交换XCHG AL,[BX] ;数1>数2,交换DEC BXXCHG AL,[BX]INC BX ;恢复数据指针MOV AH,02H ;有交换标志NEXT: LOOP INGODEC DXJZ DONEDEC AHJNZ EXGODONE: RETSET ENDPCODE ENDSEND START(四)子程序结构基本要求:① 子程序的开始(入口处)应给予一个标号,结束处有返回指令② 通用子程序要说明入口条件(入口参数)和出口条件(出口参数)③ 调用子程序要注意保护现场和恢复现场调用—返回的堆栈操作:CALL target ;段内SPSP-2,[SP+1,SP] IP,IPIP+disp段间SPSP-2,[SP+1,SP] CS,CSsegSPSP-2,[SP+1,SP] IP,IPoffsetRET ;段内IP [SP+1,SP],SPSP+2;段间IP [SP+1,SP],SPSP+2CS [SP+1,SP],SPSP+2RET n ;如上操作后SPSP+n·子程序入口标号应说明距离属性·对于一个FAR过程,过程初必须先保护程序段前缀中的中断指令INT 20H 的断点地址(DS:0000),它是一个程序正常结束退出的中断处理程序例1.将内存200H单元开始的一个五字节十六进制数显示出来(低位在低地址)DATA SEGMENTORG 200HNUM DB 9AH,78H,56H,34H,12HDATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV BX,5MOV AX,STACKMOV SS,AXMOV SP,TOPMOV SI,OFFSET NUMNEXT: MOV DH,[SI+BX-1] ;(不用AL,因调用MOV DL,DH ; display返回时DL→AL)MOV CL,4ROL DL,CLAND DL,0FHCALL DISPLAYMOV DL,DHAND DL,0FHCALL DISPLAYDEC BXJNZ NEXTMOV AX,4C00HINT 21HDISPLAY PROC NEARADD DL,30HCMP DL,3AHJB OKADD DL,07H;(如果DL=3AH,3AH+7=41H是‘A’)OK: MOV AH,02HINT 21HRET。
第四章汇编语言语法
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
第四章:8086汇编语言程序设计
第 4章
汇编语言程序设计
汇编语言程序设计
(2)尽量采用循环结构和子程序 (2)尽量采用循环结构和子程序 采用循环结构和子程序可以使程序的长度减少、 采用循环结构和子程序可以使程序的长度减少、 占用内存空间减少。 占用内存空间减少。 多重循环,注意各重循环的初值和循环结束条件, 多重循环,注意各重循环的初值和循环结束条件, 死循环”现象; 避免出现 “死循环”现象; 通用的子程序, 通用的子程序,除了用于存放子程序入口参数的寄 存器外, 存器外,子程序中用到的其它寄存器的内容应压入堆栈 进行现场保护, 进行现场保护,并要特别注意堆栈操作的压入和弹出的 平衡; 平衡; 中断处理子程序除了要保护程序中用到的寄存器外, 中断处理子程序除了要保护程序中用到的寄存器外, 还应保护标志寄存器。 还应保护标志寄存器。
1、汇编语言的语句格式
汇编语言源程序是由汇编语句(即指令)组成的。 汇编语言源程序是由汇编语句(即指令)组成的。 汇编语言一般由四部分组成。 汇编语言一般由四部分组成。
其典型的汇编语句格式: 其典型的汇编语句格式: 标号: 标号:操作码
例如: 例如: START: START:MOV AL,30H AL,30H ;(AL)=30H (AL)=30H 30
第 4章
汇编语言程序设计
汇编语言程序设计
经过任务分析、算法优化后, 经过任务分析、算法优化后, 在微型机上使用编 首先, 首先,要对单片机应用 就可以进行程序的总体构思, 就可以进行程序的总体构思, 辑软件编写源程序, 辑软件编写源程序, 系统预完成的任务进行 确定程序的结构和数据形式, 确定程序的结构和数据形式, 在使用交叉汇编的 深入的分析, 深入的分析,明确系统 并考虑资源的分配和参数的 方法对源程序进行 的设计任务、 的设计任务、功能要求 计算等。 计算等。然后根据程序运行 汇编, 汇编,然后采用串 和技术指标。其次, 和技术指标。其次,要 的过程, 的过程,勾画出程序执行的 算法是解决具体问题 行通信的方法, 行通信的方法,把 对系统的硬件资源和工 逻辑顺序, 。同一个问题 逻辑顺序,用图形符号将总 的方法。 的方法 汇编得到的目标程 作环境进行分析。 ,, 作环境进行分析。这是 体设计思路及程序流向绘制 的算法可以有多种, 的算法可以有多种 序传送到单片机内, 序传送到单片机内 单片机应用系统程序设 在平面图上, 在平面图上,从而使程序的 结果也可能不尽相同, 结果也可能不尽相同, 并进行程序运行和 计的基础和条件 结构关系直观明了, 结构关系直观明了,便于检 所以, 调试 所以,应对各种算法 查和修改。 查和修改。 进行分析比较,并进 进行分析比较, 行合理的优化
第4章 汇编语言程序设计
例: 三字节无符号数相加,其中被加数在内部RAM 的50H、51H和52H 单元中;加数在内部RAM的53H、 54H和55H单元中;要求把相加之和存放在50H、 51H和52H单元中,进位存放在位寻址区的00H位中。
内部RAM
50H 51H 52H
高字节 低字节
53H 54H 55H
R1→55H
结 束
常用程序结构:
顺序程序、分支程序、循环程序。
4-3
顺序程序
顺序程序又称简单程序,程序走向只有一条路径。 例:双字节求补程序(设数据在R4R5中): 开 始 CLR C MOV A,R5 ;取低字节 处 理 CPL A ADD A,#01H ;低字节变补 处 理 MOV R5,A MOV A, R4 ;取高字节 处 理 CPL A ADDC A,#00H ;高字节变补 结 束 MOV R4,A
片内 RAM 42H 0 十 41H 0 个 40H 十 个
4 -- 4
分支程序(参见书P49-57)
分支程序就是在程序执行过程中要判 断某些条件,当条件成立后程序转移到不 同的功能处运行。在MCS-51单片机中条件 转移指令都可以用在分支程序中。 (复习、参见书P38---39) (1)测试条件符合转移,如: JZ、JNB …等
汇编的主要任务:
1)确定程序中每条汇编语言指令的指令机器码。 2)确定每条指令在存储器中的存放地址。 3)提供错误信息。 4)提供目标执行文件(*.OBJ/*.HEX)和 列表文件(*.LST)。
一、汇编语言指令类型:
1. 机器指令: 指令系统中的全部指令,每条指令有对应的机器代码。 2. 伪指令: 汇编控制指令,仅提供汇编信息,没有指令代码。
在源程序中只能有一条END指令
第四章 汇编语言一
4-3
DOS系统功能调用
例:程序结束后返回DOS操作系统
MOV AH,4CH INT 21H
M1 M2
01H 02H 05H 00H 05H 00H 05H 00H 41H 42H 43H 44H 42H 41H 44H 43H
M3
M4
4-2 伪指令
DATA M1 M2 M3 M4 DATA SEGMENT DB ‘ABCDEF’;字符串必须用DB定义 DW 3 DUP(0), 2 DUP( 6,7) ; DW‘AB’ ;每个元素仅允许为2个字符 DW 100 DUP(?); ? 预留存储空间 ENDS
数据段
附加段
程序段
堆栈段
代 码 段
4-1 汇编语言源程序 1、汇编语言:使用助记符、符号地址和标号编程
例
START:MOV AL,TABLE 标号 符号地址
2、汇编程序:
.ASM 汇编语言 源程序 汇编 程序 .OBJ 目标 程序 链接 程序 .EXE 可执行 程序
4-1 汇编语言源程序
二、汇编语言程序设计与执行过程
第四章 汇编语言程序设计 主要内容:
• 汇编语言源程序的结构 • 汇编语言语句格式 • 伪指令 • 功能调用 • 汇编语言程序设计
第四章 汇编语言程序设计 4-1 汇编语言源程序
一、源程序的结构:
数 据 段
DATA X Y Z DATA CODE SEGMENT DB 30H DB 40H DB ? ENDS SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,X ADD AL,Y MOV Z,AL MOV AH,4CH INT 21H CODE ENDS END START
第4章 汇编语言程序格式
WORD——从字边界(偶数地址)开始
DWORD——从双字边界(4的倍数地址)开始 PAGE——从低8位物理地址为0处开始
(2) 组合类型(combine_type)说明程序连接时的段合并方法,可以是:
PRIVATE——私有段,不与其它模块中的同名段合并——默认值 PUBLIC——公有段,连接时与其它模快中的同名段合并成一个段
4.2.1 处理机选择伪操作
.8086 . 286 . 286P . 386 . 386P 选择8086指令系统 选择80286指令系统 选择保护模式下的80286指令系统 选择80386指令系统 选择保护模式下的80386指令系统
. 486
. 486P . 586
选择80486指令系统
选择保护模式下的80486指令系统 选择Pentium指令系统
CS:CSEG,DS:DATAGROUP
START:MOV MOV ……
AX,DATAGROUP DS,AX
4.3.3 程序开始和结束伪操作
1. 开始伪操作
在程序的开始可以用NAME或TITLE作为模块的名字,NAME的格式是: NAME 模块名
如果程序中没有使用NAME伪操作,则也可使用TITLE,其格式为: TITLE text
例4.2 .MODEL SMALL .STACK 100h .DATA 例4.3 .MODEL SMALL .STACK 100h .CONST …… .DATA …… AX,@DATA DS,AX .CODE START: MOV AX,DGROUP
……
.CODE START: MOV MOV …… MOV INT END AX,4C00H 21H START
③ uninitialized data
第四章 程序设计
…………
R3=7,转向SUBR7
拟以多向分支 的形式实现
MOV DPTR, #JMPTAB
MOV A, R3
ADD A, R3 JMP @A+DPTR JMPTAB: AJMP SUBR0 ;转移指令表 AJMP SUBR1 …… AJMP SUBR7
三、循环结构与循环程序设计
循环结构使程序简练,大大节省存储空间。 循环程序包含四部分: 1、初始化部分 (循环计数器、变量置初值) 2、循环处理部分(主体,需要重复执行的部分) 3、循环控制部分(修改地址指针、修改变量、检测 循环结束条件)
TABLE: DB
…………
五、子程序设计
经常重复使用的程序宜设计成子程序。子程序 在结构上应具有通用性和独立性,编写子程序应 注意以下几点:
1. 子程序应取名,常用标号作为其名称,也代表子程序的入 口地址。 2. 主程序调用子程序必须有LCALL等指令实现,子程序返回 必须在末尾处执行RET等指令。
3. 调用子程序应特别注意保护现场和恢复现场。LCALL等指 令只自动对PC指针进行保护和恢复,其它重要内容,需要 客户自行编写现场保护与恢复的软件。 4. 调用子程序,要能正确传送参数,即要满足入口条件和出 口条件。
书例4.2.17-----看5分钟 该程序几个特点: 1. 求平方通过子程序实现。
(2)循环次数未知的程序
例2、设用户用键盘输入长度不超过100字节的字符串放在8031单片 机外部RAM以20H为首地址的连续单元,该字符串用回车符CR (‘CR’= 0DH)作为结束标志,要求统计此字符串的长度并存入内 部RAM的1FH单元中。
解:从首单元开始取数,每取一数判断其是否为‘CR’,是则结束。 ORG 1000H
第四章 汇编语言程序设计基础
4.2.2 分支程序的设计方法 ★条件控制 ★逻辑尺控制 ★地址跳转表控制
1. 条件控制——利用比较和条件转移指令实现分支,是最常用的 程序设计方法。
பைடு நூலகம்
例如,求解函数:
练习题2. 编写程序,比较两个字符串STRING1和STRING2所 含字符是否完全相同,若相同则显示“MATCH”,若不同则显示 “NO MATCH”。 答案: datarea segment string1 db ‘asfioa’ ;定义字符串STRING1 string2 db ‘xcviyoaf’ ;定义字符串STRING2 mess1 db ‘MATCH’,’$’ ;定义显示字串“MATCH” mess2 db ‘NO MATCH’,’$’ ;定义显示字串“NO MATCH” datarea ends prognam segment main proc far assume cs:prognam,ds:datarea start: push ds ;将ds:00入栈 sub ax,ax push ax mov ax,datarea ;装填数据段及附加段 mov ds,ax mov es,ax
程序流程图
mov ch,4 rotate: mov cl, 4 rol bx,cl mov al,bl and al,0fh add al,30h ;’0’-’9’ ASCII 30H-39H cmp al,3ah jl printit add al,7h ;’A’-’F’ ASCII 41H-46H printit: mov dl,al mov ah,2 int 21h dec ch jnz rotate
例4.3 将首地址为A的N字数组按照从小到大的次序整序(气 泡算法,多重循环) A dw 32,85,16,15, 8
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(2)组合类型(combine_type) 组合类型(combine_type)
功能: 功能: 说明程序连接时的段合并方法。 说明程序连接时的段合并方法。
PRIVATE: 私有段),连接时不与其他模块中的同名分 PRIVATE:(私有段),连接时不与其他模块中的同名分 ), 段合并(默认的组合类型) 段合并(默认的组合类型) PUBIC:可把不同模块中的同名段相连接形成一个段, PUBIC:可把不同模块中的同名段相连接形成一个段, 连接次序由命令决定。 连接次序由命令决定。 COMMON:可把不同模块中的同名段重叠而形成一个段, COMMON:可把不同模块中的同名段重叠而形成一个段, 由于各同名分段有相同的起始地址,所以产生覆盖。 由于各同名分段有相同的起始地址,所以产生覆盖。连接的 长度为各分段的最大长度。 长度为各分段的最大长度。 MEMORY: PUBIC同义。 MEMORY:与PUBIC同义。 同义 STACK: STACK:把不同模块中的同名段组合而形成一个堆栈段 段长为各段长度的总和。 ,段长为各段长度的总和。
.586P 选择保护模式下的 Pentium 指令系统 • 这类伪操作一般放在整个程序的最前面。如不给出,则汇 这类伪操作一般放在整个程序的最前面。如不给出, 编程序认为其默认值为.8086 使用时在类型前加一“ 号。 .8086, 编程序认为其默认值为.8086,使用时在类型前加一“.”号5
4.2.2段定义伪操作 4.2.2段定义伪操作
第4章
汇编语言程序格式
4.1汇编程序功能 4.1汇编程序功能
⒈汇编语言程序的开发过程 汇编程序属于系统软件 ⒉汇编程序属于系统软件 汇编语言源程序的基本组成单位: ⒊汇编语言源程序的基本组成单位:语句 汇编语言源程序中的三种语句: ⒋汇编语言源程序中的三种语句: • 指令语句 • 伪指令语句 • 宏指令语句
1.段定义伪操作:把标号和变量(代码段和数据段的符号地址) 段定义伪操作:把标号和变量(代码段和数据段的符号地址) 段定义伪操作 的偏移地址通过目标模块传送给连接程序, 的偏移地址通过目标模块传送给连接程序,以便连接程序把不 同的段和模块连接在一起,形成一个可执行程序。 同的段和模块连接在一起,形成一个可执行程序。 格式: 定位类型,组合类型,使用类型,类别] 格式:段名 SEGMENT [定位类型,组合类型,使用类型,类别] …… 段名 ENDS 2.ASSUME伪操作:指明段和段寄存器之间的关系。 伪操作:指明段和段寄存器之间的关系。 伪操作 段和段寄存器之间的关系 格式: 格式:ASSUME 段寄存器:段名, 段寄存器:段名,……,段寄存器:段名 ,段寄存器:
1
汇编语言程序的开发过程
汇编程序 连接程序
如LINK
汇编语言源程序 .ASM
如MASM
目标程序 .OBJ
可执行程序 .EXE
调试程序
如DEBUG
调试和运行程序
2
• 2.
•
汇编程序的主要功能
检查源程序,给出出错信息。 检查源程序,给出出错信息。
• 产生目标文件(.obj)和列表文件(.lst)。 产生目标文件(.obj)和列表文件(.lst) • 展开宏指令。 据定义及存储器分配伪操作 4.2.4数据定义及存储器分配伪操作
格式: 变量] 操作数[,操作数, ] [,操作数 注释] 格式:[变量] 助记符 操作数[,操作数,…] [;注释] 变量:用符号地址表示(与指令语句前的标号作用相同) 变量 : 用符号地址表示 ( 与指令语句前的标号作用相同 ) , 它可有 可无。 可无。 注释:字段用来说明该伪操作的功能,它也是可有可无的。 注释:字段用来说明该伪操作的功能,它也是可有可无的。 助记符: 助记符:DB DW DD DF DQ DT 这些助记符可把跟在其后的数据存入指定的存储单元中, 这些助记符可把跟在其后的数据存入指定的存储单元中 , 形成 初始化数据;或者只分配存储空间而并不存入确定的数据, 初始化数据;或者只分配存储空间而并不存入确定的数据,形成 未初始化数据。DW和DD伪操作还可存储地址 DF伪操作则可存储 伪操作还可存储地址, 未初始化数据。DW和DD伪操作还可存储地址,DF伪操作则可存储 16位段地址及32位偏移地址组成的远地址指针 位段地址及32位偏移地址组成的远地址指针。 由16位段地址及32位偏移地址组成的远地址指针。 DB:定义字节,其后的每个操作数都占有一个字节。 DB:定义字节,其后的每个操作数都占有一个字节。 DW:定义字,其后的每个操作数都占有一个字, DW:定义字,其后的每个操作数都占有一个字,存储偏移地址 DD:定义双字,其后的每个操作数都占有两个字,存储整个地址( DD:定义双字,其后的每个操作数都占有两个字,存储整个地址( 16偏移地址 16段地址 偏移地址+ 段地址) 16偏移地址+16段地址) DF:定义6个字节的字,每个操作数都占有48 48位 存放远地址。 DF:定义6个字节的字,每个操作数都占有48位,存放远地址。 DQ:定义4个字,每个操作数都占有4个字,存放双精度浮点数。 DQ:定义4个字,每个操作数都占有4个字,存放双精度浮点数。 DT:定义10个字节,其后的每个操作数都占有10个字节, 10个字节 10个字节 DT:定义10个字节,其后的每个操作数都占有10个字节,形成压缩 13 BCD码 存储整个地址(32偏移地址 16段地址 偏移地址+ 段地址) 的BCD码。存储整个地址(32偏移地址+16段地址)
(4)类别(‘class’):在引号中给出连接时组成段组的类 类别( class ) 型名。类别说明并不能把相同类别的段合并起来, 型名。类别说明并不能把相同类别的段合并起来,但在连 接后形成的装入模块中,可以把它们的位置靠在一起。 接后形成的装入模块中,可以把它们的位置靠在一起。
10
• 2.存储模型与简化段定义伪操作 2.存储模型与简化段定义伪操作 1)MODEL伪操作: MODEL伪操作: 伪操作
格式: 格式:. MODEL 存储模型 [,模型属性] 模型属性]
七种存储模型:TINY、SMALL、MEDIUM、COMPACT、LARGE、 七种存储模型:TINY、SMALL、MEDIUM、COMPACT、LARGE、 HUG、 HUG、FLAT 三种模型属性选项: 三种模型属性选项:高级语言接口选项 操作系统选项 堆栈距离选项:NEARSTACK、 堆栈距离选项:NEARSTACK、FARSTACK 参考书122 122页 2)简化的段定义伪操作:参考书122页
3
4.2伪操作 4.2伪操作
伪操作: 伪操作 : 又称为伪指令是汇编程序对源程序进行汇编时 处理的操作,完成处理器选择、存储模式定义、 处理的操作 , 完成处理器选择 、 存储模式定义 、 数据 定义、存储器分配、指示程序开始结束等功能。 定义、存储器分配、指示程序开始结束等功能。 伪操作的种类有如下几种: 伪操作的种类有如下几种: • 处理器选择伪操作 • 段定义伪操作 • 程序开始和结束伪操作 • 数据定义及存储器分配伪操作 • 表达式赋值伪操作 • 地址计数器与对准伪操作 • 基数控制伪操作
9
(3)使用类型(use_type) 使用类型(use_type)
功能:说明使用16位寻址方式还是32位寻址方式 功能:说明使用16位寻址方式还是32位寻址方式 16位寻址方式还是32 类型 USE16 USE32 寻址方式 16位 16位 32位 32位 段长 不超过64KB 不超过64KB 可达到4GB 可达到4GB 段地址 16位 16位 16位 16位 偏移地址 16位 16位 32位 32位
DS → ES SS→ SS→ CS→ CS→
文
PSP
头
件
装 入 模 块
EXE程序的内存映象图
7
(1)定位类型(align_type) 定位类型(align_type)
功能:说明段的起始地址应有怎样的边界值。 功能:说明段的起始地址应有怎样的边界值。 段的起始地址应有怎样的边界值 BYTE:该段可以从任意地址开始,起始偏移地址可能不是0 BYTE:该段可以从任意地址开始,起始偏移地址可能不是0 WORD:该段必须从字的边界开始, WORD:该段必须从字的边界开始,即段起始地址必须为偶数 DWORD:该段必须从双字的边界开始,即段起始地址的最低 DWORD:该段必须从双字的边界开始, 十六进制数位必须为4的倍数。 十六进制数位必须为4的倍数。 PARA:指定段的起始地址必须从小段边界开始, PARA:指定段的起始地址必须从小段边界开始,即段起始地 址的最低的16进制数位必须为0 偏移地址可从0 址的最低的16进制数位必须为0。偏移地址可从0开始 16进制数位必须为 PAGE:该段必须从页的边界开始,段起始地址的最低两个16 PAGE:该段必须从页的边界开始,段起始地址的最低两个16 进制数位必须为0 该地址能被256整除)。 进制数位必须为0(该地址能被256整除)。 256整除 定位类型的默认项为PARA。 定位类型的默认项为PARA。 PARA
3)段组定义伪操作: 段组定义伪操作:
格式: 格式:段组名 GROUP 段名[ 段名] 段名[,段名]
汇编语言自动的把各数据段组成一个段组DGROUP, 汇编语言自动的把各数据段组成一个段组DGROUP,以便程 DGROUP 序在访问各数据段时使用一个数据段寄存器(DS)。 序在访问各数据段时使用一个数据段寄存器(DS)。
4
4.2.1处理器选择伪操作 4.2.1处理器选择伪操作
由于80X86的所有处理器都支持8086/8088指令系统, 由于80X86的所有处理器都支持8086/8088指令系统,但每一 80X86的所有处理器都支持8086/8088指令系统 种高档的机器的机型又都增加一些新的指令, 种高档的机器的机型又都增加一些新的指令,因此在编写 程序的时候要告诉汇编程序应该选择哪一种指令系统。 程序的时候要告诉汇编程序应该选择哪一种指令系统。 .8086 .286 .286P .386 .386P .486 .486P .586 选择 8086 指令系统 选择 80286 指令系统 选择保护模式下的 80286 指令系统 选择 80386 指令系统 选择保护模式下的 80386 指令系统 选择 80486 指令系统 选择保护模式下的 80486 指令系统 选择 Pentium 指令系统