伪指令

合集下载

伪指令

伪指令

南京航空航天大学信息科学与技术学院 石燕
DCW ( DCWU )
语法格式: 语法格式: 标号 DCW (或 DCWU ) 表达式 DCW (或 DCWU)伪指令用于分配一片连续的 ) 半字存储单元并用伪指令中指定的表达式初始化。 半字存储单元并用伪指令中指定的表达式初始化。 其中,表达式可以为程序标号或数字表达式。 其中,表达式可以为程序标号或数字表达式。 分配的字存储单元是半字对齐的, 用 DCW 分配的字存储单元是半字对齐的,而用 DCWU分配的字存储单元并不严格半字对齐。 分配的字存储单元并不严格半字对齐。 分配的字存储单元并不严格半字对齐 使用示例: 使用示例: DataTest DCW 1 , 2 , 3 分配一片连续的半字存储单元并初始化。 分配一片连续的半字存储单元并初始化。
南京航空航天大学信息科学与技术学院 石燕
SPACE
语法格式: 语法格式: 标号 SPACE 表达式 SPACE 伪指令用于分配一片连续的存储区域 并初始化为 0。其中,表达式为要分配的字节 。其中, 数。 代替。 也可用 “ % ” 代替。 使用示例: 使用示例: DataSpace SPACE 100 分配连续 100 字节的存储单元并初始化为 0
南京航空航天大学信息科学与技术学院 石燕
SETA 、 SETL 、 SETS
语法格式: 语法格式: 变量名 SETA ( SETL 或 SETS ) 表达式 伪指令 SETA 、 SETL 、 SETS用于给一 用于给一 个已经定义的全局变量或局部变量赋值。 个已经定义的全局变量或局部变量赋值。 SETA 伪指令用于给一个数学变量赋值 SETL 伪指令用于给一个逻辑变量赋值 SETS 伪指令用于给一个字符串变量赋值
南京航空航天大学信息科学与技术学院 石燕

伪指令

伪指令

第四章伪指令及汇编语言程序格式4.1 4.1 汇编语言语句格式汇编语言语句格式4.2 4.2 伪指令伪指令伪指令((伪操作伪操作))4.3 4.3 汇编语言源程序结构汇编语言源程序结构4.4 4.4 汇编语言上机过程汇编语言上机过程CUSIIC第四章伪指令及汇编语言程序格式本章本章重点重点重点::1、常用伪指令2、汇编语言源程序结构3、汇编语言程序的上机过程4.1 汇编语言语句格式4.1.1 语句种类,和两个字节单元中的数据相加,例:编程实现BUF1和BUF2两个字节单元中的数据相加。

所指向的字节单元。

放到SUM所指向的字节单元MOV AL, BUF1 ;取第一个加数ADD AL, BUF2 ;两数加MOV SUM, AL ;和放入SUM单元一、语句格式[变量] 操作码操作数[;注释]2、伪指令语句格式伪指令语句格式::[标号标号::] 操作码操作数[;注释]1、指令语句格式指令语句格式::二、标号表示一条指令所在的单元的地址表示一条指令所在的单元的地址,,在CS 段用段用。

标号属性段属性属性::标号所代表的指令单元的段地址标号所代表的指令单元的段地址。

偏移属性偏移属性::标号所代表的指令单元的段内偏移地址标号所代表的指令单元的段内偏移地址。

类型属性NEAR :段内引用FAR :段间引用4.1.2 语句格式表示数据所在的单元的地址表示数据所在的单元的地址,,在DS 、SS 、ES 段用段用。

变量属性段属性属性::变量所代表的数据单元的段地址变量所代表的数据单元的段地址。

偏移属性偏移属性::变量所代表的数据单元的偏移地址变量所代表的数据单元的偏移地址。

类型属性类型属性::指明变量所代表的数据单元的字节数指明变量所代表的数据单元的字节数。

4DD 2DW1DB类型值类型例:BUF DB 12H 注:同一程序中同一程序中,,同一标号和变量不能重复定义量不能重复定义。

三、变量四、标号和变量定义规则1、可以是A~Z,a~z,数字(?、@、—)。

伪指令

伪指令

第6章 6.1.5 伪指令
SEG和OFFSET
SEG返回存储器地址操作数的段地址 OFFSET 返回存储器地址操作数的段内偏移地 址部分
: NUMBER-1 DD ? CCAA EQU SEG NUMBER-1 : MOV AX,SEG NUMBER-1 MOV DS,AX MOV SI,OFFSET NUMBER-1
第6章 6.1.5 伪指令
结构的存储分配和预置
格式:变量 结构名称<赋值说明> LiPing STUDENT_RECORD <,,,’891011’>
LuiYi STUDENT_RECORD <‘LuiYi’,1,,’891011’,80H>
对结构的访问
格式:变量名.字段名 例如:MOV AL,LiPing.AGE 等价于: MOV AL,[BX].AGE
CODE_SEG
第6章:逻辑段的简化定义
.STACK [大小]
;堆栈段定义伪指令 .STACK 创建一个堆栈段,段名是: STACK 。可选的“大小”参数指定堆栈段所占存储区的 字节数,默认是1KB(=1024=400H字节)
.DATA
;数据段定义伪指令 .DATA 创建一个数据段,段名是: _DATA。数据段名可用@DATA预定义标识符表示
第6章 6.1.5 伪指令
TYPE、SIZE、LENGTH
见表6.3
段定义伪指令
SEGMENT/ENDS伪指令 成对使用,说明段的名称和范围,还可指明段 的定位类型、组合类型、分类名
段名
段名
SEGMENT [定位类型][组合类型][分类名] : 本段程序内容(指令或伪指令语句) ENDS
第6章 6.1.5 伪指令

伪指令和汇编语言

伪指令和汇编语言

从指定单元开始,定义若干个字(双字节数)。
例如:
ORG 8000H
HETAB:
DW 7234H,8AH,10
汇编后则:
(8000H)=72H (8001H)=34H (8002H)=00H (8003H)=8AH (8004H)=00H (8005H)=0AH
03 常用旳伪指令
DS:定义空间命令
“DS <体现式>定义空间命令 格式: 标号: DS 数据或字符体现式 从指定单元开始,由数据或体现式 拟定保存若干个字节内存空间备用。 例如: ORG 8000H DS 08H DB 30H,8AH 即8000H~8007H单元保存备用 (8008H)=30H (8009H)=8AH
DATA和EQU旳区别在于DATA定义旳字符名称
作为标号登记在符号表中,故可先使用后定义;
而用EQU定义旳字符名称必须先定义后使用,其
原因是EQU不定义在符号表中。
03 常用旳伪指令
BIT:位地址符号命令

BIT<体现式>位地址符号命令
格式:
字符名称:
BIT 位地址
该命令把地址赋予标号段要求旳字符名称。
地址,位地址或立即数。
例如:
ORG 8000H
AA: EQU R6
;AA与R6等值
MOV A,AA
;A(R6)

03 常用旳伪指令
DATA:数据地址赋值命令
“ DATA<体现式>数据地址赋值命令 格式:
字符名称:
DATA 数据或体现式
此命令把数据地址或代码地址赋予标号段要求旳字符名称。
例如:INDEXJ DATA 8389H
定义了INDEXJ这个字符名称旳地址为8389H,主要用于

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

汇编常见伪指令

汇编常见伪指令

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

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来对应它的⼆次引⽤。

伪指令——精选推荐

伪指令——精选推荐

伪指令常⽤伪指令SPMC65 汇编伪指令与汇编指令不同,它不会被 CPU 执⾏,⽽是在汇编器对程序进⾏汇编期间实现对汇编器的控制。

使⽤伪指令可以完成分配存储区、定义宏、指导汇编器汇编指定的代码等功能,从⽽增加程序的可读性和可维护性。

SPMC65 伪指令的语法格式及分类SPMC65 伪指令可以出现在程序⽂件的任意位置,为了与汇编指令区分,建议伪指令的前⾯加上⼀个句点“ . ”,例如“ .CODE ”。

SPMC65 伪指令不必区分字母的⼤⼩写,也就是说,在 SPMC65 程序中,“ .code ”、“ .CODE ”、“ .cODe ”是等价的,建议伪指令全部⼤写。

但是利⽤伪指令定义的标号(包括段名、宏名、变量名、结构名等)则要区分其字母的⼤⼩写,例如标号“Temp ”与标号“ temp ”代表两个不同的标号。

为便于对 SPMC65 伪指令的语法进⾏描述,我们采⽤了下列符号约定:lable ——标号count ——数量value ——常量数值args ——参数[ ] ——可缺省项⽬。

如果出现[[… …]] 的形式,则表⽰可缺省项的内容本⾝就带有⽅括号。

SPMC65 伪指令依照其⽤途可分为五类:存储类、定义类、条件类、汇编链接类以及调试类。

详见表 2.86 。

表中⽤斜线“ /”隔开的伪指令是同义伪指令,它们虽然名字不同,但实现的功能是相同的。

例如“ ORG/ORGIN ”表⽰ ORG 与 ORGIN 两条伪指令可以相互替换。

表 2 . 86 伪指令分类列表下⾯将分类介绍⽐较常⽤的伪指令。

存储类伪指令1. DB[ 功能 ] 以字节型数据的形式来存储常量(定位在 ROM 区,参见 .CODE 伪指令)[ 同义伪指令 ] DEFB 、 BYTE 、 STRING [ 格式 ][label:] .DB [[count]] [value] [,[count]] [value][,…][ 说明 ] 本伪指令把⼀系列 8 位常量值存⼊连续的数据单元中。

汇编言语——常用伪指令

汇编言语——常用伪指令

(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

第四章 伪指令

第四章  伪指令

数据定义伪指令的格式为: [变量名] DB(DW、DD、DQ、DT) 表达式1,表达式2,… 表达式1,表达式2……是给变量或指定的存储单元赋予初值,它们有以下几种形式: (a)数值表达式 数据定义伪指令可以为一个或连续的存储单元设置数值初值。 (b)字符串表达式 对于DB伪指令,字符串的长度允许超过2个字符,但不能超过255个字符,字符 串必须用单引号括起来,它可为字符串中的每个字符分配1字节单元,字符串 从左至右以字符的ASCII码形式按地址递增的顺序依次存放。 (c)?表达式 不带引号的?,用于为变量预留内存单元,暂时不存入数据,即表示所定义的 变量无确定的初值。 例如:A DW ?,?为变量A预留2个字单元。 (d)地址表达式 操作数为地址表达式时,只适用于DW和DD这两种数据定义伪指令。如果地址表 达式为一变量(标号)名,用DW伪指令则是取它的偏移地址来初始化变量;用 DD伪指令则是取它的段首地址和偏移地址来初始化变量。 (e)带DUP的表达式 格式为:n DUP (表达式),其中n为重复因子,只能取正整数,它表示定义了 n个相同的数据存储单元。
在8086汇编语言中,运算符分为:算术运算符、逻辑运算符、关系运算
符、数值返回运算符、属性运算符和字节分离运算符。
(一)、表达式
(1)数值表达式 数值表达式是由常量与算术运算符、逻辑运算符或关系运算符构成的有意 义的式子。数值表达式在汇编期间进行运算,运算结果为一数值常量,它 只有大小而没有属性。
数据定义伪指令的格式为: [变量名] DB(DW、DD、DQ、DT)
Байду номын сангаас
表达式1,表达式2,„
其中:变量名是可选项,它仅代表所定义数据存储区第一个单元的地址; DB、DW、DD、DQ和DT是伪指令符,具体一条数据定义伪指令取5种之一。 DB定义的是字节类型的变量,每个表达式被分配1个字节单元。 DW定义的是字类型的变量,每一个表达式被分配1个字单元(2个字节)。 DD定义的是双字类型的变量,每一个表达式被分配2个字单元(4个字节)。 DQ定义的是四字类型的变量,每一个表达式被分配4个字单元(8个字节)。 DT定义的是十字节类型的变量,每一个表达式被分配10个字节单元。

汇编-伪指令

汇编-伪指令

[汇编]伪指令(一)段定义伪指令段定义伪指令是表示一个段开始和结束的命令,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寄存器了。

2.4伪指令

2.4伪指令
.RAM .VAR s1,s2,s3

EQU:为标号赋值。
◦ 格式:label: . EQU value ◦ 所赋之值可以为在此标号之前定义过的某一符号常量或一 表达式。符号不能超前引用。 ◦ 举例:
label: .EQU 10

VDEF:为标号赋值,可以在程序的任何部位为标 号重复赋值。
◦ 格式:int0: .VDEF 0x5F

主要用来对段、程序数据等进行定义。 1、 PUBLIC, EXTERNAL, DEFINE, VAR, EQU, VDEF
PUBLIC:声明将在其他文件中被引用的全局标号。 格式:.PUBLIC label[ ,label] [ ,…] 当要声明多个全局标号时,要用逗号将每一标号分开。 在外部文件中用伪指令EXTERNAL所声明的标号必须是用 PUBLIC伪指令已经声明过的。 ◦ 举例: .PUBLIC sym1,sym2 //声明多个全局标号用逗号隔开, 空格被忽略 ◦ ◦ ◦ ◦

DW:以16位整型数据形式来存储常量或变量。 格式:[label:] .DW [value][,value][,…] 说明:
◦ 本伪指令是把一系列的16位整型常量或变量存入连续的整 型数据单元中。 ◦ 用逗号隔开多个数值。 ◦ 常量中含有ASCII字符串,必须用单引号将其括起来。 ◦ 若DW后未输入任何数值,自动会存入一个整型零常量。



过程调用 在程序中调用一个过程时,程序控制就从调用程序 中转移到被调用的过程,且从过程的起始位置开始 执行该过程的指令,直到执行到RETF指令时,程序 控制返回调用过程时原程序的断点位置继续执行下 面的指令。 过程调用格式:
◦ CALL 过程名

举例:

伪指令

伪指令

方括号中为可选项,规定了逻辑段的一些其他特性
例:
DATA1 A DATA1 DATA2 DATA2 DATA3 C DATA3
DB
DB
DB
SEGMENT 1,2,3 ENDS SEGMENT 200 DUP(0) ENDS SEGMENT ?,?,? ENDS
STACK
CODE
SEGMENT
ASSUME DS:DATA1,ES:DATA3 CS:CODE,SS:DATA2 START: MOV AX,DATA1 MOV DS,AX MOV AX,DATA3 MOV ES,AX ┆ Q1: MOV AL,A Q2: MOV C,AL
A C8H
STR1 ‘H’
SUM
- -
‘I’
20H ‘O’ ‘K’ ‘!’
TABLE
3 3 3 7 3
0DH
0AH
‘$’ DATA1 0 0 0 0
3
3 7
……
为 0, 1,
10, 14
2. 段定义伪指令
因8086/8088 CPU的存储器是分段的,这就需要有段 定义语句。 与段有关的伪指令主要有: SEGMENT、ENDS、ASSUME 段定义伪指令的格式如下: 段名 SEGMENT [定位类型] [组合类型] [’类别’] ┇ 段名 ENDS
在前缀开始处安排了一条 INT 20H, 在过程结束时通过RET返回DOS。
AX,DATA DS,AX ;DATA → DS ES,AX ;DATA → ES ┇ ;具体程序 RET ;返回指令 MAIN ENDP ;过程结束 CODE ENDS ;代码段结束 END START ;源程序结束
MOV MOV MOV
字节变量的应用 X

MCS-51单片机汇编语言的伪指令-文档资料

MCS-51单片机汇编语言的伪指令-文档资料
若(40H)≥(50H),则P1.0管脚连接的LED1发光; 若(40H)<(50H),则P1.1管脚连接的LED2发光。
Copyright 2006
题意分析:
本例是典型的分支程序,根据两个无符号数的 比较结果(判断条件),分别点亮相应的发光二极 管。
6.定义空间伪指令DS
4.定义字节数据伪指令DB
格式:[标号:] DS 表达式
格式:[标号:] DB 字节数据表
功能:从指定的地址开始,保留
功能:字节数据表可以是多个字节数 多少个存储单元作为备用的空间。
据、字符串或表达式,它表示将字节数据表中的 数据从左到右依次存放在指定地址单元。
如: ORG 1000H
Copyright 2006
JC L1 CLR P1.0
SJMP FIN L1:CLR P1.1 FIN:SJMP $
END
;CY=1,转移到 L1 ;CY=0,(40H)≥(50H),点亮 P1.0 连 接的LED1 ;直接跳转到结束等待
;(40H)<(50H),点亮P1.1接的LED2
7. 数据地址赋值伪指令XDATA
格式:符号名 XDATA 表达式
功能:将表达式的值或某个特定 汇编符号定义为一个指定的符号名,可以 先使用后定义,并且用于双字节数据定义。
例如:
DELAY XDATA 0356H
LCALL DELAY ;执行指令后,程 序转到0356H单元执行
Copyright 2006
BUF: DS 50 ;
例如:ORG 1000H
TAB: DB 22H ;22H存放在1032H单元。
TAB: DB 2BH, 0A0H, ‘A’, 2*4 ;
表示从1000H单元开始的地方存放数 据2BH,0A0H,41H(字母A的ASCII码), 08H

伪 指 令

伪 指 令

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

汇编语言伪指令

汇编语言伪指令

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

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

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

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

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

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

指令和伪指令

指令和伪指令

指令和伪指令①指令和伪指令。

答:汇编指令与机器指令原则上一一对应,在汇编过程中,汇编指令会被替换为机器指令,最终生成可执行的目标代码;指令的功能是由特定CPU的指令译码器确定的,因此,指令是一个硬件相关的概念;汇编过程仅将汇编指令替换为机器指令,而机器指令的执行是在可执行程序执行阶段完成的。

汇编语言伪指令在汇编过程中并不产生机器指令,它们的功能在于指示汇编程序按照指定的方式对汇编语言源程序做出解释,伪指令的功能是由汇编程序解释的,与硬件结构无关;伪指令的执行是在汇编过程中完成的,在程序执行阶段则不存在伪指令的概念。

1.逻辑地址:在CPU内部的存储单元地址表示形式,分为段基值和偏移量两个组成部分,它们都是16位的,在指令或源程序中只能使用逻辑地址来表达存储单元。

2.物理地址:CPU访问存储单元时向地址总线传送的地址表示形式,是20位的地址,由逻辑地址中段基值乘以16再加上偏移量得到,逻辑地址到物理地址的转换由CPU在执行访问存储单元的指令时自动完成。

3.标志寄存器:在CPU中由状态标志位与控制标志位组成的寄存器称为标志寄存器,其中状态标志位用于标识运算指令执行后运算结果的特征,控制标志位用于控制CPU的工作模式或改变CPU对某些事件的响应方式。

4.存储器寻址方式:即获得存储单元地址的方式,在8086/8088CPU中包括直接寻址、寄存器间接寻址、基址寻址、变址寻址、基址变址寻址这五种寻址方式。

5.立即数:以数值形式直接给出的操作数称为立即数,立即数不能作为目的操作数。

6.位移量:直接以数字形式出现的偏移量的分量之一。

7.伪指令:用于指示编译(汇编)程序如何进行编译的指令。

8.位操作指令:9.能精准到位对其进行读写的计算机指令,包括逻辑运算和移位及循环移位指令。

10.中断过程:中断请求、中断响应、中断处理、中断返回11..BCD码:一种十进制编码形式,(1分)限制4个连续二进制位的数值变化范围为0到9,用以表示一个十进制数位,(1分)是实现十进制算术运算调整的必要基础。

伪指令

伪指令
BUF2 DB 1000;操作数项超过了字节数的取值范围
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个字符作为模块名.
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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局部变量声明伪指令,用于宏定义的体中。

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

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

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

伪指令格式:LCLA variableLCLL variableLCLS variable其中:variable 定义的局部变量名。

在其作用范围内必须惟一。

局部变量的作用范围为包含该局部变量只能在宏中进行声明及使用。

伪指令应用举例如下:MACRO ;声明一个宏SENDDAT $dat ;宏的原型LCLA bitno ;声明一个局部算术变量…bitno SETA 8 ;设置变量值为8…MENDSETA、SETL、SETS变量赋值伪指令。

用于对已定义的全局变量,局部变量赋值。

SETA 伪指令用于给一个全局/局部的算术变量赋值。

SETL 伪指令用于给一个全局/局部的逻辑变量赋值。

SETS 伪指令用于给一个全局/局部的字符串变量赋值。

伪指令格式:variable_a SETA expr_avariable_l SETL expr_lvariable_s SETS expr_s其中:variable_a 算术变量。

用GBLA、LCLA 伪指令定义的变量。

expr_a 赋值的常数。

variable_l 逻辑变量。

用GBLL、LCLL 伪指令定义的变量。

expr_l 逻辑值,即{TRUE}或{FALSE}。

variable_s 字符串变量。

用GBLS、LCLS 伪指令定义的变量。

expr_s 赋值的字符串。

伪指令应用举例如下:GBLS ErrStr…ErrStr S ETS “No,semaphone”…RLISTRLIST 为一个通用寄存器列表定义名称。

伪指令格式如下:name RLIST {reglist}其中:name 要定义的寄存器列表的名称。

reglist 通用寄存器列表。

伪指令应用举例如下:LoReg RLIST {R0-R7} ;定义寄存器列表LoReg…STMFD SP!,LoReg ;保存寄存器列表LoReg…CNCN 为一个协处理器的寄存器定义名称。

伪指令格式:name CN expr其中:name 要定义的协处理器的寄存器名称。

expr 协处理器的寄存器编号,数值范围为0~15。

伪指令应用举例如下:MemSet CN l ;将协处理的寄存器l 名称定义为MemSetCPCP 为一个协处理器定义的名称。

伪指令格式:name CP expr其中:name 要定义的协处理器名称。

expr 协处理器的编号,数值范围为0~15。

伪指令应用举例如下:DivRun CN 5 ;将协处理器5 名称定义为DivRunDN、SNDN 和SN 为VFP 的寄存器的名称定义的伪指令。

DN 为一个双精度原VFP 寄存器定义名称。

SN 为一个单精度的VFP 寄存器定义名称。

伪指令格式:name DN exprname SN expr其中:name 要定义的VFP 寄存器名称。

expr 双精度的VFP 寄存器编号为0~15,单精度的VFP 寄存器编号为0~31。

伪指令应用举例如下:cdn DN 1 ;将VFP 双精度寄存器1 名称定义为cdnrex SN 3 ;将VFP 单精度寄存器3 名称定义为rexFNFN 为一个FPA 浮点寄存器定义名称伪指令格式:name FN expr其中:name 要定义的浮点寄存器名称。

expr 浮点寄存器的编号,值为0~7。

伪指令应用举例如下:ibq FN l ;将浮点寄存器l 名称定义为ibq2 数据定义伪指令数据定义伪指令用于数据表定义,文字池定义,数据空间分配等。

该类伪指令如下:声明一个文字池:LTORG。

定义一个结构化的内存表的首地址:MAP。

定义结构化内存表中的一个数据域:FIELD。

分配一块内存空间,并用0 初始化:SPACE。

分配一段字节的内存单元,并用指定的数据初始化:DCB。

分配一段字的内存单元,并用指令的数据初始化:DCD 和DCDU。

分配一段字的内存单元,将每个单元的内容初始化为该单元相对于静态基址寄存器的偏移量:DCDO。

分配一段双字的内存单元,并用双精度的浮点数据初始化:DCFD 和DCFDU。

分配一段字的内存单元,并用单精度的浮点数据初始化:DCFS 和DCFSU。

分配一段字的内存单元,并用单精度的浮点数据初始化,指定内存单元存放的是代码,而不是数据:DCI。

分配一段双字的内存单元,并用64 位整数数据初始化:DCQ 和DCQU。

分配一段半字的内存单元,并用指定的数据初始化:DCW 和DCWU。

LTORGLTORG 用于声明一个文字池,在使用LDR 伪指令时,要在适当的地址加入LTORG 声明文字池,这样就会把要加载的数据保存在文字池内,再用ARM 的加载指令读出数据。

(若没有使用LTORG 声明文字池,则汇编器会在程序末尾自动声明。

)伪指令格式:LTORG伪指令应用举例如下:…LDR R0,=0x12345678ADD R1,R1,R0MOV PC,LRLTORG ;声明文字池,此地址存储0x12345678… ;其它代码LTORG 伪指令常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器就不会错误地将文字池中的数据当作指令来执行。

MAPMAP 用于定义一个结构化的内存表的首地址。

此时,内存表的位置计数器{VAR}设置为该地址值{VAR}为汇编器的内置变量。

^与MAP 同义。

伪指令格式:MAP expr,{base_register}其中:expr 数字表达式或程序中的标号。

当指令中没有base_register 时,expr 即为结构化内存表的首地址。

base_register 一个寄存器。

当指令中包含这一项时,结构化内存表的首地址为expr 与base_register 寄存器值的和。

伪指令应用举例如下:MAP 0x00,R9 ;定义内存表的首地址为R9Timer FIELD 4 ;定义数据域Timer,长度为4 字节Attrib FIELD 4 ;定义数据域Attrib,长度为4 字节String FIELD 100 ;定义数据域String,长度为100 字节…ADR R9,DataStart ;设置R9 的值,即设置结构化的内存表地址LDR R0,Atrrib ;相当于LDR,R0,[R9,#4]…MAP 伪指令和FIELD 伪指令配合使用,用于定义结构化的内存表结构。

MAP 伪指令中的base-register 寄存器的值对于其后所有的FIELD 伪指令定义的数据域是默认使用的,直到遇到新的包含base-register 项的MAP 伪指令。

FIELDFIELD 用于定义一个结构化内存表中的数据域。

#与FIELD 同义。

伪指令格式:{tabel} FIELD expr其中:label 当指令中包含这一项时,label 的值为当前内存表的位置计数器{VAR}的值,汇编编译器处理了这条FIELD 伪指令后,内存表计数器的值将加上expr。

expr 表示本数据域在内存表中所占用的字节数。

伪指令应用举例如下:MAP 0x40003000 ;内存表的首地址为0x40003000count1 FIELD 4 ;定义数据域count1,长度为4 字节count2 FIELD 4 ;定义数据域count2,长度为4 字节count3 FIELD 4 ;定义数据域count3,长度为4 字节LDR R1,count1 ;R1=[0x40003000+0x00]STR R1,count2 ;[0x40003000+0x00]=R1MAP、FIELD 伪指令仅仅是定义数据结构,它们并不实际分配内存单元。

SPACESPACE 用于分配一块内存单元,并用0 初始化。

%与SPACE 同义。

伪指令格式:{label} SPACE expr其中:label 内存块起始地址标号。

expr 所要分配的内存字节数。

伪指令应用举例如下:AREA DataRA,DATA,READWROTE ;声明一数据段,名为DataRAMDataBuf SPACE 1000 ;分配1000 字节空间DCBDCB 用于分配一段字节内存单元,并用伪指令中的expr 初始化。

一般可用来定义数据表格,或文字符串。

=与DCB 同义。

伪指令格式:{label} DCB expr{,expr}{,expr}…其中:label 内存块起始地址标号。

expr 可以为-128~255 的数值或字符串。

相关文档
最新文档