4.1 伪指令
汇编语言伪指令
汇编语言伪指令汇编语言作为一种低级编程语言,广泛应用于嵌入式系统、驱动程序开发和操作系统内核等领域。
在进行汇编语言编程时,我们常常会使用到一些伪指令。
本文将介绍一些常见的汇编语言伪指令及其用法。
1. 数据定义伪指令数据定义伪指令用于声明并初始化数据。
在汇编语言中,我们可以使用以下伪指令来定义不同类型的数据:1.1 DB(Define Byte):用于定义一个字节的数据。
例如:DB 10 ;定义一个字节的数据,值为101.2 DW(Define Word):用于定义一个字的数据。
例如:DW 100 ;定义一个字的数据,值为1001.3 DD(Define Doubleword):用于定义一个双字的数据。
例如:DD 1000 ;定义一个双字的数据,值为10001.4 DQ(Define Quadword):用于定义一个四字的数据。
例如:DQ 10000 ;定义一个四字的数据,值为100001.5 DT(Define Ten Bytes):用于定义一个十个字节的数据。
例如:DT 1234567890 ;定义一个十个字节的数据,值为12345678902. 代码段和数据段伪指令在汇编语言中,我们通常需要将代码和数据分开存放,以便于管理和执行。
以下是一些常用的代码段和数据段伪指令:2.1 CODE SEGMENT:用于定义代码段。
例如:CODE SEGMENT;代码段内容CODE ENDS2.2 DATA SEGMENT:用于定义数据段。
例如:DATA SEGMENT;数据段内容DATA ENDS2.3 STACK SEGMENT:用于定义堆栈段。
例如:STACK SEGMENT;堆栈段内容STACK ENDS3. 控制指令伪指令控制指令伪指令用于控制程序的执行流程。
以下是一些常见的控制指令伪指令:3.1 IF-ELSE-ENDIF:用于条件判断。
例如:IF 条件;条件为真时执行的代码ELSE;条件为假时执行的代码ENDIF3.2 REPEAT-UNTIL:用于循环执行一段代码直至满足条件。
《汇编语言》学习笔记6——伪指令
《汇编语⾔》学习笔记6——伪指令1.伪指令⼜称伪操作,即不能像汇编指令⼀样⽣成可执⾏的⼆进制机器代码,⽽是在汇编程序对汇编语⾔源程序进⾏汇编(编译)期间,由汇编程序执⾏。
它与C中的说明性语⾔的含义类似,起到说明作⽤,⽤来指出程序分段、数据定义、存储分配、程序开始和结束等信息,这些信息在汇编(编译)完成后就不⽤了。
但程序中没伪指令,则系统就⽆法完成编译。
2.段定义伪指令:⽤来定义各种类型的段 1.格式:段名 SEGMENT [类型参数] ...... 段名 ENDS 1.其中SEGMENT和ENDS必须成对出现,表⽰段的开始和结束。
⼀般的,段名和段的意义⼀致,便于识别。
2.段名实际就是段地址,在汇编过程中,系统给出具体的地址值,⼀个段必须有⼀个名字来标识。
3.参数是可选项(可有可⽆),⽤于指出段的边界、段的组合、类别标识,⼀般⽤于多模块程序设计中。
2.类型参数 1.定位类型 PARA 该段的起始地址必须为⼩段的⾸地址,即起始地址的16进制数最低位为0 BYTE 该段可以从任意地址开始 WORD 该段必须从字边界开始,即起始地址为偶数 DWORD 该段必须从双字边界开始,即起始地址的16进制数为最低应为4的倍数 PAGE 该段必须从页边界开始,即起始地址的16进制数最低两位为00(能被256整除) 若不指定定位类型,系统默认为PARA 2.组合类型 PRIVATE 该段为私有段,连接时不与其他同名段合并 PUBLIC 连接时可与其他模块中的同名段按顺序连接成⼀个段 COMMON 表⽰该段与其他模块中的同名段有相同的起始地址,如果连接将产⽣覆盖,连接后段的长度为同名段中的最长者 STACK 表⽰该段为堆栈段 AT 表达式 该段直接定位在表达式指出的位置上 若不指定组合类型,默认为PRIVATE 3.类型标识:在引号中给出段的类型名。
在连接时,类别标识相同的段放在连续的存储区中。
(如:"STACK"⽤啦标识该段为堆栈段) 4.END:结束标记,若碰到伪指令END则停⽌编译3.ASSUME伪指令:⽤于指明段寄存器与段的对应关系 1.格式:ASSUME 段寄存器:段名,[段寄存器:段名,段寄存器:.....]【[]中标识可选项】 2.除了代码段寄存器CS不能⽤MOV指令赋值外,其他段寄存器都可⽤MOV指令进⾏初始化。
汇编常见伪指令
汇编常见伪指令汇编常见伪指令转⾃:⼀、与宏有关的伪指令在宏定义时,为了满⾜某种特殊需要,汇编语⾔还提供了⼏个伪指令。
9.3.1 局部标号伪指令LOCAL在宏定义体中,如果存在标号,则该标号要⽤伪指令LOCAL说明为局部标号,否则,当在源程序中,有多于⼀次引⽤该宏时,汇编程序在进⾏宏扩展后将会给出:标号重复定义的错误。
伪指令LOCAL的⼀般格式如下:LOCAL 标号1, 标号2, ……伪指令LOCAL必须是伪指令MACRO后的第⼀条语句,并且在MACRO和LOCAL之间也不允许有注释和分号标志。
汇编程序在每次进⾏宏扩展时,总是把由LOCAL说明的标号⽤⼀个唯⼀的符号(从??0000到??FFFF)来代替,从⽽避免标号重定义的错误。
例9.7 编写求⼀个求绝对值的宏。
解:⽅法1:ABSMACROword1CMPword1, 0JGEnextNEGword1next:ENDM假设对宏ABS有以下两次引⽤,点击它们将会显⽰汇编程序对它们进⾏宏扩展后所得到程序⽚段: ABS BX 1 CMP BX, 0 1 JGE next 1 NEG BX 1 next:… ABS AL 1 CMP AL, 0 1 JGE next 1 NEG AL 1 next:在上述程序⽚段中,显然标号next定义了⼆次,所以,汇编程序将显⽰“标号重复定义”的错误信息。
为了避免这种情况的发⽣,我们需要⽤下⾯的⽅法来定义该宏。
⽅法2:ABSMACROword1LOCALnextCMPword1, 0JGEnextNEGword1next:ENDM假设对宏ABS有以下两次引⽤,点击它们将会显⽰汇编程序对它们进⾏宏扩展时所得到程序⽚段: ABS BX 1 CMP BX, 0 1 JGE ??0000 1 NEG BX 1 ??0000:… ABS AL 1 CMP AL, 0 1 JGE ??0001 1 NEG AL 1 ??0001:在上述程序⽚段中,宏体内部的局部标号next分别⽤符号??0000和??0001来对应它的⼆次引⽤。
汇编 第四章伪指令及汇编语言源程序结构
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章 嵌入式程序设计基础
4.1.1 通用伪指令
表达式可以为程序中的标号或数学表达式,基址寄存器为可 选项,当基址寄存器选项不存在时,表达式的值即为内存 表的首地址,当该选项存在时,内存表的首地址为表达式 的值与基址寄存器的和。 注意MAP和FIELD伪指令仅用于定义数据结构,并不实际 分配存储单元。
26
4.1.1 通用伪指令 指令示例: MAP 0x10,R1 ;定义内存表首地址的值为[R1]+0x10。 DATA1 FIELD 4 ;为数据DATA1定义4字节长度 DATA2 FIELD 16 ;为数据DATA2定义16字节长度
17
4.1.1 通用伪指令
(2)DCW(或DCWU) DCW= Data Define of Word 语法格式:
标号 DCW(或DCWU)表达式 DCW(或DCWU)伪指令是为分配半字内存单元, 其中,表达式可以为程序标号或数字表达式。 伪指令DCW用于为半字分配一段半字对准的内存单元, 并用指定的数据初始化;伪指令DCWU用于为半字分配一 段可以非半字对准的内存单元,并用指定的数据初始化。
变量名 SETA(SETL或SETS)表达式 SETA、SETL、SETS是变量赋值伪指令,用于给一个已经定义的全 局变量或局部变量赋值。 其中: SETA用于给一个数字变量赋值; SETL用于给一个逻辑变量赋值; SETS用于给一个字符串变量赋值;
12
4.1.1 通用伪指令
指令示例:
GBLA EXAMP1 ;先声明一个全局数字变量EXAMP1
4
4.1 伪指令
在ARM的汇编程序中,我们把伪指令分为三部分介绍: 通用伪指令 与ARM指令相关的伪指令 与Thumb指令相关的伪指令
5
4.1.1 通用伪指令
第4讲_1 4.4-4.5伪指令
伪指令与EQU伪指令的差别: ① =伪指令只能代表表达式或常数,不能是指令助记符等。 ② EQU定义的标识符不能重定义,而=定义的可以。
4
4.4.2 数据定义伪指令
格式:标号 DB/DW/DD/DQ/DT 表达式 格式 功能:用来定义一个存储单元的标识符号名, 功能 并初始化该单元或由该单元开始的若干连续 单元。初始化单元就是将一个确定的数值或 不确定的值(在定义语句中用?表示)放入 指定的内存单元。
1AH 1AH 1AH 1AH 1AH 04H 04H 0FH 04H 04H 0FH 7FH ?? ?? ?? 001CH 001DH 001EH 001FH 0020H 0021H 0022H 0023H 0024H 0025H 0026H 0027H 0028H 0029H 002AH
6
SECOND
DFST FFH FFH FFH FFH 00H 00H 00H 80H 00H 80H 12H 42H 00H 80H 12H C2H 0052H 0053H 0054H 0055H 0056H 0057H 0058H 0059H 005AH 005BH 005CH 005DH 005EH 005FH 0060H 0061H
10
4.4.3 段定义伪指令
1. 段首说明伪指令 SEGMENT 2. 段结束伪指令 ENDS 3. 段假定伪指令 ASSUME 4. 代码定位伪指令 ORG
11
段定义伪指令SEGMENT/ENDS 段定义伪指令
格式: 格式: 段名 段名 SEGMENT [定位类型 组合类型 类别名’] 定位类型][组合类型 类别名’ 定位类型 组合类型][‘类别名 ENDS
4.1 伪指令
三明市高级技工学校
教案用纸附页
教学内容、方法和过程
附记
能把处理过程描述得非常具体。因此通过优化能编制出高效率的程序,即可节省存储空间又可提高程序执行的速度,在空间和时间上都充分发挥了计算机的潜力。在实时控制的场合下,计算机的监控程序大多采用汇编语言编写。
一、伪指令
伪指令:不属于指令集中的指令,在汇编时不产生目标代码,不影响程序的执行,仅指明在汇编时执行一些特殊的操作。
1、定义起始地址伪指令ORG
格式:ORG操作数
说明:操作数为一个16位的地址,它指出了下面的那条指令的目标代码的第一个字节的程序存储器地址。在一个源程序中,可以多次定义ORG伪指令,但要求规定的地址由小到大安排,各段之间地址不允许重复。
说明:该伪指令只能用于有位地址的位(片内RAM和SFR块中),把位地址赋予规定的字符名称,常用于位操作的程序中。
8、定义汇编结束伪指令END
格式:〔标号:〕END
说明:汇编结束伪指令END是用来告诉汇编程序,此源程序到此结束。在一个程序中,只允许出现一条END伪指令,而且必须安排在源程序的末尾。
二、汇编语言源程序汇编
MJ/JW-JL-11(15) 5年
三明市高级技工学校
教案用纸
学
科
单片机技术
第四章汇编语言程序设计简介
第1节伪指令
审批签字
授课时
授课时间
10.18 3-4节11.9 5-6节
授课班级
09电工班、09电梯班
教学目的
ch4-1汇编语言程序设计(伪指令)
由汇编程序执行的“指令系统” 用于定义变量、分配存储区、定义逻辑段、
指示程序开始和结束等 在汇编时被解释执行,不产生任何目标代码
常用伪指令分类
数据定义伪指令 符号定义伪指令 段定义伪指令 过程定义伪指令 宏命令伪指令 结束伪指令
第四章 汇编语言程序设计
第四章 汇编语言程序设计
data SEGMENT
名字 Hello DB ‘Hello, world!’,0DH,0AH,’$’
data ENDS prog SEGMENT
伪指令
ASSUME CS:prog ,DS:data
start: MOV AX,data
MOV DS,AX
标号
LEA DX,hello
MOV AH,9
INT 21H 指令码 MOV AH,4CH
NUM:ADD AL,30H
RET
第四章 汇编语言程序设计
2.汇编语言与高级语言
• 汇编语言是一种依赖于计算机微处理器的语言 • 汇编语言一般不具有通用性和可移植性 • 进行汇编语言程序设计必须熟悉机器的硬件资
源和软件资源 • 高级语言是面向过程的语言 • 高级语言具有很好的通用性和可移植性
第四章 汇编语言程序设计
INT 21H
prog ENDS
操作数
END start
(4)操作数
常量 变量或标号 表达式 寄存器 存储器单元
第四章 汇编语言程序设计
第四章 汇编语言程序设计
表达式: 算术运算 逻辑运算 关系运算 取值运算和属性运算 其它运算
有数字表达式和地址表达式两种。 汇编时按优先规则对表达式进行计算,计算出
注意:
名字和标号: 标号后有冒号,在指令性语句前;名字后不加
汇编语言伪指令
汇编语言伪指令在汇编语言程序里,有一些特殊的助记符,这些助记符与指令系统的助记符不同,它们没有对应的机器码。
这些助记符在源程序中的作用是完成汇编程序的各种准备工作,包括定义变量、分配数据存储空间、控制汇编过程、定义程序入口等。
它们仅仅在汇编的过程中起作用,一旦汇编过程结束,它们的使命也就完成了。
这些助记符称为伪指令,它们所完成的操作称为伪操作。
不同汇编器的伪指令可能存在少量的区别,并非所有的伪指令在任何编译器上都能被识别。
一、符号定义伪指令符号定义(Symbol Definition)伪指令用于定义ARM汇编程序中的变量,对变量赋值和定义寄存器别名等,如表1所列。
表1 符号定义伪指令实例:GBLL P_ON ; 定义全局逻辑变量P_ON P_ON SETL {TRUE} ; 给全局逻辑变量P_ON赋值为真LCLA NUM ; 定义局部数字变量NUM NUM SETA 100 ; 给全局数字变量NUM赋值为100RegList RLIST {R0-R5,R8,R10} ; 定义一个寄存器列表RegList,可用微处理器系统结构与嵌入式系统设计(第3版)2; LDM/STM指令访问该列表二、数据定义伪指令数据定义(Data Denfinition)伪指令一般用于为特定的数据分配存储单元,同时完成对已分配存储单元的初始化工作。
数据定义伪指令如表2所示。
表2 数据定义伪指令从使用方法上来讲,数据定义伪指令可以分为以下3类。
1.SPACE伪指令SPACE用于分配一片连续的存储区,并初始化为0。
其中表达式中的数字表示分配的字节数。
SPACE也可以用%代替。
实例:DataSpace SPACE 100 ; 分配连续100字节的存储单元并初始化为0 2.MAP和FIELD伪指令MAP和伪指令FIELD经常结合在一起使用。
MAP用于定义一个结构化的内存表的首地址,可以用“^”替代。
FIELD用于定义一个结构化的内存表中的数据域,可以用“#”代替。
微型计算机原理及应用-伪指令
用于定义程序中的代码段、数据段 和堆栈段等逻辑段,如SEGMENT、 ENDS等。
过程定义伪指令
用于定义程序中的子程序或过程,如 PROC、ENDP等。
宏定义伪指令
用于定义程序中可重复使用的宏, 如MACRO、ENDM等。
其他伪指令
包括一些特殊的伪指令,如条件汇 编伪指令、列表控制伪指令等。
03 伪指令在汇编语言中的应 用
简化程序编写
符号定义
使用伪指令可以为常量、 变量和地址等定义易于记 忆的符号,避免硬编码, 提高程序的可维护性。
数据结构声明
伪指令可用于声明数组、 结构体等复杂数据结构, 简化数据组织和管理。
宏定义
通过伪指令定义宏,可以 实现代码片段的复用,减 少重复编写相似代码的工 作量。
未来,高级语言可能会进一步吸收伪指令的优点 ,使得编程更加简便、高效。
智能化编程辅助工具的发展
随着人工智能技术的进步,未来可能会出现更加 智能化的编程辅助工具,这些工具能够自动识别 程序员意图,推荐合适的伪指令,进一步提高编 程效率。
THANKS FOR WATCHING
感谢您的观看
未来发展趋势预测
伪指令的标准化
随着计算机技术的发展,伪指令的标准化将成为 一个重要趋势,这将有助于提高程序的可移植性 和兼容性。
伪指令在特定领域的优化
针对特定应用领域,伪指令可能会进行专门优化 ,以适应不同场景下的需求。例如,在嵌入式系 统、图形处理等领域,可能会出现更加专业化的 伪指令集。
高级语言与伪指令的融合
提高程序可读性
注释
伪指令可用于添加注释,说明代 码的功能、实现逻辑等,提高程
序的可读性和可理解性。
格式化输出
4-1伪指令1
2、汇编结束伪指令 END 告诉汇编程序,对源程序的汇编到此结束。在 END以后所写的指令, 汇编程序都不予以处理。 一个源程序只能有一个END命令。 在同时包 含有主程序和子程序的源程序中, 也只能有一个 END命令, 并放到所有指令的最后, 否则, 就有一部 分指令不能被汇编。 例: …… 程序最末尾 …… end
例如: ORG 2000H TAB1: DB 30H, 8AH, 7FH, 73 DB ′5′,′A′,′BCD′ /*单双引号效果一样 由于ORG 2000H, 所以TAB1的地址为2000H, 因此 以上伪指令经汇编以后, 将对 2000H开始的若干内 存单元赋值: (2000H) = 30H (2001H) = 8AH (2002H) = 7FH (2003H) = 49H ; 十进制数 73 以十六进制数存放 (2004H) = 35H ; 数字 5 的ASCII码 (2005H) = 41H ; 字母A的ASCII码 (2006H) = 42H ; ′BCD′中B的ASCII码 (2007H) = 43H ; ′BCD′中C的ASCII码 (2008H) = 44H ; ′BCD′中D的ASCII码
本节课要点:
有关汇编过程及汇编程序格式说明; 常用汇编伪指令的用法介绍和举例; 程序设计方法(一)
汇编语言概述 1、汇编语言与汇编的概念 机器语言就是用二进制代码指令来编写的程序语 言。机器语言编的程序也称为目的(目标)程序, 装入内存中,执行时最直接、速度最快。 把汇编语言源程序变为二进制代码程序的过程叫 做汇编。汇编有两种方法,即手工汇编和机器汇 编。 实际上,汇编就是把用汇编语言格式写的源程序 翻译成计算机能够识别和执行的目标程序。
15、
CJNE A,#0,feiling MOV 20H,#0FFH sjmp $ feiling: jnc zheng MOV 20H,#0FFH SJMP JS ZHENG: MOV 20H,#0 JS: SJMP $
伪指令
4.3汇编语言程序格式 4.3汇编语言程序格式
4.3汇编语言程序格式 4.3汇编语言程序格式 汇编语言程序中的每个语句可以由四项组成 [name] operation operand [;comment]
其中名字项是一个符号。 操作项是一个操作码的助记符,它可以是指令, 操作项是一个操作码的助记符,它可以是指令,它可以 是指令,伪操作或宏指令名。 操作数项由一个或多个表达式组成,它提供为执行所 要求的操作而需要的信息。 注释项用来说明程序或语句的功能。‘ 注释项用来说明程序或语句的功能。‘;’为识别注 释项的开始。‘ 释项的开始。‘;’也可以从一行的第一个字符开始, 此时整行都是注释,常用来说明下面一段程序的功能。
4.2.4对准伪操作 4.2.4对准伪操作
对准伪操作 EVEN伪操作使下一个字节地址成为偶数。 EVEN伪操作使下一个字节地址成为偶数。 例: DATA_SEG SEGMENT EVEN WORD_ARRAY DW 100 DUP(100) DATA_SEG ENDS
4.2.4对准伪操作 4.2.4对准伪操作
4.2伪操作 4.2伪操作
4、操作数还可以是 repeat_count DUP (operand,operand,……,operand)repeat_count (operand,operand,……,operand)repeat_count 用来指定括号中的操作数的重复次数。 例: ARRAY1 DB 2 DUP(0,1,2,?) ARRAY2 DB 100 DUP(?)
4.1汇编程序功能 4.1汇编程序功能
汇编程序的主要功能: 1、检查源程序 2、测出源程序中的语法错误,并给出出错信 息。 3、产生源程序的目标程序,并可给出列表文 件(同时列出汇编语言和机器语言的文件, 称为列表文件) 4、展开宏指令。
第四章伪指令
第四章伪指令汇编语言源程序由一系列语句构成,这些语句既可以是指令,也可以是伪指令。
指令是由CPU负责执行的,每一条指令都和一条机器语言相对应。
而伪指令是由汇编程序负责执行,完成一些内存单元分配、段之间的连接关系等操作,所以伪指令并不会生成机器指令,也就不会被CPU执行。
在本章中,重点讲解一些常用的伪指令及其功能。
4.1伪指令的分类及伪指令语句格式伪指令又称为伪操作,它虽然不会被CPU执行,但却可以指示汇编程序按照用户的意图,完成数据的定义、存储器的分配、指示程序结束等功能。
所以伪指令在汇编语言程序设计过程中具有重要的意义,希望读者在学习过程中应该加以高度重视。
4.1.1 伪指令的分类8088/8086的伪指令大致可分为以下八类:·数据定义伪指令;·符号定义伪指令;·段定义伪指令;·过程定义伪指令;·结束伪指令;·条件汇编伪指令;·结构、记录定义伪指令;·其他伪指令。
其中,条件汇编伪指令与结构、记录定义伪指令将在第八章予以介绍。
4.1.2 伪指令语句格式伪指令语句格式一般由四部分组成。
语句格式: [变量] 伪指令助记符参数1,参数2····参数n[;注释]说明:伪指令助记符规定了伪指令的功能。
一般伪指令都有参数,用于说明伪指令的操作对象,参数的类型和个数随着伪指令的不同而不同。
有时参数是常数或数值表达式,有时参数是一般的符号,有时是具有特殊意义的符号。
伪指令语句中的变量可有可无,如果伪指令语句中出现变量,则汇编程序使其记以第一个字节的偏移地址。
注释部分也是可有可无的,用于说明该伪指令的功能。
例如 VAR1 DW 1234H,5678H ;定义VAR1为字变量该语句中的VAR1为变量;DW为伪指令助记符;1234H与5678H为参数;分号后面给出的文字为注释。
4.2汇编语言中的数据项数据项是指令或伪指令语句操作对象的基本组成部分。
伪指令
BUF3 DD‘HELLO’;超过2个字符的字符串只能用DB
BUF4 DB BLOCK;地址表达式只能用DW或DD定义
如将DB改为DW,则操作数项表示取BLOCK的偏移地
址;如将DB改为DD,则操作数项表示取BLOCK的偏移
地址和段地址,且第一个字为偏移地址,第二个字为段地址。
注意事项:段寄存器名必须是CS、DS、ES、SS中的
一个,而段名则必须是由SEGMENT定义的
段名,并且用SEGMENT定义了几个段,
ASSUME伪指令就需要指明几个段。
4.过程定义伪指令
过程定义伪指令用来定义一个子程序,子程序又称过程,在主程序中由CALL指令调用,调用结束将返回到主程序中CALL指令的下一条指令继续执行,而子程序中必须有一条返回指令RET。
STR2DB16 DUP(?)
CNTEQU $-STR1
MOVCX,CNT
3.操作数值不能超出相应数据类型限定的取值范围。
4.操作数项可以包括多个数据,它们之间用逗号隔开。操作数项可以是常数表达式、地址表达式(仅适用DW、DD)、字符串(超过2个字符仅用DB)、问号(只分配存储单元,而不赋值)、重复子句DUP。
下面是不正确的定义:
BUF1:DB 90H,80H;变量不能有冒号
5.模块定义伪指令
在汇编语言中每一个独立的源程序称为一个模块,在源程序的开始可以用NAME或TITLE伪指令为模块命名,而源程序结束使用END伪指令。
指令格式:NAME模块名
TITLE模块名
END[标号]
指令功能:
1. NAME伪指令可以缺省,如果缺省NAME指令,汇编程序
以TITLE指令中前6个字符作为模块名.
伪指令知识点总结
伪指令知识点总结伪指令这玩意儿,听起来是不是有点玄乎?其实啊,它就像我们生活中的“幕后英雄”,虽然不直接参与“表演”,但却起着至关重要的作用。
比如说,在编程的大舞台上,指令就像是冲锋陷阵的战士,执行着各种具体的任务。
而伪指令呢,则像是军师,在幕后出谋划策,为整个程序的架构和布局提供指导。
咱先来说说数据定义伪指令。
这就好比是在为程序的“仓库”划分区域,规定好每个区域存放什么样的“货物”。
比如说,定义一个字节类型的数据,就像是给仓库里划出一个小格子,只能放一个小小的“物件”;定义一个字类型的数据呢,那就是一个稍微大一点的格子,可以放个稍微大一点的“宝贝”。
你说这是不是很形象?再看看段定义伪指令。
这就像是给程序的“大部队”划分阵营。
不同的阵营有不同的任务和职责。
比如说,代码段就是专门负责执行具体操作的“战斗部队”;数据段呢,则是存放各种“粮草弹药”的地方。
如果没有段定义伪指令,那程序岂不是乱成了一锅粥?还有过程定义伪指令,这就像是给程序中的一个小任务成立了一个“特别行动小组”。
这个小组有自己的规则和流程,能独立完成特定的功能。
宏定义伪指令呢?这就好比是给程序制作了一个“快捷方式”。
当你需要重复执行一段复杂的操作时,不用一次次地重复写那些代码,只要调用这个“快捷方式”就行了,多省事啊!伪指令的作用可不仅仅是这些,它还能控制程序的编译过程,就像是一个精明的“导演”,掌控着整个程序的“拍摄进度”和“效果呈现”。
总之,伪指令在编程中可是不可或缺的存在。
要是没有它们,程序就像是失去了方向的船只,在茫茫的代码海洋中迷失。
所以啊,咱们可得好好掌握这些伪指令的知识,让我们的程序能够高效、准确地运行,为我们解决各种复杂的问题。
你说是不是这个理儿?。
8086CPU指令和伪指令(中英文全解)
8086CPU指令和寄存器英文全称。
一、数据传送指令比如,mov(move)、push、pop、pushf(push flags)、popf(pop flags)、xchg(exchange)等都是数据传送指令,这些指令实现寄存器和内存、寄存器和寄存器之间的单个数据传送。
二、算术运算指令比如,add、sub(substract)、adc(add with carry)、sbb(substract with borrow)、inc (increase)、dec(decrease)、cmp(compare)、imul(integer multiplication)、idiv (integer divide)、aaa(ASCII add with adjust)等都是算术运算指令,这些指令实现寄存器和内存中的数据运算。
它们的执行结果影响标志寄存器的sf、zf、of、cf、pf、af位。
三、逻辑指令比如,and、or、not、xor(exclusive or)、test、shl(shift logic left)、shr(shift logic right)、sal(shift arithmetic left)、sar(shift arithmetic right)、rol(rotate left)、ror(rotate right)、rcl(rotate left through carry)、rcr(rotate right through carry)等都是逻辑指令。
除了not 指令外,它们的执行结果都影响标志寄存器的相关标志位。
四、转移指令可以修改IP,或同时修改CS和IP的指令统称为转移指令。
转移指令分为一下几类。
(1)无条件转移指令,比如,jmp(jump);(2)条件转移指令,比如,jcxz(jump if CX is zero)、je(jump if equal)、jb(jump if below)、ja(jump if above)、jnb(jump if not below)、jna(jump if not above)等;(3)循环指令,比如,loop;(4)过程,比如,call、ret(return)、retf(return far);(5)中断,比如,int(interrupt)、iret(interrupt return)。
arm汇编伪指令详解(转载)
arm汇编伪指令详解(转载)4.1 ARM汇编器所⽀持的伪指令在ARM汇编语⾔程序⾥,有⼀些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作。
伪指令在源程序中的作⽤是为完成汇编程序作各种准备⼯作的,这些伪指令仅在汇编过程中起作⽤,⼀旦汇编结束,伪指令的使命就完成。
在ARM的汇编程序中,有如下⼏种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令以及其他伪指令。
4.1.1 符号定义(Symbol Definition)伪指令符号定义伪指令⽤于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。
常见的符号定义伪指令有如下⼏种:— ⽤于定义全局变量的GBLA、GBLL和GBLS。
— ⽤于定义局部变量的LCLA、LCLL和LCLS。
— ⽤于对变量赋值的SETA、SETL、SETS。
— 为通⽤寄存器列表定义名称的RLIST。
1、 GBLA、GBLL和GBLS语法格式:GBLA(GBLL或GBLS)全局变量名GBLA、GBLL和GBLS伪指令⽤于定义⼀个ARM程序中的全局变量,并将其初始化。
其中:GBLA伪指令⽤于定义⼀个全局的数字变量,并初始化为0;GBLL伪指令⽤于定义⼀个全局的逻辑变量,并初始化为F(假);GBLS伪指令⽤于定义⼀个全局的字符串变量,并初始化为空;由于以上三条伪指令⽤于定义全局变量,因此在整个程序范围内变量名必须唯⼀。
使⽤⽰例:GBLA Test1 ;定义⼀个全局的数字变量,变量名为Test1Test1 SETA 0xaa ;将该变量赋值为0xaaGBLL Test2 ;定义⼀个全局的逻辑变量,变量名为Test2Test2 SETL {TRUE} ;将该变量赋值为真GBLS Test3 ;定义⼀个全局的字符串变量,变量名为Test3Test3 SETS “Testing” ;将该变量赋值为“Testing”2、 LCLA、LCLL和LCLS语法格式:LCLA(LCLL或LCLS)局部变量名LCLA、LCLL和LCLS伪指令⽤于定义⼀个ARM程序中的局部变量,并将其初始化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编语言语句实例
MOV CX,0 ;传送指令,具有2个操作数
DELAY: NOP
;带有标号
LOOP DELAY ;标号delay作循环指令的操作数
标号是反映指令位置(逻辑地址)的标识符,用冒号分隔 名字是反映伪指令位置(逻辑地址)和属性的标识符,后跟
空格或制表符分隔,没有冒号
BUFFER
DB
; 定义符号PORT代表88H ; 定义符号DATA代表PORT+2
33
2.数据定义伪指令
变量是内存中数据区的名字,又叫变量定义伪指令。 格式为: 变量名 伪指令助记符 操作数 ;注释 变量名后面无冒号,可有可无。
功能:分配存贮单元并赋初值。
操作数可以是常数或表达式,相当于初值。 伪指令助记符有如下几种:
DATA EQU PORT+2 ; 定义符号DATA代表PORT+2
注意:① 用EQU定义的符号,不能重新再定义,除 非用PURGE伪指令解除。 ② 如果在表达式中用了其他符号,必须实现定义。
32
等号(赋值)伪指令
格式:<符号名> = <表达式> 功能:与EQU类似,唯一的区别是“=”可以随时 对符号名赋新值,而不必使用PURGE伪指令。 例: PORT = 88H DATA = PORT+2
子程序调用和返回有段间(即远程FAR PTR) 和段内(即近程NEAR PTR)之分。
11
5. 中断指令
• 中断(Interrupt )是又一种改变程序执行 顺序的方法 • 中断具有多种中断类型 • 中断的指令有3条:
INT n IRET INTO
• 本节主要掌握类似子程序调用指令的中断 调用指令INT n
60
0FFFDH
35
例2:定义字符串
MESS DB ‘HELLO’ MM DW ‘AB’
MESS+0 +1 +2 +3 +4 MM ‘H’ ’E’ ’L’ ’L’ ’O’ ’B’ ‘A’ 47H 45H 4CH 4CH 4FH 42H 41H
低地址
注意下面的不同: DB ’AB’ 41 42 ‘A’ ‘B’
41
DATA SEGMENT A A DB 10×20 STR1 DB ‘HI OK!’,0DH,0AH, ‘$’ STR1 DATA1 DW 2 DUP(0) SUM DW ? TABLE DB 2 DUP(3 DUP (3),7) DATA ENDS
14
2.外部同步指令
(1)暂停指令 HLT
HLT ;进入暂停状态 •暂停指令使CPU进入暂停状态,这时CPU不进行任何 操作。当CPU发生复位或来自外部的中断时,CPU脱 离暂停状态 •HLT指令可用于程序中等待中断。当程序中必须等待 中断时,可用HLT,而不必用软件死循环。然后,中断 使CPU脱离暂停状态,返回执行HLT的下一条指令 •HLT不影响标志位。
24
4.1 汇编语言的语句格式
⑴指令性语句——由指令构成的语句,是计算机可 执行的, 出现在程序的代码段中每个语句由1~4 个部分组成,格式为: [标号:] 指令助记符 [操作数 [,操作数]] [;注释] (1) (2) (3) (4) 其中: 用方括号括起来的部分,可以有也可以没有; 每部分之间用空格(至少一个)分开; 一行最多可有132个字符。
1
LOOP
格式:LOOP label 操作:(CX)-1→CX; 若(CX)≠0,则转至label处执行; 否则退出循环,执行LOOP后面的 指令。
实际上,该指令可以等价两条指令:
DEC CX ;CX-1→CX JNZ dst ;ZF=0,转向dst执行
2
不影响标志位。
例、编写指令序列,确定AL中“1”的个数。
解: XOR AH,AH ;累加器清零
MOV CX,08H
Start:ROL AL,1
;设置循环次数
;AL循环左移1位
;AL的最高位送CF
JNC Lp ;CF=0,转移到Lp
INC AH
Lp: LOOP Start
;CF=1,AH+1→AH
;CX-1→CX,CX≠0 ;循环到Start执行
3
例:记录字符串中空格的个数
;字符个数减1,不为0继续循环;
4. 子程序指令(调用和返回)
• 子程序是完成特定功能的一段程序
当主程序(调用程序)需要执行这个功 能时,采用CALL调用指令转移到该子程 序的起始处执行 当运行完子程序功能后,采用RET返回 指令回到主程序继续执行
8
子程序调用指令 CALL
(1)调用指令 指令格式:CALL dst(子程序名) 指令功能:无条件的转移到子程序执行。
START:
MOV
AX,DATA
; 数据段基址→AX
25
标号
• 由下列字符组成:大小写字母;数字0~9;某些 特殊字符(@、_、· 、?、$)。
• 标号的有效长度是31。 • 第一个字符不能是数字,“?”不能单独作为标号。 标号: START 标号: MAIN% MY_PROGRAM 1BETA 有效 无效
DB DW DD 定义字节 (Define Byte) 定义字(Define Word) 定义双字(Define Doubleword)
34
例1
P DB 10 , 4 , 10H P1 DW 100 P2 DD 3×20, 0FFFDH
P+0 +1 +2 P1+0 +1 P2+0 +1 +2 +3 +4 +5 +6 +7 0AH 04H 10H 64H 00H 3CH 00 00 00 0FDH 0FFH 00 00 10 4 10H 100
作 业
P74:1;2(1、3、5、7、9);3;4;5 P75:7(1、7);8(1);9
20
第四章 汇编语言程序设计
•汇编语言的伪指令、运算符 •汇编语言程序的结构
•汇编语言程序的上机过程
•基本程序设计
21
• 汇编语言源程序:用汇编语言编写的程序,源 程序. • 汇编:相当于一个”翻译员”,自动的把汇编 语言程序翻译成机器语言,该过程称为汇编. • 汇编程序:完成汇编任务的程序. • 目标程序:相应形成的机器语言程序.
DUP的格式为: 重复次数 DUP(重复参数)
如: DO-2 DB 2 DUP(0,1,2,?) 与 DO-2 DB 0,1,2,?,0,1,2,? 等价
38
字节变量的应用
data segment ;数据段 X db 'a',-5 db 2 dup(100),? Y db 'ABC' data ends mov al,X ;此处X表示它的第1个数据,故AL←'a' dec X+1 ;对X为始的第2个数据减1,故成为-6
3.7 处理器控制指令
1.标志操作指令
用来设置标志位的状态。 (1)CF设置指令 CLC 0→CF STC 1→CF CMC CF变反 (2)IF设置指令 CLI 0→IF (禁止INTR中断) STI 1→IF (开放INTR中断) (3)DF设置指令
CLD STD 0→DF (串操作的指针移动方向从低到高) 1→DF (串操作的指针移动方向从高到低)
1,2,3,4,5,6,7
;数据定义伪指令,在主存中开辟7个连续的字 节单元,初值依次为1~7,BUFFER表示首地址
30
4.2 伪指令
常用的伪指令有: • 符号定义伪指令 • 数据定义伪指令 • 段定义伪指令 • 过程定义伪指令 • 结束伪指令
31
1.符号定义伪指令EQU(Equate)
格式: <符号名> EQU <表达式> 功能:给符号名赋值。名字根据标号规则定义,表达式 应该是可以计算得出一个具体值。 例: PORT EQU 88H ; 定义符号PORT代表88H
18
数 据 MOV 传 送 LEA 指令 PUSH POP 输入 IN 输出 OUT 算术 ADD 运算 ADC 指令 INC SUB SBB DEC CMP
指令总结
逻 辑 AND 运 算 OR 移 位 XOR 指令 SHL/SHR SAL/SAR ROL/ROR RCL/RCR 程 序 JMP 控 制 CALL 指令 RET LOOP Jcc 其它 HLT 指令 NOP CLC STC
3. 循环指令(loop)
JCXZ label ;CX=0,转移到标号label LOOP label ;CX←CX-1, ;CX≠0,循环到标号label LOOPZ label ;CX←CX-1, ;CX≠0且ZF=1,循环到标号label LOOPNZ label ;CX←CX-1, ;CX≠0且ZF=0,循环到标号label 控制某程序段反复执行的次数。循环指令默认利 用CX计数器,方便实现计数循环的程序结构 label操作数采用相对寻址方式
12
控制转移指令小结
指 令 主要特点 无条件转移指令(JMP) 没有范围限制。 条件转移指令Jcc dst8 转移范围必须在+127~-128 之内。 循环控制指令LOOP dst8 CX中预置循环次数。 调用和返回指令 用于主程序中,调用子程序。 CALL dst 用于子程序最后,返回主程 RET 序。 中断指令INT n 用于主程序中,调用中断程 IRET 序。 INTO 13
26
⑵指示性语句——由伪指令构成的语句,不能执 行,用来定义变量、分配存储单元、指示程序开 始和结束等。 名字 区别 伪指令 操作数 ;注释
在形式上:带不带冒号,是否可转向它.
在本质上:汇编时能否形成对应的机器码.