定义段和变量的伪指令

合集下载

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

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

新版汇编语言程序设计变量定义及常用伪指令汇编语言是计算机底层的编程语言,具有高效、灵活的特点。

在进行汇编语言程序设计时,变量定义和常用伪指令是不可或缺的重要部分。

本文将详细介绍新版汇编语言程序设计中的变量定义和常用伪指令,并提供相应的示例和应用。

一、变量定义在汇编语言中,变量定义是用来存储数据的标识符和内存分配的过程。

变量可以是不同的数据类型,如整型、字符型、字符串型等。

变量定义的格式如下所示:变量名数据类型初始值其中,变量名是标识符,用来表示变量的名称;数据类型是变量的类型,包括BYTE、WORD、DWORD等;初始值是可选项,用来给变量赋初值。

下面是一个变量定义的示例:count DWORD 10这个例子定义了一个名为count的DWORD类型变量,初始值为10。

二、常用伪指令1. EQUEQU是汇编语言中常用的伪指令,用于给标识符赋值。

其格式如下:标识符 EQU 表达式其中,标识符是需要赋值的标识符,表达式是赋给标识符的值。

下面是一个EQU指令的示例:MAX_SIZE EQU 100这个例子给标识符MAX_SIZE赋值为100。

2. DB、DW、DDDB、DW和DD是用来定义字节、字和双字变量的伪指令。

它们分别代表Byte(字节)、Word(字)和Double Word(双字)。

其格式如下:标识符 DB/ DW/ DD 初始值下面是一个DB指令的示例:message DB "Hello, World!"这个例子定义了一个名为message的字节型变量,并给它赋值为"Hello, World!"。

3. RESB、RESW、RESDRESB、RESW和RESD是用来声明未初始化的字节、字和双字变量的伪指令。

其格式如下:标识符 RESB/ RESW/ RESD 数量其中,标识符是需要声明的变量名,数量是变量的个数。

下面是一个RESW指令的示例:numbers RESW 5这个例子声明了一个名为numbers的字型数组,包含5个元素。

汇编语言伪指令

汇编语言伪指令

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

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

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

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

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

伪指令——精选推荐

伪指令——精选推荐

伪指令常⽤伪指令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 位常量值存⼊连续的数据单元中。

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

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

例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 ;进行短转移

汇编言语——常用伪指令

汇编言语——常用伪指令

(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

8086伪指令

8086伪指令

8086伪指令(汇编语言程序格式)汇编语言程序中的语句可以由指令、伪指令和宏指令组成。

上一章我们介绍了8086指令系统中的6类指令,每一条指令都对应一种CPU操作。

伪指令又称为伪操作,它是在对源程序汇编期间由汇编程序处理的操作,它们可以完成如处理器选择、定义程序模式、定义数据、分配存储区、指示程序结束等功能。

宏指令是由用户按照宏定义格式编写的一段程序,其中语句可以是指令、伪指令,甚至是已定义的宏指令。

宏指令将在第七章中介绍。

伪指令和指令的区别在于,每一条指令必须生成机器代码,然后在程序运行期间由CPU来执行其操作;而伪指令是在汇编期间由汇编程序执行的操作命令,除了数据定义及存储器分配伪指令分配存储器空间外,其它伪指令不生成目标码。

和各种指令一样,伪指令也是程序设计不可缺少的工具。

下面介绍一些常用的伪指令。

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

4.2.1.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寄存器了。

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

伪指令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 分为以下几种具体用法。
1)用数值表达式定义变量
【例4.11】 K1 DB 10, 4, 10H 4.11】
K2 DW 100, 100H, -5
K3 DD 3*20, 0FFFDH
• 【例4.12】 RS1 DW ADDR1 4.12】 • DW ADDR2 • RS2 DD LOOP1 • DD LOOP2 • 汇编程序在汇编时,在相应存储区域
伪指令SEGMENT和ENDS总是成对使用的。 伪指令SEGMENT和ENDS总是成对使用的。 SEGMENT 伪指令定义一个段的段名和段的首地址, ENDS定义一个段的结束。 ENDS定义一个段的结束。
【例】下面定义了名字叫DATA的数据段,其中有字节变 下面定义了名字叫DATA的数据段,其中有字节变 量S1,保留了80个字节单元: S1,保留了80个字节单元: DATA S1 DATA SEGMENT DB 80 DUP(?) DUP( ENDS
定义段的伪指令
格式:段名SEGMENT [定位类型][, 组合类型][, 格式:段名SEGMENT [定位类型][, 组合类型][, 字长类 型][, 类别] 类别] ( 段体 ) 段名 ENDS 任何一个逻辑段从SEGMENT语句开始,以ENDS语 任何一个逻辑段从SEGMENT语句开始,以ENDS语 句结束。伪指令名SEGMENT和ENDS是本语句的关键字, 句结束。伪指令名SEGMENT和ENDS是本语句的关键字, 不可以默认,并且必须成对出现。语句中段名是必选项, 不可以默认,并且必须成对出现。语句中段名是必选项, 定位类型、组合类型、字长类型、类别为可选项。 用户自己选定,不能省略,其规定同变量或标号,一个 段开始与结尾用的段名应一致。
中存入有关变量或标号的地址值,其中偏 移地址或段基址均占一个字,低位字节占 用第一个字节地址,高位字节占用第二个 字节地址。若用DD定义变量或标号,则偏 字节地址。若用DD定义变量或标号,则偏 移地址占用低位字,段引号引起来,其中字符 的个数可以是一个,也可以是多个。注意空格也是 的个数可以是一个,也可以是多个。注意空格也是 字符(ASCII码为20H)。 字符(ASCII码为20H)。 【例4.13】 STRING1 DB '123' 4.13】 STRING2 DB 'HOW ARE YOU? ' STRING3 DW 'C' , 'DE' 注:对字符串的定义可用DB伪指令,也可 注:对字符串的定义可用DB伪指令,也可 用DW伪指令。用DW和DB定义的变量在存储单元中 DW伪指令。用DW和DB定义的变量在存储单元中 存放的格式是不同的。用DW语句定义的字符串只允 存放的格式是不同的。用DW语句定义的字符串只允 许包含一个或两个字符,如果字符多于两个时,必 许包含一个或两个字符,如果字符多于两个时,必 须用DB语句来定义。 须用DB语句来定义。
相关文档
最新文档