汇编常用伪指令

合集下载

汇编语言伪指令

汇编语言伪指令

汇编语言伪指令汇编语言作为一种低级编程语言,广泛应用于嵌入式系统、驱动程序开发和操作系统内核等领域。

在进行汇编语言编程时,我们常常会使用到一些伪指令。

本文将介绍一些常见的汇编语言伪指令及其用法。

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——伪指令

《汇编语⾔》学习笔记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指令进⾏初始化。

asm汇编伪指令大全

asm汇编伪指令大全

在ARM 汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作。

伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成。

在ARM 的汇编程序中,有如下几种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令以及其他伪指令。

符号定义(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 程序中的局部变量,并将其初始化。

汇编常见伪指令

汇编常见伪指令

汇编常见伪指令汇编常见伪指令转⾃:⼀、与宏有关的伪指令在宏定义时,为了满⾜某种特殊需要,汇编语⾔还提供了⼏个伪指令。

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 ┆

汇编指令、伪指令大全

汇编指令、伪指令大全

MOV指令为双操作数指令,两个操作数中必须有一个是寄存器.MOV DST , SRC // Byte / Word执行操作: dst = src1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器).2.立即数不能直接送段寄存器3.不允许在两个存储单元直接传送数据4.不允许在两个段寄存器间直接传送信息PUSH入栈指令及POP出栈指令: 堆栈操作是以"后进先出"的方式进行数据操作.PUSH SRC //Word入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器.入栈时高位字节先入栈,低位字节后入栈.POP DST //Word出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器.执行POP SS指令后,堆栈区在存储区的位置要改变.执行POP SP 指令后,栈顶的位置要改变.XCHG(eXCHanG)交换指令: 将两操作数值交换.XCHG OPR1, OPR2 //Byte/Word执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp1.必须有一个操作数是在寄存器中2.不能与段寄存器交换数据3.存储器与存储器之间不能交换数据.XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码.XLAT (OPR 可选) //Byte执行操作: AL=(BX+AL)指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码.LEA(Load Effective Address) 有效地址传送寄存器指令LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中.执行操作: REG = EAsrc注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器MOV BX , OFFSET OPER_ONE 等价于 LEA BX , OPER_ONEMOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中LDS(Load DS with pointer)指针送寄存器和DS指令LDS REG , SRC //常指定SI寄存器。

8086汇编语言伪指令

8086汇编语言伪指令

一、伪指令详解伪指令在百度百科中的定义为:伪指令(Pseudo Instruction)是用于对汇编过程进行控制的指令,该类指令并不是可执行指令,没有机器代码,只用于汇编过程中为汇编程序提供汇编信息。

例如,提供如下信息:哪些是指令、哪些是数据及数据的字长、程序的起始地址和结束地址等。

伪指令有2个特点:1.由于是伪“指令”,因而它只存在于汇编语言中。

高级语言中不叫指令,叫语句;2.由于是“伪”指令,也即“假”指令,因而不是可执行指令,不会产生机器代码,不会占用ROM空间,只用于汇编过程中为汇编程序提供汇编信息。

与指令的区别::1.指令是在执行阶段发挥作用的,由CPU(Intel、AMD等)来执行。

2.伪指令是在编译阶段发挥作用的,由汇编器(MASM、TASM等)来解释。

二、数据定义伪指令为源程序中的数据和堆栈区分配数据存储单时,使用最多的伪指令。

数据定义伪指令格式如下:常用的数据定义伪指令类型有:∙DB(定义字节,常用)一个字节数据占1个字节单元,读完一个,偏移量加1∙DW(定义字,常用)一个字数据占2个字节单元,读完一个,偏移量加2∙DD(定义双字)一个双字数据占4个字节单元,读完一个,偏移量加4∙DQ(定义四字)一个四字数据占8个字节单元,读完一个,偏移量加8∙DT(定义十字节,用于BCD码)数据定义伪指令后面的初值表可以是常数、表达式、字符串。

例如:D2DW110*230;为D2分配1个字,存放表达式的值D3DB‘GOOD!’;为D3分配5字节,用来存放字符串‘GOOD!’D4DD2.4E+3;为D4分配2个字,存放一个浮点数D5DB‘AB’;为D5分配2字节,字符A在低字节,B在高字节D6DW‘AB’;为D6分配1个字,字符A在高字节,B在低字节S1DB5DUP(?);为S1预留5字节的存储空间S2DW3DUP(0);为S2分配3个字,初值设为0语句1相当于C语言中的DW D2=110*230,只不过是语法结构不太一样注意:通过变量名操作时,变量名代表存储区的第一个数据的地址。

汇编言语——常用伪指令

汇编言语——常用伪指令

(5)可以用ASSUME伪指令指定两个或两个以上的段寄存 器作为同一个段中标识符的缺省段寄存器。当数据定义与指令 写在同一个段中时,就会出现以CS、DS甚至ES一起作为一个 段的缺省段寄存器的情况。此时,有关数据的操作(取值、存 数等)优先以DS作为段寄存器。 (6)ASSUME可以在程序的不同行上出现多次,并且可以 对一个段寄存器进行两次或两次以上的对应关系指定。当程序 中用ASSUME指定了一个段寄存器是某个段的缺省段寄存器后, 在程序的后续行中一直有效,除非再次使用ASSUME伪指令改 变该段寄存器与段的对应关系。
【解】变量a的定义中出现的$是带引号的,表示ASCII码 值为24H的符号而不是偏移地址;定义变量b时用的两个$没有 加引号,表示偏移地址,按照地址分配原则,第一个$代表 0001H,第二个$代表0003H;在变量c的定义中,$出现在数值 表达式中,是当前偏移地址0005H,变量a的起始偏移地址是 0000H,两者相减的结果是5,并且不再有类型,因此可以作 为字节型变量的一项初值。图5.6是该数据段对应的内存图。 a b
5.3 ASSUME
ASSUME伪指令占一行,用于指出后续程序中所使用的变 量、标号等标识符在涉及到逻辑地址的段地址部分时,用哪 个段寄存器作为缺省段地址。 【格式】ASSUME R1:S1 , R2:S2 , ... 【说明】 (1)格式中的Ri代表段寄存器名。必须是DS、ES、SS、 CS四个之一,Si是段地址,只能是一个段名或者“SEG 变量 名”的形式。 (2)Ri:Si是一组对应关系,表示Si段中的标识符都使用Ri 作为缺省段寄存器。 。
5.6 $ $是汇编语言中的一个特殊符号,代表汇编程序在处理到$ 所在的位置时当前安排的偏移地址值。程序中出现的$可以作 为常量看待,但是不同位置上的$,其代表的值是不同的。与 一般的数据不同的是,通常所说的常量(数值)是没有类型的, 包括“OFFSET 变量名”也没有类型,但$所表示的数据一定 是字型。$一般作为字型变量定义时的一个初值使用。 【例5.18】分析下面数据段中各$符所表示的值。 data SEGMENT a DB '$' b DW $,$ c DB $-a data ENDS

伪指令

伪指令

1、ASSERT :DEF:ENDIAN_CHANGEASSERT 是断言伪指令,语法是:ASSERT +逻辑表达式def 是逻辑伪操作符,格式为::DEF:label,作用是:判断label是否定义过ARM 伪指令ARM 汇编程序的由机器指令,伪指令和宏指令组成。

伪指令不像机器指令那样在处理器运行期间由机器执行,而是汇编程序对源程序汇编期间由汇编程序处理。

在前面的指令集章节中,我们已经接触了几条常用到的伪指令,如ADR 、ADRL、LDR、NOP 等,把它们和指令集一起介绍是因为它们在汇编时会被合适的机器指令代替,实现真正机器指令操作。

宏是一段独立的程序代码,它是通过伪指令定义的,在程序中使用宏指令即可调用宏。

当程序被汇编时,汇编程序将对每个调用进行展开,用宏定义取代源程序中的宏指令。

1 符号定义伪指令符号定义伪指令用于定义ARM 汇编程序的变量,对变量进行赋值以及定义寄存器名称,该类伪指令如下:全局变量声明:GBLA、GBLL 和GBLS。

局部变量声明:LCLA、LCLL 和LCLS。

变量赋值: SETA、SETL 和SETS。

为一个通用寄存器列表定义名称:RLIST。

为一个协处理器的寄存器定义名称:CN。

为一个协处理定义名称: CP。

为一个VFP 寄存器定义名称:DN 和SN。

为一个FPA 浮点寄存器定义名称:FN。

GBLA、GBLL、GBLS全局变量声明伪指令。

GBLA 伪指令用于声明一个全局的算术变量,并将其初始化为0。

GBLL 伪指令用于声明一个全局的逻辑变量,并将其初始化为{FALSE}。

GBLS 伪指令用于声明一个全局的字符串变量,并将其初始化为空字符串“”。

伪指令格式:GBLA variableGBLL variableGBLS variable其中:variable 定义的全局变量名,在其作用范围内必须惟一。

全局变量的作用范围为包含该变量的源程序。

伪指令应用举例如下:GBLL codedbg ;声明一个全局逻辑变量codebg SETL {TRUE} ;设置变量为{TRUE}…LCLA、LCLL、LCLS局部变量声明伪指令,用于宏定义的体中。

汇编指令(常用指令)

汇编指令(常用指令)

汇编指令百科名片汇编指令是汇编语言中使用的一些操作符(如mov,inc,loop)和助记符,还包括一些伪指令(如assume,end)。

用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。

目录一、数据传输指令二、算术运算指令三、逻辑运算指令四、串指令五、程序转移指令六、伪指令编辑本段一、数据传输指令它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据。

1. 通用数据传送指令MOV 传送字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压入堆栈.POP 把字弹出堆栈.PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP 交换32位寄存器里字节的顺序XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )XADD 先交换再累加.( 结果在第一个操作数里)XLAT 字节查表转换.── BX 指向一张256 字节的表的起点, AL 为表的索引值(0-255,即0-FFH); 返回AL 为查表结果. ( [BX+AL]->AL )2. 输入输出端口传送指令.IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器)输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时, 其范围是0-65535.3. 目的地址传送指令.LEA 装入有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES.例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装入AH.SAHF 标志寄存器传送,把AH内容装入标志寄存器.PUSHF 标志入栈.POPF 标志出栈.PUSHD 32位标志入栈.POPD 32位标志出栈.编辑本段二、算术运算指令ADD 加法.ADC 带进位加法.INC 加 1.AAA 加法的ASCII码调整.DAA 加法的十进制调整.SUB 减法.SBB 带借位减法.DEC 减 1.NEC 求反(以0 减之).CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的十进制调整.MUL 无符号乘法.IMUL 整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算), AAM 乘法的ASCII码调整.DIV 无符号除法.IDIV 整数除法.以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)编辑本段三、逻辑运算指令AND 与运算.or 或运算.XOR 异或运算.NOT 取反.TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).SHL 逻辑左移.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上八种移位指令,其移位次数可达255次.移位一次时, 可直接用操作码. 如SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数.如MOV CL,04SHL AX,CL编辑本段四、串指令DS:SI 源串段寄存器:源串变址.ES:DI 目标串段寄存器:目标串变址.CX 重复次数计数器.AL/AX 扫描值.D标志0表示重复操作中SI和DI应自动增量; 1表示应自动减量.Z标志用来控制扫描或比较操作的结束.MOVS 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )CMPS 串比较.( CMPSB 比较字符. CMPSW 比较字. )SCAS 串扫描.把AL或AX的内容与目标串作比较,比较结果反映在标志位.LODS 装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )STOS 保存串.是LODS的逆过程.REP 当CX/ECX<>0时重复.REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.REPC 当CF=1且CX/ECX<>0时重复.REPNC 当CF=0且CX/ECX<>0时重复.编辑本段五、程序转移指令1>无条件转移指令(长转移)JMP 无条件转移指令CALL 过程调用RET/RETF过程返回.2>条件转移指令(短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 )JA/JNBE 不小于或不等于时转移.JAE/JNB 大于或等于转移.JB/JNAE 小于转移.JBE/JNA 小于或等于转移.以上四条,测试无符号整数运算的结果(标志C和Z).JG/JNLE 大于转移.JGE/JNL 大于或等于转移.JL/JNGE 小于转移.JLE/JNG 小于或等于转移.以上四条,测试带符号整数运算的结果(标志S,O和Z).JE/JZ 等于转移.JNE/JNZ 不等于时转移.JC 有进位时转移.JNC 无进位时转移.JNO 不溢出时转移.JNP/JPO 奇偶性为奇数时转移.JNS 符号位为"0" 时转移.JO 溢出转移.JP/JPE 奇偶性为偶数时转移.JS 符号位为"1" 时转移.3>循环控制指令(短转移)LOOP CX不为零时循环.LOOPE/LOOPZ CX不为零且标志Z=1时循环.LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.JCXZ CX为零时转移.JECXZ ECX为零时转移.4>中断指令INT 中断指令INTO 溢出中断IRET 中断返回5>处理器控制指令HLT 处理器暂停, 直到出现中断或复位信号才继续.WAIT 当芯片引线TEST为高电平时使CPU进入等待状态. ESC 转换到外处理器.LOCK 封锁总线.NOP 空操作.STC 置进位标志位.CLC 清进位标志位.CMC 进位标志取反.STD 置方向标志位.CLD 清方向标志位.STI 置中断允许位.CLI 清中断允许位.编辑本段六、伪指令DW 定义字(2字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段.ASSUME 建立段寄存器寻址.ENDS 段结束.END 程序结束.七、处理机控制指令:标志处理指令CLC(进位位置0指令)CMC(进位位求反指令)STC(进位位置为1指令)CLD(方向标志置1指令)STD(方向标志位置1指令)CLI(中断标志置0指令)STI(中断标志置1指令)NOP(无操作)HLT(停机)WAIT(等待)ESC(换码)LOCK(封锁)。

汇编-伪指令

汇编-伪指令

[汇编]伪指令(一)段定义伪指令段定义伪指令是表示一个段开始和结束的命令,80x86有两种段定义的方式:完整段定义和简化段定义,分别使用不同的段定义伪指令来表示各种段。

1 完整的段定义伪指令完整段定义伪指令的格式如下:段名SEGMENT...段名ENDS段名由用户命名。

对于数据段、附加段和堆栈段来说,段内一般是存储单元的定义、分配等伪指令语句;对于代码段中则主要是指令及伪指令语句。

定义了段还必须说明哪个段是代码段,哪个段是数据段。

ASSUME伪指令就是建立段和段寄存器关系的伪指令,其格式为:ASSUME段寄存器名: 段名,…段寄存器名必须是CS、DS、ES和SS中的一个,而段名必须是由SEGMENT定义的段名。

·定位类型:说明段的起始边界值(物理地址)。

·组合类型:说明程序连接时的段组合方法。

·类别:在单引号中给出连接时组成段组的类型名。

连接程序可把相同类别的段的位置靠在一起。

例4.1; * * * * * * * * * * * * * * * * * * * * * * *data_seg1 segment ; 定义数据段...data_seg1 ends; * * * * * * * * * * * * * * * * * * * * * * *data_seg2 segment ; 定义附加段...data_seg2 ends; * * * * * * * * * * * * * * * * * * * * * * *code_seg segment ; 定义代码段assume cs:code_seg, ds:data_seg1, es:data_seg2start: ; 程序执行的起始地址; set DS register to current data segmentmov ax, data_seg1 ; 数据段地址mov ds, ax ; 存入DS寄存器; set ES register to current extra segmentmov ax, data_seg2 ; 附加段地址mov es, ax ; 存入ES寄存器...code_seg ends ; 代码段结束; * * * * * * * * * * * * * * * * * * * * * * * * * *end start由于ASSUME伪指令只是指定某个段分配给哪一个段寄存器,它并不能把段地址装入段寄存器中,所以在代码段中,还必须把段地址装入相应的段寄存器中:MOV AX,DATA_SEG1 ; 数据段地址MOV DS,AX ; 存入DS寄存器MOV AX,DATA_SEG2 ; 附加段地址MOV ES,AX ; 存入ES寄存器如果程序中还定义了堆栈段STACK_SEG,也需要把段地址装入SS中:MOV AX,STACK_SEG ; 堆栈段地址MOV SS,AX ; 存入ES寄存器注意,在程序中不需要用指令装入代码段的段地址,因为在程序初始化时,装入程序已将代码段的段地址装入CS寄存器了。

(完整版)汇编语言中常用的伪指令档

(完整版)汇编语言中常用的伪指令档

汇编语言中常用的伪指令分类:软件相关2013-01-23 20:13 515人阅读评论(0) 收藏举报areaequ伪指令常用汇编语言汇编语言中,指令语句在源程序汇编时会产生可供计算机执行的指令代码,即目标代码。

汇编程序除指令语句外,还需要提供一些指令,用于辅助源程序的汇编。

比如指定程序或数据存放的起始地址,为数据分配一段连续的内存单元等。

这些指令在汇编时并不生成目标代码,不影响程序执行,因此称之为伪指令。

本文简单总结了常用的伪指令,如下。

1、EQU(Equate)一般格式为:标号:EQU 操作数指令功能为将操作数赋予标号,两边的值完全相等。

使用EQU伪指令给一个标号赋值后,此标号在整个源文件中值固定。

AREA: EQU 1000H ;将标号AREA赋值为1000H2、ORG(Origin)一般格式为:ORG xxxxH(绝对地址或标号)XxxxH决定此语句后第一条指令(或数据)的地址。

该段源程序或数据被连续存放在此后的地址内,直到下一条ORG指令为止。

ORG 8000H ;此后目标代码存储在存储器中以0x8000h开始的地址空间中。

ADD R1,#1MOV R2, #23、DB(Define Byte)一般格式为:标号:DB 字节常数或字符或表达式标号字段可有可无,字节常数或字符是指一个字节数据。

此伪指令的功能是把字节常数或字节串存放至内存连续的地址空间中。

ORG 8000HDATA1:DB 43H,09H,08HDATA2:DB 07H伪指令DB指定了43H,09H,08H 顺序存放在8000H开始的存储单元中,DATA2中的07H紧挨着DATA1的地址空间存放,即07H存放在8003H单元中。

注:DW(Define Word)指令定义与DB类似,区别在于DW定义一个字,DB定义一个字节。

4、END一般格式为:标号:END 地址或标号地址或标号可以忽略。

此伪指令用于指示汇编语言程序段结束。

因此一个源程序中仅有一个END,且一般放在程序最后。

汇编语言伪指令

汇编语言伪指令

汇编语言伪指令在汇编语言程序里,有一些特殊的助记符,这些助记符与指令系统的助记符不同,它们没有对应的机器码。

这些助记符在源程序中的作用是完成汇编程序的各种准备工作,包括定义变量、分配数据存储空间、控制汇编过程、定义程序入口等。

它们仅仅在汇编的过程中起作用,一旦汇编过程结束,它们的使命也就完成了。

这些助记符称为伪指令,它们所完成的操作称为伪操作。

不同汇编器的伪指令可能存在少量的区别,并非所有的伪指令在任何编译器上都能被识别。

一、符号定义伪指令符号定义(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用于定义一个结构化的内存表中的数据域,可以用“#”代替。

汇编语言伪指令

汇编语言伪指令

1.起始地址设定的指令:ORG
例如:ORG 1100H
STRAT MOV , #01H
2. 结束指令END (此后的指令就不起作用了)
3.定义字节伪指令:DB 将一组8位的二进制数存入ROM中
例如:
ORG 1000H
TAB: DB 10H,0E3H,34H,5BH
则,(1000H)=10H,(1001H)=E3H ….
4.定义字伪指令DW:将一组16进制的数存入ROM中(高位存到低地址低位存入高地址)?例如:
ORG 2000H
TAB : DW 100H,1AA1H
则(1000H)=01H (1001H)=00H (1002H)=1AH (1003H)=A1H {因为A1不是16进制的数所以不必在前面加上0}
5.定义预留空间伪指令DS(格式为:DS 预留的内存单元的大小)
例如:
ORG 1000H
ADDR : DS 08H
MOV A,#05H
第三条指令在1008H的地方执行
DB,DW,DS都是对程序存储器(ROM)起作用,不对数据存储
器(RAM)起作用
赋值伪指令EQU
例如:
ORG 1200H ABC EQU 30H MOV A, ABC
位地址定义伪指令BIT 例如:
IN1 BIT P1.0 IN2 BIT P2.0。

伪 指 令

伪 指 令

<>
2.标号定义伪指令
格式:标识符 LABEL 类型 功能:给其后的内存单元定义一个新的类型属性
说明:给该伪指令后面的一个变量或标号定义另外一种属性,但不 重新分配内存空间,便于以多种形式访问定义的变量或标号。
例如: WORD_ARY LABEL WORD
BYTE_ARY DB 100 DUP (0)
其汇编后的存储格式如图。
(4,5),6)
<>
1.3 段定义伪指令
8086/8088的存储器采用分段技术来组织,存储器的物理地址是 由段地址和偏移地址组合而成。因此,8086/8088的程序设计必须按 段来组织、使用存储器,每一个数据或代码都应存储于一个指定的段 当中,与段定义有关的伪指令是:SEGMENT┅ENDS,ASSUME和ORG
MY_DATA SEGMENT ;定义一个数据段,内部有三个变量
ORG 100H ;数据段的变量从100H开始定义
X DB 10 ;偏移地址为100H
Y DB 6 ;偏移地址为101H
Z DB ? ;偏移地址为102H
MY_DATA
ENDS
;段定义结束
MY_STACK
SEGMENT
;定义一个100字的堆栈
分别使用两个变量名,对一个存储空间,实现字节地址存取一个字节,
或字地址同时存取两个字节数据。
又比如:
FAR_LAB LABEL FAR ;定义下面程序为远调用,可被其它段调用。
NEAR_LAB:PUSH AX ;段内标号,只能被同一段内的程序调用。

;程序体
<>
1.2 变量定义伪指令
变量定义就是为数据分配一个确定的存储单元,同时,为了程序使用 该单元方便,给这个存储单元取了一个唯一的名字(变量名)。定义 的存储单元可以是字节、字、双字、三字、四字和十字节

汇编编程_伪指令

汇编编程_伪指令

10、 INCLUDE <file specification> a> 文件名必须有引号包围(?) b> 包含文件查找顺序:先找当前工作目录,后找GENPATH环境变量指定的位 置。 c> 例: INCLUDE “..\LIBRARY\macros.inc”
汇编管理指令-伪指令汇总
11、
LIST …… NOLIST a> 影响紧随其后的语句是否出现在list和 debug文件中; b> 最终是否有效,还依赖环境变量-L: Generate a listing file
MLIST [ON/OFF] 决定macro是否被展开出现在list和debug文件中
Directive
12、
13、
ORG <expression> 其中expression不能包含任何未定义、以后会定义以及外部references
汇编管理指令-伪指令汇总
14、 MEXIT XDEF entry storage: EQU $00FF save: MACRO LDX LDA STA LDA STA IFC ENDC LDA STA
Directive
;重新定义一个段 1 1 1 * ;offset是如何辅助访问struct的
DataSec: SECTION 000000 Struct: DS.B SIZE CodeSec: SECTION entry: 000003 CE xxxx LDX #Struct 000006 8600 LDA #0 000008 6A00 STA ID, X 00000A 6201 INC COUNT, X 00000C 42 INCA 00000D 6A03 STA VALUE, X

汇编语言中常用的伪指令档

汇编语言中常用的伪指令档

汇编语言中常用的伪指令分类:软件相关2013-01-23 20:13 515人阅读评论(0) 收藏举报areaequ伪指令常用汇编语言汇编语言中,指令语句在源程序汇编时会产生可供计算机执行的指令代码,即目标代码。

汇编程序除指令语句外,还需要提供一些指令,用于辅助源程序的汇编。

比如指定程序或数据存放的起始地址,为数据分配一段连续的内存单元等。

这些指令在汇编时并不生成目标代码,不影响程序执行,因此称之为伪指令。

本文简单总结了常用的伪指令,如下。

1、EQU(Equate)一般格式为:标号:EQU 操作数指令功能为将操作数赋予标号,两边的值完全相等。

使用EQU伪指令给一个标号赋值后,此标号在整个源文件中值固定。

AREA: EQU 1000H ;将标号AREA赋值为1000H2、ORG(Origin)一般格式为:ORG xxxxH(绝对地址或标号)XxxxH决定此语句后第一条指令(或数据)的地址。

该段源程序或数据被连续存放在此后的地址内,直到下一条ORG指令为止。

ORG 8000H ;此后目标代码存储在存储器中以0x8000h开始的地址空间中。

ADD R1,#1MOV R2, #23、DB(Define Byte)一般格式为:标号:DB 字节常数或字符或表达式标号字段可有可无,字节常数或字符是指一个字节数据。

此伪指令的功能是把字节常数或字节串存放至内存连续的地址空间中。

ORG 8000HDATA1:DB 43H,09H,08HDATA2:DB 07H伪指令DB指定了43H,09H,08H 顺序存放在8000H开始的存储单元中,DATA2中的07H紧挨着DATA1的地址空间存放,即07H存放在8003H单元中。

注:DW(Define Word)指令定义与DB类似,区别在于DW定义一个字,DB定义一个字节。

4、END一般格式为:标号:END 地址或标号地址或标号可以忽略。

此伪指令用于指示汇编语言程序段结束。

因此一个源程序中仅有一个END,且一般放在程序最后。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、基本段定义格式常用结构STACK SEGMENT PARA
'STACK;
DB 100 DUP('STACK')
STACK ENDS
DATA SEGMENT
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START:
MOV AX,data
MOV DS,AX
MOV ES,AX
MOV AL,4CH
INT 21H
CODE ENDS
END START
------------------------------------------------------------------------------------------------------------------------ 段名segment[定位][组合][段字][‘类别’] ...
段名ends (1)定位
段定位(align)属性——指定逻辑段在主存储器中的边界:
BYTE:段开始为下一个可用的字节地址(xxxx xxxxb),属性值为1
WORD:段开始为下一个可用的偶数地址(xxxx xxx0b),属性值为2
DWORD:段开始为下一个可用的4倍数地址(xxxx xx00b),属性值为4
PARA:段开始为下一个可用的节地址(xxxx 0000b),属性值为16
PAGE:段开始为下一个可用的页地址(0000 0000b),属性值为256
简化段定义伪指令的代码和数据段默认采用WORD定位,堆栈段默认采用PARA定位。

完整段定义伪指令的默认定位属性是PARA。

(2)组合
PUBLIC: 所有此类型的同名段组合成一个逻辑段,公用一个段地址,运行时装入同一个物理段中。

COMMON : 所有此类型的同名段具有相同的起始地址(覆盖),共享相同的存储区域。

AT <数值表达式> : 按绝对地址定位,段地址就是表达式的值。

STACK : 专用于说明堆栈段,组合方式同PUBLIC
NONE : 不组合
MEMORY :置于地址最高处,多个时取第一个,其余作为COMMON
PRIVATE:本段与其他段没有逻辑关系,不与其他段合并。

PUBLIC:连接程序把本段与所有同名同类型的其他段相邻地连接在一起,指定一个共同的段地址。

PRIVATE是完整段定义伪指令默认的段组合方式。

PUBLIC简化段定义伪指令默认的段组合。

3) 类别
用单引号’’括起来的字符串。

所有同类别的段被安排在连续的存储区域中。

二、段定义的简化
常用结构:
程序
.MODEL SMALL ;定义内存模式为小模式
.586 ;选择处理器
.STACK 512 ;定义堆栈段及其尺寸为512字节
.DATA ;数据段开始
;数据在此处定义
.CODE ;代码段开始
.STARTUP ;加载后程序入口点
;代码在此处定义
.EXIT ;返回DOS或父程序
END ;整个程序结束
在MASM5.0以上的版本中,提供了简化的段定义伪指令:
MODLE模式:
TINY 程序和数据在64K字节段内
SMALL 独立的代码段和独立的数据段
MEDIUM 单个数据段,多个代码段
COMPACT 单个代码段,多个数据段
LARGE 多个代码段,多个数据段
三、子程序
常用格式:
子程序名PROC 类型
指令序列
子程序名ENDP
类型:影响汇编程序对子程序调用指令CALL和返回指令RET的翻译方式
NEAR
如果被调用的子程序是NEAR类型,则IP的值入栈,这会使SP减2,然后把IP改成子程序的第一条指令的便宜地址FAR
如果被调用的子程序是FAR类型,把CS寄存器的值入栈,在把IP 入栈,这会使SP-4,然后把CS:IP改为子程序的第一条指令的逻辑地址
CALL
跳转指令。

与无条件跳转指令相同的是,CALL在跳转之前保留了CS:IP或者IP的值存入栈中保存。

RET
通常写在子程序的最后一条指令。

用于返回原程序处继续执行。

相关文档
最新文档