伪指令
伪指令

南京航空航天大学信息科学与技术学院 石燕
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 伪指令用于给一个字符串变量赋值
南京航空航天大学信息科学与技术学院 石燕
伪指令

第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 伪指令
ARM汇编语言伪指令

ARM汇编语言伪指令ARM汇编语言伪指令ARM中伪指令不是真正的ARM指令或者Thumb指令,这些伪指令在汇编编译时对源程序进行汇编处理时被替换成对应的ARM或Thumb指令(序列)。
ARM伪指令包括ADR、ADRL、LDR和NOP等。
1、ADR(小范围的地址读取伪指令)该指令将基于PC的地址值或基于寄存器的地址值读取到寄存器中。
语法格式ADR{cond} register, expr其中,cond为可选的指令执行的条件register为目标寄存器expr为基于PC或者基于寄存器的地址表达式,其取值范围如下:当地址值不是字对齐时,其取值范围为-255~255.当地址值是字对齐时,其取值范围为-1020~1020当地址值是16字节对齐时,其取值范围将更大在汇编编译器处理源程序时,ADR伪指令被编译器替换成一条合适的指令。
通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能。
因为ADR伪指令中的地址是基于PC或者基于寄存器的,所以ADR读取到的地址为位置无关的地址。
当ADR伪指令中的地址是基于PC时,该地址与ADR伪指令必须在同一个代码段中。
示例start MOV r0,#10 ;因为PC值为当前指令地址值加8字节ADR r4, start ;本ADR伪指令将被编译器替换成SUB r4,pc,#0xc2、ADRL(中等范围的地址读取伪指令)该指令将基于PC或基于寄存器的地址值读取到寄存器中。
ADRL伪指令比ADR伪指令可以读取更大范围的地址。
ADRL伪指令在汇编时被编译器替换成两条指令,即使一条指令可以完成该伪指令的功能。
语法格式ADRL{cond} register,expr示例start MOV r0,#10 ;因为PC值为当前指令地址值加8字节ADRL r4,start+60000 ;本ADRL伪指令将被编译器替换成下面两条指令ADD r4,pc,#0xe800ADD r4,r4,#0x2543、LDR(大范围的地址读取伪指令)LDR伪指令将一个32位的常数或者一个地址值读取到寄存器中语法格式LDR{cond} register, =[expr|label-expr]其中,expr为32位的常量。
ARM伪指令

ARM伪指令——中等范围的地址读取
ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地 址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址 。在汇编编 译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能 用两条指令实现,则产生错误,编译失败。 ADRL伪指令格式 ADRL{cond} register,expr
... ADRL ... Delay MOV ... R0,r14 R0,Delay 0x20 0x24
编译后的反汇编代码:
... ADD ADD ... 0xFF68 MOV ... r0,r14 r1,pc,#40 r1,r1,#FF00
使用伪指令将程序标号 Delay的地址存入R0
ADRL伪指令被汇编成两条指令
ARM汇编程序设计
AREA Word, CODE, READONLY ; name this block of code num EQU 20 ; Set number of words to be copied ENTRY start LDR r0, =src ; r0 = pointer to source block LDR r1, =dst ; r1 = pointer to destination block MOV r2, #num ; r2 = number of words to copy wordcopy LDR r3, [r0], #4 ; a word from the source STR r3, [r1], #4 ; store a word to the destination SUBS r2, r2, #1 ; decrement the counter BNE wordcopy ; ... copy more stop MOV r0, #0x18 ; angel_SWIreason_ReportException LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SWI 0x123456 ; ARM semihosting SWI AREA BlockData, DATA, READWRITE src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4 dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 END ; mark the first instruction to call
《汇编语言》学习笔记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 位常量值存⼊连续的数据单元中。
单片机伪指令和指令详解

ASM-51汇编伪指令一、伪指令分类1.符号定义SEGMENT, EQU, SET, DATA, IDATA, XDATA, BIT, CODE2.存储器初始化/保留DS, DB, DW, DBIT3.程序链接PUBILC, EXTRN, NAME4.汇编程序状态控制ORG, END5.选择段的伪指令RSEG, CSEG, DSEG, XSEG, ISEG, BSEG, USING二、伪指令具体说明1.符号定义伪指令1)SEGMENT伪指令格式:段名SEGMENT 段类型说明:SEGMENT 伪指令说明一个段。
段就是一块程序代码或数据存储器。
允许使用的段类型为:●CODE代码空间●DATA 可以直接寻址的内部数据空间●XDATA外部数据空间●IDATA可以间接寻址的整个内部数据空间●BIT位空间例子:(段符号用于表达式时,代表被连接段的基地址)STACK SEGMENT IDATARSEG STACKDS 10H ;保留16字节做堆栈MOV SP , #STACK-1 ;堆栈指针初始化2)EQU伪指令格式:符号名 EQU 表达式符号名 EQU 特殊汇编符号说明:EQU表示把一个数值或特殊汇编符号赋予规定的名字。
一个表达式赋予一个符号,必须是不带向前访问的表达式。
例子:N27 EQU 27;ACCUM EQU A ;定义ACCUM代替特殊汇编符号A(累加器)HERE EQU $; HERE为当前位置计数器的值3)SET伪指令格式:符号名 SET 表达式符号名 SET 特殊汇编符号说明:SET类似EQU,区别在于可以用另一个SET伪指令在以后对定义过的符号重新定义。
例子:COUNT SET 0COUNT SET COUNT+14)BIT伪指令格式:符号名 BIT 位地址说明: BIT伪指令把一个地址赋予规定的符号名。
该符号类型取段类型BIT.例子:RSEG DATA_SEG;CONTROL: DS 1ALATM BIT CONTROL.0;OPEN_BOARD BIT ALATM+1 ;下一位RESET_BOARD BIT 60H ;下一个绝对的位5)DATA伪指令格式:符号名 DATA 表达式说明:DATA伪指令把片内的数据地址赋予所规定的符号名。
第四章 伪指令

数据定义伪指令的格式为: [变量名] 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个字节单元。
伪指令

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

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

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

<>
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分)是实现十进制算术运算调整的必要基础。
伪指令

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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例如:ASSUME CS:MYCODE,DS:MYDATA
ASSUME ES:MYEXTRA,SS:MYSTACK
注意:ASSUME语句只能安排在代码段内,一 般应在代码段作为首始指令。允许多次使用该 语句重新约定段寄存器与段的关系。除CS外, 各个段寄存器的实际值,还要用MOV赋值
;wj1.asm .model small .stack .data
string db ’Hello, Assembly !’,0dh,0ah,’$’ .code
start: mov ax,@data mov ds,ax mov dx,offset string mov ah,9 int 21h mov ax,4c00h int 21h end start
第6章
第6章 6.1.5 伪指令
方式伪指令
.8086 .386
赋值伪指令EQU
表达式名称 EQU 表达式 新标号 EQU 老标号 例如:ABC EQU 2000H
XYZ EQU [BP+5] AAD EQU PAR_3 COUNT EQU CX 用PURGE可以撤销对原先的赋值 PURGE XYZ
第6章 6.1.5 伪指令
IF ELSE ENDIF条件汇编伪指令
格式:IF
;如果条件成立
:
[ELSE] ;否则
:
ENDIF ;结束条件汇编语句
其中IF有多种形式:
• IF 操作数、IFE 操作数、IFDEF 标号或变量、 IFNDEF 标号或变量、IFB<变量>、IFNB<变量>、 IFIDN<操作数1>,<操作数2>、IFDIF<操作数1>, <操作数2>、IF1、IF2
STUDENT_RECORD ENDS
第6章 6.1.5 伪指令
结构的存储分配和预置
格式:变量 结构名称<赋值说明> LiPing STUDENT_RECORD <,,,’891011’>
LuiYi STUDENT_RECORD <‘LuiYi’,1,,’891011’,80H>
对结构的访问
格式:变量名.字段名 例如:MOV AL,LiPing.AGE 等价于: MOV AL,[BX].AGE
第6章 6.1.5 伪指令
定义变量伪指令
DB、DW、DD、DF、DQ、DT
定义存储单元类型的伪指令
BYTE、WORD、DWORD 此指令要和其他指令结合起来使用
LABEL
用于定义标号名称和属性,它和下一条指令共享存储 器单元 格式:名字 LABEL 类型 例如:BYTE-ARRAY LABEL BYTE
第6章: 汇编语言程序的开发过程-补充
文本编辑器,如
编 辑
错误
源程序:文件名.asm
汇
汇编程序,如 MASM.EXE
编
错误
目标模块:文件名.obj
连
连接程序,如 LINK.EXE
接
错误
可执行文件:文件名.exe
调试程序,如 DEBUG.EXE
调 试
应用程序
错误
开发过程1:源程序的编辑
注意:当定义除代码段以外其他段时,段 内不能包括指令语句
段名:所定义段名称,前后要一致,要有 一定的意义 定位类型:给出实际段起点类型
有PAGE、PARA、WORD、BYTE四种 PAGE表示相应段必须从某一页的边界开始, 即段的起始地址能为256整除 PAGE=XXXX XXXX XXXX 0000 0000B
第6章 6.1.5 伪指令
MYCODE SEGMENT ASSUME CS:MYCODE,DS:MYDATA ASSUME ES:MYEXTRA,SS:MYSTACK
START: MOV AX,MYDATA MOV DS,AX MOV AX,MYEXTRA MOV ES,AX MOV AX,MYSTACK MOV SS,AX :
MASM 提供的汇编程序是MASM.EXE:
MASM wj1.asm 如果源程序中没有语法错误,MASM将自 动生成一个目标模块文件(wj1.obj);否 则MASM将给出相应的错误信息。这时应 根据错误信息,重新编辑修改源程序后, 再进行汇编
开发过程2:源程序的汇编(生成列表文件)
汇编过程中,可以通过参数选择生成列表文 件(.LST)。列表文件是一种文本文件,含 有源程序和目标代码,对我们学习汇编语言 程序设计和发现错误很有用 汇编程序MASM.EXE可带其他参数,为了 生成列表文件,各自的命令是:
;主程序 ADITI: AAA1
LOOP ADITI MOV AL,0 ADC AL,AL
STOSB
第6章 6.1.5 伪指令
定义结构的伪指令STRUC/ENDS
格式:结构名称 STRUC
(由DB、DW、DD伪指令组成的语句序列)
结构名称 ENDS
STUDENT_RECORD STRUC NAME DB ‘LiPing’ SEX DB 0 AGE DB 25H NUMBER DB ‘????’ MATH DB 91 PHYSICAL DB 85 CIRCUIT DB 95
第6章 6.1.5 伪指令
PARA表示相应段必须从某一个节(等于16个 字节)的边界开始,即段的起始地址能为16整 除
PARA=XXXX XXXX XXXX XXXX 0000B WORD表示相应段必须从任一个字的边界开始, 即段的起始地址能为2整除
WORD=XXXX XXXX XXXX XXXX XXX0B BYTE表示相应段可以从任一地址开始
DATA SEGMENT ORG 20H X DB 35,64 :
DATA ENDS CODE SEGMENT
ORG 100H MOV AL,X : ADD AX,BX ORG $+3 ADD AL,5 :
CODE ENDS
第6章 6.1.5 伪指令
ASSUME伪指令
功能:用来告诉汇编程序在指令执行期间内存 的哪一段是数据段,哪一段是堆栈段,哪一段 是代码段
第6章:例: 在屏幕上显示一段信息
string
;数据段(定义要显示的字符串) db’Hello, Assembly !’,0dh,0ah,’$’ ;代码段(显示字符串的程序) mov dx,offset string mov ah,9 int 21h
Hello, Assembly !
程序功能
第6章:源程序文件wj1.asm
WORD-ARRAY DW 100 DUP(?) 两种访问方式:MOV WORD-ARRAY,0
MOV BYTE-ARRAY,0
第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
SEGMENT DW 7654H DW 2345H DW ? ENDS
;代码段定义
CODE_SEG START:
CODE_SEG
SEGMENT
ASSUME CS:CODE_SEG,DS:DATA_SEG MOV AX,DATA_SEG MOV DS,DATA_SEG MOV AX,VAR1 SUB AX,VAR2 MOV RESULT,AX
;小型模式存储模式 ; 1KB空间堆栈段 ;数据段 ;数据定义 ;代码段 ;起始点 ;设置DS ;程序代码
;结束点,返回DOS ;子程序代码 ;汇编结束
第6章: 完整段定义格式
完整段定义利用SEGMENT和ENDS一对伪 指令定义逻辑段 同 时 需 要 配 合 ASSUME 伪 指 令 指 明 逻 辑 段 是代码段、堆栈段、数据段还是附加段 完整段定义的优势是可以指明逻辑段的定位、 组合、类别等属性;而简化段定义只能采用 系统默认的属性 完整段定义和简化段定义的实质是一致的
解决任一模块引用其他模块中的变量和标号问 题 内部标识符、外部标识符 每个模块要有两个清单,一个标明他所要访问 的其他模块的标识符;另一个列出他所定义的, 且为其他模块所访问的标识符 使用伪指令EXTRN、PUBLIC
第6章 6.1.5 伪指令
EXTRN格式
• EXTRN 标识符:类型,…,标识符:类型 • EXTRN VAR1:WORD
MYCODE ENDS
第6章 6.1.5 伪指令
过程定义伪指令PROC、ENDP、NEAR、 FAR
过程的含义与子程序相同,最后一跳语句总是 返回指令 PROC/ENDP总是成对出现 NEAR可以省略,默认为NEAR P173例题
例题
;过程
AAA1 PROC NEAR
LOADSB
ADC AL,[BX] DAA STOSB INC BX RET AAA1 ENDP
第6章 6.1.5 伪指令
TYPE、SIZE、LENGTH
见表6.3
段定义伪指令
SEGMENT/ENDS伪指令 成对使用,说明段的名称和范围,还可指明段 的定位类型、组合类型、分类名
段名 SEGMENT [定位类型][组合类型][分类名] : 本段程序内容(指令或伪指令语句)
段名 ENDS
第6章 6.1.5 伪指令
源程序文件要以ASM为扩展名 源程序文件的形成(编辑)可以通过任何 一个文本编辑器实现:
DOS中的全屏幕文本编辑器EDIT 其他程序开发工具中的编辑环境 Windows中的记事本Notepad
EDIT wj1.asm
开发过程2:源程序的汇编(TASM)