汇编语言的语句类型
汇编语言
汇编语言汇编语言实质上是机器语言的符号表示,即用助记符(指令功能的英文缩写)代替了机器语言指令的二进制代码。
用汇编语言按着规定的语法规则编写的程序称为汇编语言源程序(*.asm)。
汇编语言源程序中的汇编指令与指令的机器码(目标代码)是一一对应的。
汇编语言2高级语言是面向过程的语言,它不依赖于特定的机器,独立于机器,高级语言编写的程序由一系列编程语句和相应的语法规则构成,编程方法更适合于人们的思维习惯,易于理解和阅读,程序本身具有可移植性,通用性强高级语言的缺点是编译程序和解释程序复杂,占用内存空间大,与汇编语言程序相比,经编译后产生的目标程序长,执行速度慢高级语言3汇编语言上机处理过程4汇编语言汇编语言的程序格式伪指令程序设计基本方法5汇编语言的程序格式汇编语言程序的结构汇编语言语句类型及格式汇编语言的数据与表达式6源程序的一般格式STACK SEGMENT┇STACK ENDSDATA SEGMENT┇DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:…┇CODE ENDSEND START7例题一个两字相加的程序。
DATA SEGMENT ;定义数据段DATA1 DW 1234H ;定义被加数DATA2 DW 5678H ;定义加数DATA ENDS ;数据段结束ESEG SEGMENT ;定义附加段SUM DW 2 DUP(?);定义存放结果区ESEG ENDS ;附加段结束CODE SEGMENT ;定义代码段;下面的语句说明程序中定义的各段分别用哪个段寄存器寻址ASSUME CS:CODE, DS:DATA,ES:ESEGSTART:MOV AX,DSEG ;START为程序开始执行的启动标号MOV DS,AX ;初始化DSMOV AX,ESEGMOV ES,AX ;初始化ESLEA SI,SUM ;存放结果的偏移地址送SIMOV AX,DATA1 ;取被加数ADD AX,DATA2 ;两数相加MOV ES:[SI],AX ;和送附加段的SUM单元中HLTCODE ENDS ;代码段结束END START ;源程序结束8源程序的结构特点汇编语言程序通常由若干段组成,段由伪指令SEGMENT与ENDS定义,各段顺序任意,段的数目按需要确定,原则上不受限制。
汇编语言设计实践:第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
二、伪指令语句
伪指令语句又叫命令语句。 伪指令本身并不产生对应的机器目标代码。它仅 仅是告诉汇编程序对其后面的指令语句和伪指令 语句的操作数应该如何处理。
经典教材_微机原理及应用和汇编语言程序设计课件chap_51(1)
1.宏代换 格式:宏名 MACRO [形式参数1,形式参数1,…] … ENDM 功能:为指令序列定义一个宏名,称为宏指令.
2.局域符号定义语句 格式: LOCAL 符号[符号1,符号2,…] 功能:指出符号1,符号2,…仅在宏代换中有意义.
3.删除宏定义语句 格式: PURGE 宏定义名1[宏定义名2,…] 功能:注销程序中引用的宏指令.
6)键盘输入一个字符无回显 功能号:AH=08H 出口参数:AL=字符;
7)返回DOS系统 功能号:AH=4CH
8)清键盘缓冲区,并调用一种键盘功能 功能号:AH=0CH AL=键盘功能号(1、6、7、8、0AH)
9).从串口输入单字符 AH=03H 入口参数AL=字符
10)向串口输出单字符 AH=04H 出口参数DL=字符
11)设置时间:INT 21/2BH year:mounth:day=DX:CH:CL
12)取得时间:INT21H/2AH 13)取得日期:INT21H/2CH
5.5 汇编过程
一.汇编程序的功能
将汇编语言源程序翻译成机器语言编写的目标 程序.并可输出列表文件 检查语法并给出错误信息 展开宏指令
常用汇编程序:ASM 和MASM
SHR,右移运算符
例: 32 MOD 5
;汇编时,得到的值=2
2.逻辑运算符: AND、OR、NOT、XOR
例: 24H OR 0FH ;汇编时,得到的值=2FH
3.关系运算符:
关系运算符是逻辑判断式,为真时,结果取 0FFFFH,为假时,结果取0。
EQ(等于)、NE(不等于)、 LT(小于)、GT(大于)、 LE(小于等于)、GE(大于等于)
TABLE3 DB ‘12345678910 ‘
汇编语言 第四章 汇编语言
4.1.4 特殊运算符
1.属性替换运算符
(3)短取代运算符SHORT 告诉汇编程序,目标标号在本条指令的 -128~+127 个字节的范 围内,生成节省一个字节的机器指令。一般情况下可以不用。 例如: JMP SHORT NEXTBRACH … NEXTBRACH: MOV EAX,ECX
4.1.4 特殊运算符
4.1.4 特殊运算符
1.属性替换运算符
(2)段地址取代运算符“:” 又称为段地址运算或者跨段前缀。用于临时给定变量,标号或 者地址表达式指定一个段属性,地址表达式EA和类型保持不变。在 指令中替代默认的段以形成物理地址。 例如: MOV DX,ES:[BX + DI];EA = BX +DI,PA =ES ;*16 + EA,临时替换默认的DS
4.1.4 特殊运算符
2.属性分离运算符
TYPE运算符 格式:TYPE 变量或标号 功能:分离出其后变量或标号的类型。如果是变量,将返回该变 量的类型对应字节数;如果是标号,则返回代表标号类型的数值。 MOV CL,TYPE ARRAYW ;若变量ARRAYW为字类型,则CL=2
4.1.4 特殊运算符
(1)LENGTH运算符 功能:当变量由数据定义伪指令定义,并且表达式带有一个DUP项 时,LENGTH取DUP项前面的重复系数;如果表达式有多个DUP项 嵌套时,仍然取第一个DUP项前的数字,LENGTH变量的取值为1. DATA SEGMENT A DB ‘ABCDEF’ B DW 10 DUP(1,2DUP(2)) C DB 4,20 DUP(0) DATA ENDS ┆ MOV AX,LENGTH A ;1→AX MOV BX,LENGTH B ;10→BX MOV CX,LENGTH C ;1→CX
第四章汇编语言
4.1汇编语言概述语言分机器语言、低级语言、高级语言,机器语言由0和1构成,只有专业人士才能看懂。
低级语言就是汇编语言,用助记符来表示,最贴近机器硬件,它通常被应用在底层,硬件操作和高要求的程序优化的场合。
驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言高级语言分为面向过程和面向对象的语言。
1 顺序结构顺序程序设计,又叫直接程序设计。
它是相对于分支程序和循环程序设计而言的。
因此,可以说顺序程序是既不包含分支,又不包含循环的程序,顺序程序是从第一条指令开始,按其自然顺序,一条指令一条指令地执行,在运行期间,CPU既不跳过某些指令,也不重复执行某些指令,一直执行到最后一条指令为止。
2 分支结构(1).分支程序设计概述分支程序结构可以有两种形式,如图所示(2)分支程序设计分支结构程序设计的关键在于准确地知道操作结果影响的标志位状态和正确地使用条件转移指令。
根据对条件的判断而选择不同的处理方法是人的基本智能体现。
3 循环程序设计1.循环程序设计概述有时我们会需要能按一定规律,多次重复执行的一串语句,这类程序叫循环程序。
循环程序一般由四个部分组成:(1)循环初值部分:这是为了保证循环程序能正常进行循环操作而必须做的准备工作。
循环初值分两类:一类是循环工作部分的初值,别一类是控制循环结束条件的初值。
(2)工作部分:即需要重复执行的程序段。
这是循环的中心,称之为循环体。
(3)修改部分:按一定规律修改操作数地址及控制变量,以便每次执行循环体时得到新的数据。
(4)控制部分:用来保证循环程序按规定的次数或特写条件正常循环。
4.2 汇编语言的语句4.2.1语句分类:汇编语言语句分为指令性语句、伪指令、宏指令。
4.2.2语句格式:[标号] 操作码 [操作数] [注释]汇编语言源程序中的每个语句可以由4项组成,格式如下[name] operation operand [;comment][名字项] 操作项操作数项;注释项下面分别说明各项的表示方法。
汇编语法大全
汇编语法大全汇编语言是一种底层的计算机语言,可以用来编写应用程序、驱动程序和嵌入式系统等。
其语法简洁、效率高,但也较为复杂。
下面是汇编语法大全,希望对大家能有所帮助。
1. 注释语句注释语句是程序员为了方便自己和他人阅读代码而添加的语句。
汇编语言中,使用分号(;)表示注释语句,写在行尾。
示例:mov ax, bx ;将bx寄存器的值赋给ax寄存器2. 标号语句标号语句用来表示程序中的一个位置,在汇编程序中可以用它来实现跳转、条件执行等功能。
标号语句必须在第一行,以字母开头,由数字、字母和下划线组成,长度不超过32个字符。
3. 数据定义语句数据定义语句用来为变量、常量分配存储空间,可以为它们指定初值。
汇编语言中,数据定义语句有三种形式:db、dw、dd。
db:定义一个字节(8位)长度的数据,可以用来存储字符、布尔型变量等。
data1 db 'A' ;定义一个字符型变量,初值为'A'4. 操作数表示操作数即指令中被操作的对象,可以是通用寄存器、内存单元、立即数等。
汇编指令中,操作数的表示方法主要有以下几种:寄存器表示法:使用寄存器的名称表示操作数,如AL、AX、DX等。
立即数表示法:表示一个常量数值,用于参与运算或存储到内存中,如100、0AH等。
内存变量表示法:使用内存变量的地址表示操作数,如[2000H]、[BX]等。
mov al, 02h ;将立即数02h赋给AL寄存器mov byte ptr ds:[bx], al ;将AL寄存器的值存储到2000h地址所指向的内存单元中5. 寻址方式汇编语言中,寻址方式用于表示操作数在内存中的地址。
汇编语言提供了多种寻址方式,例如寄存器间接寻址、基址变址寻址、相对寻址等。
寄存器间接寻址寄存器间接寻址是指操作数的地址存储在一个寄存器中。
例如,[BX]表示将BX寄存器中的值作为地址,访问该地址存储的数据。
基址变址寻址相对寻址相对寻址是指让程序计算出偏移量以便于寻址,这种寻址方式用于程序中的跳转指令。
MASM汇编语言基础
2007 copyright / 9 2007年3月25日
四川理工学院 计算机科学系《微机原理》
§4.2.1 常量(续)
1.十进制常量:0~9数字序列,可以用字母D结尾,也可没 有结尾字母; 2.二进制常量:以字母B结尾的0和1组成的数字序列; 3.八进制常量:以字母O或Q结尾的0~7数字序列; 4.十六进制常量:以字母H结尾的0~9和A~F(或a~f)的 数字字母序列。 5.字符串常量:用单引号或双引号括起来的一个或多个字符, 这些字符用它的ASCII码值存储在内存中。
2007 copyright / 7 2007年3月25日
四川理工学院 计算机科学系《微机原理》
§4.1.2 伪指令语句(续)
2.伪指令字段 这是伪指令语句中不可省略的主要成分。它们是
伪指令语句要求汇编程序完成的具体操作命令。
3.操作数字段 本字段是否需要,需要几个,需要什么样的操作
数等都由伪指令字段中伪指令来确定。
2007 copyright / 11 2007年3月25日
四川理工学院 计算机科学系《微机原理》
§4.2.2 变量(续)
常用的有以下几种:
DB伪指令用来定义字节,其后的每个操作数都 占有一个字节;
DW伪指令用来定义字,其后的每个操作数都 占有一个字(低位字节存放在低地址,高位字 节存放在高地址);
2007 copyright / 5 2007年3月25日
四川理工学院 计算机科学系《微机原理》
§4.1 汇编语言语句种类及其格式(续)
§4.1.2 伪指令语句
与指令语句不同的是,伪指令本身不产生与之对应 的目标代码。它是在汇编程序对汇编语言源程序汇编 期间,由汇编程序处理的操作,它们可以完成如数据 定义、分配存储区、指示程序结束等功能。
汇编语言程序
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个字符。在汇 编语言中,名字的应用范围很广,有寄存器名、变 量名、常量名、标号、指令名等等。在语句格式中 作为第一可选成分出现的<名字>,在不同的语句 中具有不同的含义。它在指令语句中表示标号,后 面必须跟有冒号“:”;而在伪指令语句中表示变 量名,常量名,段名,过程名,后面不能有冒号。 这是两种语句在格式上的主要不同之处。
指令语句中的标号和伪指令语句中变量名,段名, 过程名是一种符号地址,可作为汇编指令的一个操 作数,但常量名不是符号地址,不能用做目的操作 数。不同的标号、变量和常量不能同名。
汇编语言语句
第三项是操作数项,说明操作的对象,视操作项的需要来决定。
第四项是注释项,分号后面是用户的说明,汇编时不起任何作用,
可以省略。
<>
指令中操作符项可以使用的操作符有汇编指令、伪指令和宏指令,因 此,将汇编程序的语句分成三种语句: ⑴ 指令性语句: 由CPU指令系统中的指令构成,汇编后,转换成一条机器指令。
<>
2.标识符和保留字
汇编程序的三种语句中,第一项都包含有名字项—标识符,其作用 就是用户给该语句中的元素起的一个名字。根据用途不同,可以表 示一个常量、变量或标号地址等,便于在程序的其它部分使用时, 直接用名字引用。
(1) 标识符的命名规则:
① 组成的字符可以是:A~Z、a~z、0~9、?、• 、@、$、_(下划 线)。 ② 名字的第一个字符不能是0~9的数字。 ③ 问号(?)本身不能单独作为名字。 ④ 名字中若用到“• ”,则必须是第一个字符。 ⑤ 名字的最大长度为31,若超过则后续字符无效。
定义变量就是给变量分配一个确定的存储单元,并且对该单元赋一 个唯一的符号名称-变量名;初始化是指给该存储单元预置一个初 值。
在汇编语言中,定义变量是在程序的数据段中用DB、DW、DD、 DF、DQ和DT伪指令实现字节变量、字变量、双字变量、六字节 变量、八字节变量和十字节变量的定义 。
例: DATA1 DB 12H,100,’A’,10100011B
MOV AX,SEG DATA1
;取出变量所在段的段基地址
MOV BX,OFFSET DATA2;取出变量的偏移地址,BX的值为4
汇编语言程序设计
汇编语言语句
语言是由一条条的1.1 汇编语言语句的种类
1.语句的种类
汇编语言程序中每一条语句都由四部分组成:
8086汇编语言语句的类型和格式
⑴ 算术运算符:+、-、*、/和取模运算。
⑵ 逻辑运算符:、、和。
⑶ 关系运算符:、、、、、。结果只有两个全 1或全0。
⑷ 分析运算符:利用分析运算符可以把一个存 储单元地址分解为段地址和偏移地址等。分析运算符 有 、 、、和等。
分析运算符表达式
带分析运算符的表达式
: ,2[] ;取一个字节加数 1 0F8H,60H,0,74H,3 ;被加数 第一条语句是指令语句,其中“:”是名字,“”是指令助记符, “,2[]”是操作数,“;”后面是注释部分;第二条语句是伪指 令语句,其中“1”是名字,“”是伪指令定义符,“0F8H, 60H,0,74H,3”是操作数,“;”后面是注释部分。
⑵ 定义变量的类型为,给变量分配字操作数。
⑶ 定义变量的类型为,给变量分配双字操作 数。
除了常数、表达式和字符串外,问号“?”也 可以作为数据定义伪指令的操作数,此时仅给变量保 留相应的存储单元,而不赋与变量某个确定的初值。
当同样的操作数重复多次时,可用重复操作符 “”表示,其形式为:
n (初值[,初值…0])
1) 名字
汇编语言语句的第一个组成部分是名字()。在指令语句 中,这个名字是一个标号。指令语句中的标号实质上是指“:”后 面指令所在的存储地址(逻辑地址)。供、和等指令作操作数使用, 以寻找转移目标地址。并非每条指令语句必须有标号,但如果 一条指令前面有一标号,则程序中其它地方就可以引用这个标 号。在例5.1中,、就是标号。标号后面有一个冒号。
• , K3
;()←20H,返回前面的数值
• , K4
;()←01H
• , K3
;()←40H
• , K4
;()←04H
汇编语言的语句格式
ORG 表达式
DATA D1 D2 DATA CODE
START: …
SEGMENT
ORG 20H
DB 12H,13H
ORG $+01H
61H,62H,63H
ENDS
SEGMENT
ASSUME
CS:CODE, …
ORG 100H
…
CODE
ENDS END START
2. 汇编语言的语句
指令性语句 指示性语句
一、汇编语言的语句格式:
[名字] 操作码/伪操作 [操作数] [;注释]
(一)、名字、标号、变量
标号的三种属性:段、偏移量和类型 变量的三种属性:段、偏移量和类型
(二)、操作码和伪操作
(三)、语句中的操作数
1)、常数 2)、寄存器 3)、标号 4)、变量 5)、表达式
ENDS SEGMENT BYTE
; STACK段结束 ;定义DATA1段,定位类型BYTE
DB “This is an example!” ;长度为19个字节
ENDS
; DATA1段结束
SEGMENT WORD ;定义DATA2段,定位类型WORD
DW 40 DUP(0) ;长度为40字,80个字节
6 *,/,MOD,
SHL,SHR
优先 级
运算符
7
十,— (二元运算符)
8
EQ, NE, LT,
LE, GT, GE
9 NOT
10 AND
11 OR,XOR
12 SHORT
(低)
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。
汇编语言程序格式及MASM
ML /Fm LI6-1.ASM
将产生LI6-1.MAP映像文件,如下:
LI6-1.MAP
Start Stop Length Name Class
00000H 00022H 00023H _TEXT CODE
汇编语言程序格式及MASM
汇编语言的实现也是先利用某种编辑器编写汇编语言源程序(*.ASM),然后经过汇编得到目标模块文件(*.OBJ)、连接后形成可执行文件(*.EXE)。
1、汇编语言程序的语句格式
汇编语源程序由语句序列构成。语句一般由分隔符分成的四个部分组成,它们有两种格式:
(1)执行性语句——由硬指令构成的语句,它通常对应一条机器指令,出现在程序的代码段中:
0007 2B DA * sub bx, dx
0009 D1 E3 * shl bx, 001h
000B D1 E3 * shl bx, 001h
000D D1 E3 * shl bx, 001h
000F D1 E3 * shl bx, 001h
0011 FA * cli
0012 8E D2 * mov ss, dx
标号:硬指令助记符 操作数,操作数 ;注释
(2)说明性语句——由伪指令构成的语句,它通常指示汇编程序如何汇编源程序:
名字 伪指令助记符 参数,参数,... ;注释
◆执行性语句中,冒号前的标号反映该指令的逻辑地址;说明性语句中的名字可以是变量名、段名、子程序名或宏名等等,既反映逻辑地址又具有自身的各种属性。标号和名字很容易通过是否具有冒号来区分。
li6-1.lst
Microsoft (R) Macro Assembler Version 6.11 08/10/05 14:09:13
汇编语言常用语句一览
汇编语言常用语句一览在学习和使用汇编语言时,熟悉常用的语句和指令是非常重要的。
本文将列举出一些汇编语言中常用的语句,以供参考和学习。
1. 数据传输指令MOV:将源数据移动到目标操作数中PUSH:将数据压入栈中POP:将栈顶元素弹出2. 算术运算指令ADD:将源数据与目标操作数相加SUB:将源数据与目标操作数相减INC:目标操作数自增1DEC:目标操作数自减1MUL:将源数据与目标操作数相乘DIV:将源数据与目标操作数相除3. 条件跳转指令JMP:无条件跳转到指定地址JZ/JNZ:根据零标志位是否为零跳转JE/JNE:根据相等标志位是否为真跳转JL/JLE:根据小于/小于等于标志位是否为真跳转JG/JGE:根据大于/大于等于标志位是否为真跳转4. 循环指令LOOP:循环指令,根据计数寄存器的值判断是否继续循环 INC/DEC + CMP + JNZ:结合使用,实现循环功能5. 标志位设置指令CMP:比较操作数,设置相应标志位TEST:与目标操作数进行按位与操作,设置相应标志位6. 子程序调用指令CALL:调用子程序RET:子程序返回指令7. 输入输出指令IN:从设备或端口读取数据OUT:向设备或端口输出数据8. 定义数据段指令DB:定义字节数据DW:定义字数据DD:定义双字数据9. 定义代码段指令SECTION:定义代码段10. 定义变量和常量指令DW:定义字变量或常量DD:定义双字变量或常量11. 定义字符串指令DB "Hello, World!",0:定义以0结尾的字符串12. 定义宏指令MACRO:定义宏ENDM:结束宏定义13. 定义过程指令PROC:定义过程ENDP:结束过程定义14. 调试指令INT 3:设置断点NOP:空操作以上是汇编语言中常用的语句一览。
通过熟悉和掌握这些语句,可以更好地编写汇编语言程序,并实现所需的功能。
希望本文对你的学习和使用汇编语言有所帮助。
单片机实用教程_5 89C51单片机汇编语言程序设计
5. DS 定义存储空间伪指令 格式: DS n 说明:从指定的地址开始,连续预留n个存储单元, 作为工作单元使用。n为常数, 例如: ORG 2000H DS 06H DB 31H,32H 汇编后,从2000H开始连续预留6个存储单元, 然后从2006H开始按DB命令给存储单元赋值, 即:(2006H)=31H,(2007H)=32H。
3. DW 定义字(双字节)伪指令
格式: DW 16位数据项或项表 说明:从当前ROM地址开始,将16位数据项或项表 的内容依次存放到连续的存储单元中。 存放时,高字节先到低地址,低字节到其后的高地址中. DW常用于定义一个地址表。 例如: 汇编后:(1500H)=12H (1501H)=34H ORG 1500H (1502H)=00H DW 1234H,5FH,20H (1503H)=5FH (1504H)=00H (1505H)=20H
汇编程序: 把汇编语言源程序翻译成机器语言的目 标程序的工具软件。这个翻译过程称为汇编。 指令语句:源程序由指令语句组成。有两种类型:
.1.2 指令语句的组成
指令语句:由CPU指令组成,运行时由CPU执行。 每条指令对应CPU的一种特定操作。 汇编中,都要翻译成机器指令,生成对应的目标代码. 指令语句的格式如下:
⑵. 操作码
操作码是语句的核心,不可缺少。 用指令的助记符表示,说明该语句所执行的操作。
⑶. 操作数
表示该语句的操作中的数据或数据所在的地址。 双操作数指令有目的和源操作数,目的在前,逗号分开. 操作数字段表示的方法有多种:
寄存器名:寄存器A、B、 R0-R7、 SFR等。 存储器地址:片内为00H-7FH, 片外为0000H-FFFFH。 标号名:指令地址标号, 其值为该指令第1字节地址。 常数:常数可以用不同进制数或字符串表示。 表达式:汇编时会自动计算出表达式的值。 符号“$”:用于转移指令,表示该指令地址,即PC的值.
4. 汇编语言
移位运算符的几个例子
Num = 11011011b ︰ mov ax,num shl 3 mov bx,num shr 2 add dx,num shr 6 确定一下,源操作数的具体值是多少? 注意:目的操作数的类型。
下标运算符
[]表示加法,把表达式1和表达式2相加后形成一个 存储器操作数地址。 Mov ax,da_word[20h] Mov ax,da_word+20h 下标[]中的20h表示数组的下标变量,也可以用寄 存器来存放下标变量。 Mov ax,array[bx][si] Mov ax,array[bx+si] Mov ax,[array+bx][si] Mov ax,[array+si][bx] Mov ax,[array+bx+si]
标号距离属性的类型
Near(近):此标号只能被标号所在段的转移 和调用指令所访问。(即段内转移) Far(远):此标号可被其它段的转移和调用 指令所访问。(即段间转移)
段距离属性的设置方法
隐含方式:当在指令语句中,使用标号后, 它就隐含有near属性。如: sub1:mov ax,30h 使用label伪操作 格式:名称 label 类型
如何区别指令和运算符(shl,shr)
在格式上的区别。 指令:shl(shr) dest [,cl] 逻辑移位运算符:表达式 shl(shr) 次数 在执行功能和效果上是相同的。 当次数>=16时,则结果恒为零,为什么? 移位运算符是在程序汇编时完成移位的。 移位指令是在程序运行、执行时完成移位的。
Mov ax,0ab37h Add dl,63h 源操作数的寻址方式为立即数寻址。 可以为8位或16位的二进制数。
让常数作为存储器操作数的位移量
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编语言的语句类型有两种:指示性语句和指令性语句。
指示性语句可以位于任何段中,指令性语句必须位于代码段内。
指示性语句
又称伪操作语句,它不是8086/8088cPU的指令,它与汇编程序指示性语句的功能主要是变量定义、为数据分配存储空间、告诉汇编程序如何对源程序汇编等。
源程序汇编后,指示性语句不生成目标代码,所以常被称为伪指令。
指令性语句
指令性语句是可执行语句,是8086/8088CPU的指令。
源程序汇编后,指令性语句生成目标代码。
第3章中介绍的所有指令都是指令性语句的主体,其操作数最多只能有2个。
. 2018/04/23 12:17:12
2.汇编语言源程序由若干段组成:数据段、附件数据段、堆栈段和代码段等,段与段之间的顺序可以任意排列,每段由SEGMENT开始,以ENDs结束,每段的开始和结束都附有相同的名字。
一个程序一般定义三个段:数据段、堆栈段和代码段,必要时增加定义附加数据段,能独立运行的程序至少包含一个代码段。
张宇新2018/04/23 12:19:12
3(1)BUFF DB 200 DUP(?)
(2)DB 'BYTE','WORD'
(3)DW 2040H,0300H,10H,0020H,1048H
张宇新2018/04/23 12:19:25
5(1)MOV SI,OFFSET NAME
(2)MOV AX,WORD PTR [LIST]
(3)MOV AX,SIZE LIST
张宇新2018/04/23 12:31:44
6(1)200X100+55
(2)C8AND0F-0F=0
(3)100MOD15=10
(4)0FORC8=CFH
张宇新2018/04/23 12:31:59
7DATA SEGMENT
NUM DW X
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV AL,0
MOV BX,NUM
MOV CX,16
NEXT:SHL AX,1
JNC NEXT1
INC AL
NEXT1:LOOP NEXT
MOV AH,4CH
INT 21H
CODE ENDS
END START
张宇新2018/04/23 12:38:12 8DATA SEGMENT
BUFFER DB 100 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
XOR DX,DX
MOV CX,100
MOV SI,OFFSET BUFFER
NEXT:MOV AL,[SI]
INC SI
TEST AL,80H
JNZ GOON
CMP AL,0
JZ GOON
INC DX
GOON:LOOP NEXT
MOV NUMBER,DX
MOV AH,4CH
INT 21H
CODE ENDS
END START
张宇新2018/04/23 12:39:49
9这是一个查表程序,查表取出HEX中数字对应的ASCII码。
张宇新2018/04/23 12:48:35
10过程定义的一般格式为:PROC ENDP。
如果一个子程序被多次调用,保护
与恢复(主程序)现场就非常重要。
主程序每次调用子程序时,主程序现场不会相同,保护与恢复现场的工作就只能在子程序中进行。
原则上,首先把子程序中要用到的寄存器、储存单元、状态标志等压入堆栈或存入特定空间中,然后子程序才可以使用它们,使用后再将它们弹出堆栈或从特定空间中取出,回复他们原来的值,即恢复主程序现场。
保护和恢复现场常使用PUSH和POP指令。
张宇新2018/04/23 12:58:18
11DATA SEGMENT
BUF DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX
MOV AL,BUF
MOV BL,AL
NEXT:MOV CL,4
SHR AL,CL
AND AL,0FH
CMP AL,0
JZ GOON
ADD AL,30H
MOV DL,AL
MOV AH,2
INT 21H
GOON:MOV AL,BL
AND AL,0FH
ADD AL,30H
MOV DL,AL
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
张宇新2018/04/23 13:04:46
12DATA SEGMENT
M1 DB 100DUP(?)
DATA ENDS
EDATA SEGMENT
M2 DB 100DUP(?)
EDATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:EDATA START:MOV AX,DATA
MOV DS,AX
MOV AX,EDATA
MOV ES,AX
LEA SI,M1
LEA DI,M2
MOV CS,200
CLD
REPE CMPSB
AND CX 0FFFFH
JZ STOP
DEC SI
MOV BX,SI
MOV AL,[SI]
STOP:MOV AH,4CH
INT 21H
CODE ENDS
END START
张宇新2018/04/23 13:11:49 13DATA SEGMENT
TABLE DB 100DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
XOR AL,AL
MOV PLUS,AL
MOV MINUS,AL
MOV ZERO,AL
LEA SI,TABLE
MOV CX,100
CLD
CHECK:LODSB
OR AL,AL
JS X1
JZ X2
INC PLUS
JMP NEXT
X1:
INC MINUS
JMP NEXT
X2:
INC ZERO
NEXT:LOOP CHECK
MOV AH,4CH
INT 21H
CODE ENDS
END START
张宇新2018/04/23 13:22:37 14DATA SEGMENT
DATA1 DB 80 DUP(?)
DATA2 DB 5 DUP(0)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA MOV DS,AX
MOV CX,80
LEA SI,DATA1
LEA DI,DATA2 AGAIN:MOV AL,[SI] CMP AL,90
JC NEXT1
INC,BYTE PTR[DI] JMP STO
NEXT1:
CMP AL,80
JC NEXT2
INC BYTE PTR[DI+1] JMP STO
NEXT2:
CMP AL,70
JC NEXT3
INC BYTE PTR[DI+2] JMP STO
NEXT3:
CMP AL,60
JC NEXT4
INC BYTE PTR[DI+3]
JMP STO
NEXT4:INC BYTE PTR[DI+4] STO:INC SI
LOOP AGAIN
MOV AH,4CH
INT 21H
CODE ENDS
END START。