第三章第10节汇编程序常用伪指令简介
- 格式:ppt
- 大小:624.50 KB
- 文档页数:22
ARM汇编伪指令详解(转载)2007-09-13 00:40ARM汇编程序分析过程中,比较难理解的是他的伪操作、宏指令和伪指令。
在读vivi时遇到很多不懂的,所以在此对引导程序中出现伪操作、宏指令和伪指令进行总结,*****************************************************一、GET option.s// GET和INCLUDE功能相同功能:引进一个被编译过的文件。
格式:GET filename其中:fiename 汇编时引入的文件名,可以有路径名。
GET符号在汇编时对宏定义,EQU符号以及存储映射时是很有用的,在引入文件汇编完以后,汇编将从GET符号后开始。
在被引入的文件中可能有GET符号再引入其他的文件。
GET符号不能用来引入目标文件。
*****************************************************二、INTPND EQU 0x01e00004//EQU可以用“*”代替,在阅读源程序时注意。
功能:对一个数字常量赋予一个符号名。
格式:name EQU expression其中:name 符号名。
Expression 寄存器相关或者程序相关的固定值。
使用EQU定义常量,与C语言中用#define定义一个常量相同。
例:num EQU 2 ;数字2赋予符号num*****************************************************三、GBLL THUMBCODE[ {CONFIG} = 16THUMBCODE SETL {TRUE}CODE32|THUMBCODE SETL {FALSE}][ THUMBCODECODE32 ;for start-up code for Thumb mode]//其中[=IF ,|=ELSE ,]= ENDIF, CODE32 表明一下操作都在ARM状态。
51单片机汇编指令及伪指令小结51单片机汇编指令及伪指令小结51单片机是一种广泛应用的基于汇编语言的微控制器。
它的汇编指令集非常丰富,包括了基本的数据处理、逻辑运算、分支跳转、数据存储和输入输出等指令。
汇编指令的灵活运用可以实现各种复杂的功能,因此掌握51单片机的汇编指令是开发嵌入式系统的重要基础。
1. 基本数据处理指令51单片机汇编指令集包括了一系列基本的数据处理指令,如加法(add)、减法(sub)、乘法(mul)、除法(div)等。
这些指令用于实现对数据的基本运算操作。
2. 逻辑运算指令逻辑运算指令用于实现各种逻辑运算,如与(and)、或(or)、非(not)、异或(xor)等。
这些指令通常用于处理数据的开关控制、状态判断等功能。
3. 分支跳转指令分支跳转指令用于实现程序的流程控制。
常用的分支跳转指令包括无条件跳转(jmp)、条件跳转(jz、jnz、jc、jnc等)、循环跳转(loop)等。
这些指令可以根据条件和需求设置程序的执行流程,实现各种循环、分支等功能。
4. 数据存储指令数据存储指令用于实现数据的存储和加载操作。
常用的存储指令包括将数据存储到寄存器或内存中(mov)、将数据从寄存器或内存中加载(ld)等。
这些指令通过对数据的存储和加载,实现对数据的读写操作。
5. 输入输出指令输入输出指令用于实现与外设的数据通信。
常用的输入输出指令包括从端口输入(instr)、输出到端口(outstr)等。
这些指令通过与外部设备的数据交互,实现嵌入式系统与外设的连接。
除了以上的基本指令外,51单片机还提供了一些伪指令,用于程序的组织和调试。
这些伪指令包括宏指令、条件编译指令、调试指令等。
1. 宏指令宏指令是一种通过宏展开的方式来扩展汇编代码的指令。
它通过提前定义一些宏,并在代码中使用这些宏来生成更复杂的汇编代码。
宏指令的好处是可以简化代码的书写,使得程序的逻辑更清晰。
2. 条件编译指令条件编译指令用于根据编译时的条件来选择性地编译代码。
《汇编语⾔》学习笔记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指令进⾏初始化。
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寄存器。
常用Arm汇编伪指令
在Arm汇编语言程序中,有一些特殊指令用于对汇编过程进行控制,这些指令不是可执行指令也没有对应的机器码,只用于汇编过程中为汇编程序提供汇编信息,这些指令称为伪指令,它们所完成的操作称为伪操作。
常用的伪指令有以下几种:符号定义伪指令、数据定义伪指令、汇编控制伪指令、信息报告伪指令以及杂项伪指令。
下面列出了上述几种常用的Arm汇编伪指令。
1. 符号定义伪指令
符号定义伪指令用于定义汇编程序中的变量、对变量赋值以及定义寄存器别名等操作。
表2.1 符号定义伪指令
2. 数据定义伪指令
数据定义伪指令一般用于为特定的数据分配存储单元,并可对分配的存储单元进行初始化。
表2.2 数据定义伪指令
3. 汇编控制伪指令
汇编控制伪指令用于控制汇编程序的执行流程。
表2.3 汇编控制伪指令
4. 信息报告伪指令
报告伪指令用于汇编报告指示。
表2.4 信息报告伪指令
5. 杂项伪指令
杂项伪指令是未包含在表2.1至2.4中且在汇编程序设计中常用的伪指令。
表2_5 杂项伪指令。
汇编器伪指令本章讲解汇编器的伪指令。
说明如何定义符号和怎样控制代码和数据在程序存储器中的位置。
简介Ax51汇编器有一些伪指令,可以让我们定义符号值,预留和初始化内存,以及控制代码的位置。
不要把伪指令与指令相混淆。
伪指令不产生可执行的代码,除DB,DW和DD之外,它们对代码存储器的内容没有直接的影响。
这些伪指令改变汇编器的状态,定义用户符号,以及添加信息到目标文件。
下表是对汇编器伪指令的一个汇总。
关于每条伪指令的详细信息,请点击相应链接查看。
伪指令 格 式 说 明BIT符号 BIT 位地址 在位数据空间定义一个位地址。
BSEG BSEG [AT 绝对地址] 在位地址空间定义一个绝对地址段。
CODE符号 CODE 代码地址 为代码空间内的一个指定地址分配一个符号名。
CSEG CSEG [AT 绝对地址] 在代码地址空间定义一个绝对地址段。
DATA符号 DATA 数据地址 给一个指定的片内数据地址分配一个符号名。
DB [标号:] DB 表达式[, 表达式...]定义一列字节型数值。
DBIT[标号:] DBIT 表达式 在位单元中预留一个空间。
DD [标号:] DD 表达式[, 表达式...]定义一列双字型数值。
DS[标号:] DS 表达式 在字节空间预留空间。
DSB[标号:] DSB 表达式 在字节空间预留空间。
DSD[标号:] DSD 表达式 在双字空间预留空间。
DSEG DSEG [AT 绝对地址] 在间接寻址内部数据空间定义一个绝对段。
DSW[标号:] DSW 表达式 在字空间预留空间;增加当前段的位置计数器。
DW [标号:] DW 表达式[, 表达式...]定义一列字数值。
END END 指示程序的结束。
EQU EQU 表达式 永久设置符号值。
__ERROR____ERROR__ 文本 产生一条标准的出错信息。
罗亩按:前后均是两条下划线(_)。
EVEN EVEN 确保变量的字对齐。
EXTRN EXTRN 存储空间类型 [:数据类型] (符号 [, ...])定义在当前模块中引用的在其它模块中定义的符号。
伪指令用来对汇编程序进行控制,对程序中的数据实现条件转移、列表、存储空间分配等处理,其格式和汇编指令一样,但一般不产生目的代码,即不直接命令CPU 去执行什么操作。
伪指令是汇编语言的特色之一,具有两个基本特征:1、伪指令是一条指令。
它在程序中不是可有可无的,使用时受到严格的规范,与标准指令一样,在程序中占有固定的位置,有固定的书写格式。
每条伪指令都与标准指令一样可实现特定的功能,伪指令是不能用标准指令替代的。
2、伪指令不是一条真正的指令,没有指令代码。
在程序编译过程中,伪指令的功能会被实现,但伪指令会被删除,在编译后的目标文件中(目标文件一般是代码文件),不会有伪指令的编码。
也可以这样理解:指令是对计算机发出的命令,而伪指令则是对编译器发出的命令。
在编译程序结束时,伪指令的使命就完成了。
伪指令是相对标准指令而言的,高级语言不存在伪指令,因为高级语言不存在指令,很难说明高级语言中哪一条语句是什么指令。
伪指令是为程序开发工程师提供辅助的程序表达,让编译器实现一些标准指令所不能表达的内容。
伪指令的作用:1、程序定位的作用。
把各程序段之间的相互关系和在存储器的位置告诉编译器。
2、为非指令代码进行定义。
包括逻辑变量、字符和存储区等。
3、为程序完整性做标注。
程序段的开始和结束。
4、有条件地引用程序段。
比如条件循环、条件选择以及宏等。
在ARM处理器中,伪指令的应用和51系列的单片机很相似,它们除了把正常的程序用指令表达给计算机以外,还需要把程序设计者的意图表达给编译器。
无论是51系列单片机还是ARM处理器,都需要定义数据以便编译器能够正确识别代码和数据,都可以引用宏,都可以为符号或变量赋值等。
一、定义数据伪指令该类伪指令用来定义存储空间及其所存数据的长度。
· DB :定义字节,即每个数据是 1 个字节。
· DW :定义字,即每个数据占 1 个字 (2 个字节 ) 。
· DD :定义双字,即每个数据占 2 个字。
[汇编]伪指令(一)段定义伪指令段定义伪指令是表示一个段开始和结束的命令,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用于定义一个结构化的内存表中的数据域,可以用“#”代替。
ARM汇编伪指令在ARM汇编语言源程序中有些特殊助记符,它们没有相对应的操作码或者机器码,通常称为伪指令,它们所完成的操作称为伪操作。
伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,由汇编程序在源程序的汇编期间进行处理,仅在汇编过程中起作用。
在ARM的汇编程序中,有以下几种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令以及其他伪指令。
一、符号定义伪指令作用:用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等。
符号定义有如下几种伪指令:用于定义局部变量的LCLA、LCLL和LCLS。
用于定义全局变量的GBLA、GBLL和GBLS。
用于对变量赋值的SETA、SETL和SETS。
为通用寄存器列表定义名称的RLIST。
(1)LCLA、LCLL和LCLS格式:LCLA/LCLL/LCLS 局部变量名说明:LCLA、LCLL和LCLS伪指令用于定义一个汇编程序中的局部变量并初始化。
其中:LCLA定义一个局部的数字变量,初始化为0。
LCLL定义一个局部的逻辑变量,初始化为F。
LCLS定义一个局部的字符串变量,初始化为空串。
这3条伪指令用于声明局部变量,在其局部作用范围内变量名必须惟一,例如在宏内。
例:LCLA num1 ;定义一个局部数字变量,变量名为num1 LCLL I2 ;定义一个逻辑变量,变量名为I2LCLS str3 ;定义一个字符串变量,变量名为str3num1 SETA 0xabcd ;将该变量赋值为0xabcdI2 SETL {FALSE} ;将该变量赋值为真str3 SETS “HELLO”;将该变量赋值为“HELLO”(2)GBLA、GBLL和GBLS格式:GBLA/GBLL/GBLS 变量名说明:GBLA、GBLL和GBLS伪操作定义一个汇编程序中的全局变量并初始化。
其中:GBLA定义一个全局数字变量,并初始化为0。
GBLL定义一个全局逻辑变量,并初始化为F。