第4讲 变量定义及常用伪指令

合集下载

课件:第7章 汇编语言与汇编程序4 常用伪指令

课件:第7章 汇编语言与汇编程序4 常用伪指令
DECADD MACRO ADD AL,CL DAA ENDM
显而易见,这是一个无形式参数的宏定义。
21
如果对分别存放在任意8位寄存器或存储单元中 的两个压缩型的BCD数进行加法运算,则可将上例宏定 义改写为
DECADD1 MACRO OPR1,OPR2 MOV AL,OPR1 ADD AL,OPR2 DAA MOV OPR1,AL ENDM
12
7.4.4 汇编指令中的地址操作符
地址操作符可取得名字或标号的段地址和偏移 地址,地址操作符如下表所示:
[]
将括起的表达式作为存储器地址指针
$
当前偏移地址
:
段前缀,采用指定的段地址寄存器
OFFSET 名字/标号 返回名字或标号的偏移地址
SEG 名字/标号
返回名字或标号的段地址
ORG 数值表达式 将汇编地址计数器置成数值表达式所给定的值 13
这是一个带有两个形式参数的宏定义。宏指令为 DECADD1。
22
例如有以下宏调用:
DECADD1 DL, BUFFER
DECADD1 AREA1, AREA2
则汇编时进行宏展开,得到以下指令:
DECADD1 DL, BUFFER + MOV AL, DL + ADD AL, BUFFER + DAA + MOV DL, AL
例: dataA db " hello files! " dataA_size=$-offset dataA
EB DB 0,1,4,9,16,25, DB 36,49,64,81
…… MOV SI, SEG EB MOV DS, SI MOV SI, OFFSET EB INC SI MOV AL, DS:[SI]

4-10汇编伪指令

4-10汇编伪指令

段定义伪指令
类别名,指明程序连接时,段间次序的确定方法
LINK程序将各模块相同‘类别名’的各段依次序连续存 放在内存中,但各段相互独立。缺省项为空。
段定义伪指令示例
D_SEG SEGMENT NUM1 DB 10 DUP(?)
D_SEG ENDS
S_SEG SEGMENT DW 100 DUP(?)
可为常数、表达式、?表达式、字符串、DUP表达式 字符串用单引号括起来,如‘ABCDE’ DUP表达式格式:n DUP(参数{[,参数]})
数据定义伪令
DATA SEGMENT X1 DB 40H X2 DW 1764H X3 DB 10,20,30 Y1 DB 20H,? S1 DB ‘HEL’ S2 DB ‘H’, ‘E’, ‘L’ S3 DW ‘HE’ V1 DW 2 DUP(2,4) V2 DB 2 DUP(?,2 DUP(‘A’,‘B’) ) DATA ENDS
S_SEG ENDS
E_SEG SEGMENT STRING DB 'HELLO'
E_SEG ENDS
回顾: 在汇编程序中,从段的性质上 看,可分为代码段、堆栈段、 数据段和附加段4种。
每个段具体对应到什么性质的 段,取决于段寄存器的指向
指定段寄存器伪指令
格式:ASSUME 段寄存器:段名 {[,段寄存器:段名]} 操作:明确段和段寄存器的关系 说明:①代码段中必须至少有一个ASSUME语句,
S_SEG SEGMENT PARA STACK DW 100 DUP(?)
S_SEG ENDS
思考:若有多个STACK属 性的堆栈段,结果如何?
缺省指定:当无组合类型为STACK的段时,无论是否用 ASSUME设定,SS自动指向程序区开始(SP=0000H)

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,只不过是语法结构不太一样注意:通过变量名操作时,变量名代表存储区的第一个数据的地址。

第4讲_1 4.4-4.5伪指令

第4讲_1 4.4-4.5伪指令
VAL = 100 MOV AL,VAL VAL = VAL+10 MOV AL,VAL
伪指令与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

第二部分 汇编语言程序设计——伪指令

第二部分  汇编语言程序设计——伪指令

例3.2:数据定义综合应用-2/2
.code .startup mov bl,bvar mov ax,word ptr dvar[0] mov dx,word ptr dvar[2] ;取双字到DX.AX mov dx,offset msg mov ah,09h CALLDOS .exit 0 end
运算符
算术运算符 + - * / MOD 逻辑运算符 AND OR XOR NOT 移位运算符 SHL SHR 关系运算符 EQ NE GT LT GE LE 高低分离符 HIGH LOW HIGHWORD LOWWORD
地址型参数
汇编语言程序中,指令参数还有地址型,
它的主要形式是标号和名字(变量名、段 名、过程名等) 硬指令的操作数有存储单元;存储单元就 应该用地址型参数(存储器操作数)表达
定义字节单元伪指令DB
DB伪指令用于分配一个或多个字节单元, 并可以将它们初始化为指定值 初值表中每个数据一定是字节量 (Byte),存放一个8位数据: 可以是0~255的无符号数 或是-128~+127带符号数 也可以是字符串常数
data X Y data
segment ;数据段 db 'a',-5 db 2 dup(100),? db 'ABC' ends
例3.4:属性及其应用-2/5
.code .startup mov al,byte ptr v_word ;用PTR改变v_word的类型,否则类型不匹配 dec al mov v_byte,al ;对v_word的头一个字节操作,原为32H、现为31H n_label: cmp flag,1 jz s_label ;flag单元为1转移 inc flag jmp n_label ;进行短转移

定义段和变量的伪指令

定义段和变量的伪指令

伪指令ASSUME则告诉汇编程序,哪一个段为数据段,哪 伪指令ASSUME则告诉汇编程序,哪一个段为数据段,哪 一个段为堆栈段,哪一个段为代码段。 伪指令ORG用来规定目标程序存放单元的偏移量。 伪指令ORG用来规定目标程序存放单元的偏移量。
结合,有两点需要说明: 1、SEGMENT和ENDS前面的标号如DATA、 SEGMENT和ENDS前面的标号如DATA、 STACK、CODE等,是用户所取。互相配对的 STACK、CODE等,是用户所取。互相配对的 SEGMENT和ENDS前的标号必须一样。 SEGMENT和ENDS前的标号必须一样。 2、ASSUME语句使汇编程序得知哪一段是数据段, ASSUME语句使汇编程序得知哪一段是数据段, 哪一段是堆栈段,哪一段是代码段。但除CS以外, 哪一段是堆栈段,哪一段是代码段。但除CS以外, 各个段寄存器的实际值,还要用MOV指令来赋给。 各个段寄存器的实际值,还要用MOV指令来赋给。 上例中可看到为数据段寄存器DS赋值的两条MOV 上例中可看到为数据段寄存器DS赋值的两条MOV 指令。
变量定义伪指令
变量定义伪指令用来定义变量的类型,并 为变量中的数据项分配存储单元。变量定 义伪指令有两种不同的格式。 格式:[变量名] 格式:[变量名] DB/DW/DD/DQ/DT 表 达式
DB( DB(define byte):定义一个字节类型的变量,其后 byte):定义一个字节类型的变量,其后 的每个操作数均占用1 的每个操作数均占用1个字节。 DW( DW(define word):定义一个字类型的变量,其 word):定义一个字 后的每个操作数均占用1个字(2 后的每个操作数均占用1个字(2个字节)。 DD( DD(define doubleword):定义一个双字类型的变 doubleword):定义一个双字类型的变 量,其后的每个操作数均占用2个字(4 量,其后的每个操作数均占用2个字(4个字节)。 DQ( DQ(define quadword):定义一个四字类型的变量, quadword):定义一个四字类型的变量, 其后的每个操作数均占用4个字(8 其后的每个操作数均占用4个字(8个字节)。 DT( DT(define ten bytes):定义一个十字节类型的变 bytes):定义一个十字节类型的变 量,其后的每个操作数均占用5个字(10个字节)。 量,其后的每个操作数均占用5个字(10个字节)。 其中,各变量定义伪指令都将高位字节数据存放在 高地址中,低位字节数据存放在低地址中。格式1又可 高地址中,低位字节数据存放在低地址中。格式1 分为以下几种具体用法。

汇编言语——常用伪指令

汇编言语——常用伪指令

(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个字节单元。

伪指令

伪指令

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

汇编学习笔记(4)-伪指令(MASM)

汇编学习笔记(4)-伪指令(MASM)

汇编学习笔记(4)-伪指令(MASM)前⾔ 编写汇编代码的时候会使⽤到两种语句,⼀种就是前⾯介绍的汇编指令⼜CPU提供功能⽀持,另⼀种呢叫做伪指令,伪指令是由汇编的编译器提供⽀持。

所以伪指令的运⾏结果都必须实在编译的时候就能确定的,下⾯介绍的就是伪指令了。

注意接下来介绍的伪指令都是基于MASM汇编编译器,⽐较常⽤的还有NASM 它的语法以后有机会介绍数值表达式 数值表达式不是汇编指令,表达式的值是在汇编代码的汇编过程中就由汇编编译器计算出结果⽽写到⼆进制程序中了,并不是在程序运⾏的过程中才计算的 (1) 常数表达式 常数就是直接的数字,直接写数字默认表⽰10进制数,也可以⽤符号指定为其他进制 D = ⼗进制 ; MOV AL, 1234D B = ⼆进制 ; MOV AL, 0101B H = ⼗六进制 ; MOV AL, 0FFFFH , 注意常数必须是数字开头不能是字母开头,如果16进制数第⼀个数字是字母的话就要补⼀个0在前⾯ Q = ⼋进制 ; MOV AL, 123Q 因为在程序中字母也是数字,所以其实也可以直接将字母或者字符串当成数字,⽐如 MOV AL, 'a' MOV AX,"ab" ; 双引号和单引号都是可以使⽤的 (2) 算数运算符 就是简单的正(+) 负(-) 加(+) 减(-) 乘(*) 除(/) 模(mod) mov ax, 100+200 mov ax, 100/2 (3) 关系运算符 等于(EQ) 不等(NE) ⼤于(GT) ⼩于(LT) ⼤于等于(GE) ⼩于等于(LE) 如果等式成⽴则实际的值为0FFFF就是补码表⽰的-1, 如果关系不成⽴那么结果就是0 mov ax, 123 gt 234 mov ax, 1234+5 lt 1235 (4) 逻辑运算 与(and) 或(or) ⾮(not) 异或(xor) 左位移(shl) 右位移(shr) mov ax, 1 shl 3 mov al, 3 and 47 (5) 其他操作符 HIGH LOW WIDTH MASK HIGH 表⽰取数据的⾼⼋位 LOW 表⽰取数据的低⼋位地址表达式 地址表达式所表⽰的是存储器操作数的地址。

伪 指 令

伪 指 令

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

新版汇编语言程序设计 变量定义及常用伪指令共35页

新版汇编语言程序设计 变量定义及常用伪指令共35页
33、如果惧怕前面跌宕的山岩,生命 就永远 只能是 死水一 潭。 34、当你眼泪忍不住要流出来的时候 ,睁大 眼睛, 千万别 眨眼!你会看到 世界由 清晰变 模糊的 全过程 ,心会 在你泪 水落下 的那一 刻变得 清澈明 晰。盐 。注定 要融化 的,也 许是用 眼泪的 方式。
35、不要以为自己成功一次就可以了 ,也不 要以为 过去的 光荣可 以被永 远肯定 。
新版癫,我笑他人看不 穿。(名 言网) 32、我不想听失意者的哭泣,抱怨者 的牢骚 ,这是 羊群中 的瘟疫 ,我不 能被它 传染。 我要尽 量避免 绝望, 辛勤耕 耘,忍 受苦楚 。我一 试再试 ,争取 每天的 成功, 避免以 失败收 常在别 人停滞 不前时 ,我继 续拼搏 。
谢谢你的阅读
❖ 知识就是财富 ❖ 丰富你的人生
71、既然我已经踏上这条道路,那么,任何东西都不应妨碍我沿着这条路走下去。——康德 72、家庭成为快乐的种子在外也不致成为障碍物但在旅行之际却是夜间的伴侣。——西塞罗 73、坚持意志伟大的事业需要始终不渝的精神。——伏尔泰 74、路漫漫其修道远,吾将上下而求索。——屈原 75、内外相应,言行相称。——韩非

伪指令

伪指令
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个字符作为模块名.

4-2-1 汇编语言基础伪指令2

4-2-1 汇编语言基础伪指令2

分析下列语句是否正确? M1+1 是地址表达式 √ MOV AL,M1 等价于 MOV AH,M1+1 √ MOV AH,[0001H] MOV AX,M1 内存 01 ****H:0000H MOV BX,M2 √ 02 ****H:0001H MOV BL,M2 0002H 56H 0003H 34H MOV BH,M2+1 MOV CX,M2+2 √
6
② 偏移地址属性 OFFSET
D1 SEGMENT M1 DB 1,2 M2 DW 3456H,7 D1 ENDS
地址传送与数据传送
内存
****H:0000H ****H:0001H 0002H 0003H 注意 0004H 0005H
01 02 56H 34H 07H 00H
M1 M2
传地址;立即寻址
用符号名代替EQU之后的表达式 例: ADR EQU ES:[BX+SI+20H] … 地址表达式 MOV AL,ADR
等价于 MOV BL,ES:[BX+SI+20H]
24
②. =等号伪指令
格式: 符号名 = 表达式
用符号名代替=之后的表达式
例:CONST3=10 ;CONST3之值是10 MOV AL,CONST3 ;(AL)←10

CONST3=CONST3 +2 ;CONST3之值是12 MOV BL,CONST3;(BL)←12
定义符号常量 不占内存空间 可以重复定义
= 要点:
25
③ LABLE 伪指令
LABLE 伪指令是定义变量的类型 格式: 符号名 LABLE BYTE/WORD
例: M1 LABLE WORD M2 DB 12H,34H … MOV AL,M2 ;(AL)=12H MOV DX,M1 ;(DX)=3412H 可以按字节访问内存单元 也可以按字访问内存单元

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

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

汇编语言中常用的伪指令分类:软件相关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)。

汇编语言程序的语句格式
⑴ 执行性语句——由硬指令构成的语句,它通常对应 一条机器指令,出现在程序的代码段中: 标号: 硬指令助记符 操作数,操作数 ;注释
伪指令的参数可以是常数、变量名、 表达式等,可以有多个,参数之间 用逗号分隔 ⑵ 说明性语句——由伪指令构成的语句,它通常指示
汇编程序如何汇编源程序: 名字 伪指令助记符 参数,参数,…
字变量和字常量的应用:
;定义WNUM为常量
;定义COUNT变量,假设在数据段的偏移地址为10H
MOV AX,[BX+SI+WNUM] MOV AX,COUNT MOV AX,[SI+COUNT]
; MOV AX,[BX+SI+5678H]
; MOV AX,[0010H] ; MOV AX,COUNT[SI] ; MOV AX,[SI+10H]
数和数值表达式;
汇编语言程序中,指令参数还有地址型,它的主要形式是标
号和名字(变量名、段名、过程名等)
成功学院信工系
张莉
(1) 常数
常数(常量)表示一个固定的数值 它又分成多种形式:
(1)十进制常数 (2)十六进制常数 (3)二进制常数
(4)八进制常数
(5)字符串常数 (6)符号常数
成功学院信工系
张莉
例:显示字符串 .model small .stack .data
如果去掉“$”显示的结果又会是什么?
buf1 db "Hello,",0dh,0ah," this is an example.$",0dh,0ah
buf2 db "--END--$" .code .startup mov dx, offset buf1 mov ah, 9 int 21h lea dx, buf2 mov ah, 9 int 21h .exit 0 end
成功学院信工系
张莉
例2.50:输入字符串
buffer db 81
;定义缓冲区 ;第1个字节填入可能输入的最大字符数
db 0 ;存放实际输入的字符数 db 81 dup(0) ;存放输入的字符串 ... mov dx,seg buffer
;伪指令seg取得buffer的段地址
mov mov mov int
LEA BX,COUNT MOV BX,OFFSET COUNT
; LEA BX,[0010H]
; MOV BX,0010H
成功学院信工系 张莉
定义双字单元伪指令DD
DD 伪指令用于分配一个或多个双字单元,并可以将 它们初始化为指定值 初 值 表 中 每 个 数 据 是 一 个 32 位 的 双 字 量 ( Double Word): 可以是有符号或无符号的32位整数 也可以用来表达16位段地址(高位字)和16位的 偏移地址(低位字)的远指针 vardd farpoint DD 0,?,12345678h DD 00400078h
成功学院信工系 张莉
3 变量和标号的属性
① 地址属性
标号和名字对应存储单元的逻辑地址
逻辑地址包括:段地址和偏移地址
② 类型属性
标号、子程序名的类型可以是 NEAR(近)和FAR (远),分别表示段内或段间 变量名的类型可以是 BYTE(字节)、 WORD(字) 和DWORD(双字)等
成功学院信工系
成功学院信工系 张莉
字符串输入的功能调用
DOS功能调用INT 21H

关键要定义好缓冲区
功能号:AH=0AH 入口参数:DS:DX=缓冲区首地址
执行该功能调用时,用户按键,最后用回车确认
本调用可执行全部标准键盘编辑命令;用户按回车键
结束输入,如按Ctrl+Break或Ctrl+C则中止
成功学院信工系
张莉
字符串输出的功能调用
DOS功能调用INT 21H 功能号:AH=09H 入口参数: DS:DX=欲显示字符串在主存中的首地址 字符串应以$(24H)结束 功能:在显示器输出指定的字符串 可以输出回车( 0DH )和换行( 0AH )字符产生 回车和换行的作用
成功学院信工系
;注释
成功学院信工系
张莉
标识符
标识符(Identifier)一般最多由31个字母、数字及规定的
特殊符号(如 _、 @ 、$、?、%)组成,不能以数字开头。 默认情况下,汇编程序不区别标识符中的字母大小写
一个程序中,每个标识符的定义是唯一的,还不能是汇编
语言采用的保留字
o 硬指令助记符——例如:MOV、ADD o 伪指令助记符——例如:DB、EQU o 操作符——例如:OFFSET、PTR o 寄存器名——例如:AX、CS o 预定义符号——例如:@data
成功学院信工系
张莉
定位伪指令
定位伪指令控制数据的偏移地址 ORG 参数 ORG伪指令是将当前偏移地址指针指向参数表达的 偏移地址: ORG 100h ;从100h处安排数据或程序 ORG $+10 ;使偏移地址加10,即跳过10个字节空间 MASM中,符号“$”表示当前偏移地址值 array DB 12,34,56 len equ $-array ;记录变量array所占字节数
ds,dx ;设置数据段DS dx,offset buffer ah,0ah 21h 想一想:如何实现将输入的字符串进行输出
成功学院信工系 张莉
.model small .stack .data msg1 db "please input a string:",0dh,0ah,"$" msg2 db "contents of the string is:",0dh,0ah,"$" buffer1 db 100 db 0 db 100 dup(0) .code .startup mov dx, offset msg1 mov ah, 9h int 21h mov dx,seg buffer1 mov ds,dx mov dx,offset buffer1 mov ah,0ah int 21h

本课程采用微软宏汇编程序 MASM 6.15
成功学院信工系 张莉
标号是反映硬指令位置(逻辑地址)的标识符, 语句中由分号“;”开始的部分为注释内容,用以增加 源程序的可读性 后跟一个冒号分隔 必要时,一个语句行也可以由分号开始作为阶段性注释 名字是反映伪指令位置(逻辑地址)和属性的标识符, 处理器指令的操作数可以是 汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理 后跟空格或制表符分隔,没有一个冒号 立即数、寄存器和存储单元
成功学院信工系
张莉
第4讲 变量定义及常用伪指令
1 数值型参数 2 变量定义伪指令 3 变量和标号的属性 4 字符串的输入输出方法
成功学院信工系
张莉
1 数值型参数
在源程序语句格式的4个组成部分中,参数是指令的操作对
象(学习硬指令时被称为操作数),参数之间用逗号分隔
汇编语言程序中,指令参数有数值型,它的主要形式是常
设置变量名是为了方便存取它指示的存储单元
变量名可以没有。这种情况,汇编程序将直接为初值
表分配空间,无符号地址
成功学院信工系
张莉
初值表
初值表是用逗号分隔的参数 主要由常数、表达式或?、DUP组成
?——表示初值不确定,即未赋初值; DUP——表示重复初值 DUP的格式为: 重复次数 DUP(重复参数)
成功学院信工系
张莉
mov al,X
;此处X表示它的第1个数据,故AL←'a'
dec X+1
;对X为始的第2个数据减1,故成为-6
mov Y,al
;现在Y这个字符串成为 'aBC'
成功学院信工系
张莉
定义字单元伪指令DW
DW伪指令用于分配一个或多个字单元,并可以将 它们初始化为指定值 初值表中每个数据一定是字量(Word),一个字 单元可用于存放任何16位数据: 一个段地址 一个偏移地址 两个字符 0~65535之间的无符号数 -32768~+32767之间的带符号数
张莉
第4讲 变量定义及常用伪指令
硬指令和伪指令

硬指令——使CPU产生动作、并在程序执行时才处理的 语句,如mov、add等

伪指令( Directive ) —— 不产生 CPU 动作、在程序执 行前由汇编程序处理的说明性语句,例如,数据说明、 变量定义等等 伪指令与具体的处理器类型无关,但与汇编程序的版本 有关
成功学院信工系
张莉
data segment ;数据段 count dw 8000h,?,'AB' maxint equ 64h number dw maxint array dw maxint dup(0) data ends
成NUM EQU 5678H COUNT DW 20H
张莉
(2) 数值表达式
数值表达式一般是指由运算符连接的各种常数所构成的表
达式
汇编程序在汇编过程中计算表达式,最终得到一个数值
程序运行之前,就已经计算出了表达式;所以,程序运行
速度没有变慢,但增强程序的可读性
成功学院信工系
张莉
运算符
算术运算符 逻辑运算符 移位运算符 关系运算符 高低分离符
成功学院信工系
张莉
2 变量定义伪指令
变量定义( Define )伪指令为变量申请固定长度
的存储空间,并可同时将相应的存储单元初始化
变量名 伪指令助记符 初值表
变量定义伪指令最常使用
成功学院信工系
张莉
变量名
变量名为用户自定义标识符,表示初值表首元素的逻
相关文档
最新文档