新版汇编语言程序设计 变量定义及常用伪指令
新版汇编语言程序设计变量定义及常用伪指令
新版汇编语言程序设计变量定义及常用伪指令汇编语言是计算机底层的编程语言,具有高效、灵活的特点。
在进行汇编语言程序设计时,变量定义和常用伪指令是不可或缺的重要部分。
本文将详细介绍新版汇编语言程序设计中的变量定义和常用伪指令,并提供相应的示例和应用。
一、变量定义在汇编语言中,变量定义是用来存储数据的标识符和内存分配的过程。
变量可以是不同的数据类型,如整型、字符型、字符串型等。
变量定义的格式如下所示:变量名数据类型初始值其中,变量名是标识符,用来表示变量的名称;数据类型是变量的类型,包括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(汇编语言源程序的结构、语句格式、伪指令)
PTR
Hello
有三个属性:
DB 06H,45H,44H
段地址:即标号所在段的段地址; 偏移量:标号所代表存储单元的段内偏移地址; 类 型:NEAR或FAR:(SHORT ?) NEAR—表示标号所在语句与转移指令/调用指令在 同一码段内,跳转时只需改变IP即可。 FAR —标号所在语句与转移指令/调用指令不在同 一代码段内。跳转时需改变CS和IP即可。 若没有对类型进行说明,默认为NEAR。 标号通常作为转移指令或CALL指令的转移地址。
逻辑运算符只能用于数字表达式中。 例: MOV CL,36H AND 0FH 经汇编后:MOV CL,06H
注意: 不要把逻辑运算符与逻辑运算指令混淆: 例:AND AX, 3FC0H AND 0FF00H 汇编后源操作数被翻译为:3F00H,所以上述指令与 AND AX, 3F00H等价。
25
3)关系运算符——EQ、NE、LT、GT、LE、GE
代码段
9ቤተ መጻሕፍቲ ባይዱ
分段结构
0000:0~3FF
环境与代码运行
中断向量区 (系统专用) 堆栈段
SS:SP 栈底 最多4 个活 动段 DS
ES
数据段
CS:IP
代码段
FFFF:0
系统起始运行程序
10
4.1.2 汇编语言的语句与格式
汇编语言的语句有两种:
指令性语句——由8086指令助记符(真指令)构成 的语句 指示性语句——由伪指令构成的语句
操作数可能放在存储器中,这就涉及操作数的地址。 程序中遇到转移指令或调用指令,也需要知道转移地址, 若采用具体地址就很不方便,一旦有错,改动也很麻烦。 于是人们采用标号或符号来代替地址,例:
汇编常用伪指令
一、基本段定义格式常用结构STACK SEGMENT PARA'STACK;DB 100 DUP('STACK')STACK ENDSDATA SEGMENTDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOV AX,dataMOV DS,AXMOV ES,AXMOV AL,4CHINT 21HCODE ENDSEND START------------------------------------------------------------------------------------------------------------------------ 段名segment[定位][组合][段字][‘类别’] ...段名ends (1)定位段定位(align)属性——指定逻辑段在主存储器中的边界:BYTE:段开始为下一个可用的字节地址(xxxx xxxxb),属性值为1WORD:段开始为下一个可用的偶数地址(xxxx xxx0b),属性值为2DWORD:段开始为下一个可用的4倍数地址(xxxx xx00b),属性值为4PARA:段开始为下一个可用的节地址(xxxx 0000b),属性值为16PAGE:段开始为下一个可用的页地址(0000 0000b),属性值为256简化段定义伪指令的代码和数据段默认采用WORD定位,堆栈段默认采用PARA定位。
完整段定义伪指令的默认定位属性是PARA。
(2)组合PUBLIC: 所有此类型的同名段组合成一个逻辑段,公用一个段地址,运行时装入同一个物理段中。
COMMON : 所有此类型的同名段具有相同的起始地址(覆盖),共享相同的存储区域。
AT <数值表达式> : 按绝对地址定位,段地址就是表达式的值。
STACK : 专用于说明堆栈段,组合方式同PUBLICNONE : 不组合MEMORY :置于地址最高处,多个时取第一个,其余作为COMMONPRIVATE:本段与其他段没有逻辑关系,不与其他段合并。
汇编指令、伪指令大全
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寄存器。
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)
第二部分 汇编语言程序设计——伪指令
例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
单片机汇编语言伪指令
单片机汇编语言伪指令1.BIT---用于汇编程序的一开始创建一个常量.FLASH_COUNT BIT3EH;创建一个名为FLASH_COUNT的常量,并把立即数3EH赋给这个常量,在程序中就可以直接把FLASH_COUNT等同于立即数3EH进行操作.2.DATA---定义一个指向特殊功能寄存器区地址的变量.DPTRSW DATA0A2H;DPTRSW指向特殊功能寄存器0A2H地址上.3.DB---用于汇编程序中定义若干个长度为1个字节的字,这若干个字使用逗号分隔开,如果逗号之间没有数据,汇编器默认为00H.DB10H,11H,,3FH,20H;在目标文件中生成10H,11H,00H,3FH,20H4.DS---用于保留一块存储器空间给程序变量使用或别的用途.STORAGE DS10;保留一块名叫"STORAGE"的10字节存储空间5.DW---定义若干个长度为两个字节的字,这若干个字使用逗号分隔开,如果逗号之间没有数据,汇编器默认为0000H.DW0FFFEH,,0102H;在目标文件中生成代码:FFH,FEH,00H,00H,01H,02H6.END---该伪指令告诉汇编器程序的结束点.7.EQU---定义某一个符号的值,一旦一个符号被定义后,就不能被另一个EQU或SET指令重复定义.BEEP_COUNT EQU1+1;表达式把2定义给符号BEEP_COUNT8.IF、ELSE、ENDIF---这3个伪指令是条件选择语句,它们告诉汇编器根据表达式的值,是否汇编某一块程序,没有汇编的块在目标文件中是不存在对应的执行代码的.IF P1.0;如果P1.0=1,就汇编下一行ELSE01H,02H,03H;在存储器中定义字01H、02H、03HENDIF;条件选择结束,如果P1.0≠1,上一行不被汇编.9.INCL---该指令用于在汇编时把其他文件与当前文件结合在一起汇编.INCL"const.def";即把文件"const.def"与当前文件结合在一起汇编.---该伪指令用于设置程序计数器PC的初始值.ORG0000H;指令的执行代码在单片机的程序存储器中从0000H开始存储(也可简单写成00H).11.SET---该伪指令类似EQU,但不同的是SET可以通过另一个SET伪指令重复定义变量的值.COUNT SET3COUNT SET1;最终COUNT=112.$---美元符号表示当前地址,意味着程序计数器PC的值不变,在程序中表示"本行程序". DJNZ R5,$;工作寄存器R5减1,如果不等于0就调回本行---直到R5减至0为止,执行下一条指令.。
新版汇编语言程序设计 变量定义及常用伪指令
可以是0~255的无符号数 或是-128~+127带符号数 也可以是字符串常数
成功学院信工系
张莉
data X Y data
segment ;数据段 db 'a',-5 db 2 dup(100),? db 'ABC' ends
成功学院信工系
张莉
4 字符串的输入输出方法
同字符的输入输出类似,字符串的输入输出也采用DOS
提供给用户的用于调用系统功能的21H号中断来实现。
通常按照如下4个步骤进行:
⑴ 在AH寄存器中设置系统功能调用号
⑵ 在指定寄存器中设置入口参数
⑶ 执行指令INT 21H(或ROM-BIOS的中断向量号)实现中 断服务程序的功能调用 ⑷ 根据出口参数分析功能调用执行情况
;注释
成功学院信工系
张莉
标识符
标识符(Identifier)一般最多由31个字母、数字及规定的
特殊符号(如 _、 @ 、$、?、%)组成,不能以数字开头。 默认情况下,汇编程序不区别标识符中的字母大小写
一个程序中,每个标识符的定义是唯一的,还不能是汇编
语言采用的保留字
o 伪硬指令助记符——例如:MOV、ADD o 指令助记符——例如:DB、EQU o 操作符——例如:OFFSET、PTR o 寄存器名——例如:AX、CS o 预定义符号——例如:@data
成功学院信工系
张莉
例2.50:输入字符串
buffer db 81
;定义缓冲区 ;第1个字节填入可能输入的最大字符数
db 0 ;存放实际输入的字符数 db 81 dup(0) ;存放输入的字符串 ... mov dx,seg buffer
(完整版)汇编语言中常用的伪指令档
汇编语言中常用的伪指令分类:软件相关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,且一般放在程序最后。
3.2 汇编语言程序设计伪指令
2012-2-29
单片机原理及其应用
11
7.2 算术运算程序的设计
+
DA A DA A DA A
图7.3 多位十进制加法算法
2012-2-29
单片机原理及其应用
12
7.2 算术运算程序的设计
例4 多位十进制减法 在第3章的例30中,我们介绍了2位十进制数减 法算法:X-Y=X+100-Y→ X+9AH-Y,把十进 制减法变换成二进制减法(求十进制减数的补码) 和十进制加法2步进行。多位十进制数减法也采用了 同样的算法。设被减数存放在20H开始的内部RAM 存储单元,减数存放在30H开始的存储单元,6位十 进制数减法的程序如下
15
7.2 算术运算程序的设计
例5 多字节数二进制乘法 2个多字节二进制数乘法的算法与按位进行十进 制数乘法相似。把它转换为几个多字节与单字节的 乘法运算,先分别计算出它们的部分积,然后按照 规则把部分积累加计算出乘积。 图7.4为2个16位二进制数相乘的算法原理图。 图中被乘数为X,其高八位和低八位分别存储在XH 和XL单元,乘数为Y,YH和YL分别高八位和低八位 存储单元。
2012-2-29
单片机原理及其应用
16
7.2 算术运算程序的设计
算法分2步进行:首先,分别用乘数的高八位和 低八位与被乘数相乘,计算部分积,分别存储在 (XYH3),(XYH2),(XYH1)和 (XYL3),(XYL2)(XYL1)单 元;在编写程序时,乘法运算可以用子程序调用的 方法实现(第3章例33)。第二步,采用加法运算求 出乘积存储在(XY4)(XY3)(XY2)(XY1)单 元。
第10节汇编程序常用伪指令简介PPT课件
初值表中每个数据一定是字量 (Word),一个字单元可用于存放任 何16位数据:
一个段地址 一个偏移地址 两个字符 0~65535之间的无符号数 -32768~+32767之间的带符号数
-
d第at3a章 segment ;数据段 count dw 8000h,?,'AB' maxint equ 64h number dw maxint array dw maxint dup(0) data ends
变量名 伪指令助记符 初值表
变量定义伪指令最常使用
汇编语言规定有DB、DW、DD、DF、DQ、 DT
-
第3章
变量定义伪指令助记符
➢变量定义伪指令根据申请的主存 空间单位分类
➢DB——定义字节伪指令 ➢DW——定义字伪指令 ➢DD——定义双字伪指令 ➢DF——定义3字伪指令 ➢DQ——定义4字伪指令 ➢DT——定义10字节伪指令
➢ STACK SEGMENT PARA STACK ;堆栈段开始
➢
DB 64 DUP(?)
;堆栈段空间为100个字节
➢ STACK ENDS
;堆栈段结束
➢ MYDATA SEGMENT PARA ‘STACK’ ;数据段开始
➢ NUM1 DB 2AH
;数据段放的数据
➢ NUM2 DB 78H
➢ PRODUPCT DW ?
➢
LISTB DW 100 DUP (432H1) ; 100字的目的缓冲区
➢ ESEG ENDS
;附加段结束
➢ CSEG SEGMENT
;代码段开始
➢
ASSUME CS:CSEG DS:DSEG;指明代码段、数据段段名
伪 指 令
<>
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、不要以为自己成功一次就可以了 ,也不 要以为 过去的 光荣可 以被永 远肯定 。
新版癫,我笑他人看不 穿。(名 言网) 32、我不想听失意者的哭泣,抱怨者 的牢骚 ,这是 羊群中 的瘟疫 ,我不 能被它 传染。 我要尽 量避免 绝望, 辛勤耕 耘,忍 受苦楚 。我一 试再试 ,争取 每天的 成功, 避免以 失败收 常在别 人停滞 不前时 ,我继 续拼搏 。
谢谢你的阅读
❖ 知识就是财富 ❖ 丰富你的人生
71、既然我已经踏上这条道路,那么,任何东西都不应妨碍我沿着这条路走下去。——康德 72、家庭成为快乐的种子在外也不致成为障碍物但在旅行之际却是夜间的伴侣。——西塞罗 73、坚持意志伟大的事业需要始终不渝的精神。——伏尔泰 74、路漫漫其修道远,吾将上下而求索。——屈原 75、内外相应,言行相称。——韩非
汇编程序结构及伪指令
END start
D:\masm>DEBUG hello.exe -U :查看代码段 129F:0000 FC CLD 129F:0001 B89D12 MOV AX , 129D 129F:0004 8ED8 MOV DS , AX 129F:0006 8D360000 LEA SI , [0000] 129F:000A B89E12 MOV AX , 129E 129F:000D 8EC0 MOV ES , AX 129F:000F BF0000 MOV DI , 0000 129F:0012 B90600 MOV CX , 0006 129F:0015 F3 REPZ 129F:0016 A4 MOVSB 129F:0017 B44C MOV AH , 4C 129F:0019 CD21 INT 21 、、、 -D 129d:0 l10 ;查看数据段1的内容 129D:0000 48 65 6C 6C 6F 21 00 00-00 00 00 00 00 00 00 00 Hello!.......... -D 129e:0 l10 ;查看数据段2的内容 129E:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 8
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 可以按字节访问内存单元 也可以按字访问内存单元
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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
成功学院信工系
张莉
定位伪指令
定位伪指令控制数据的偏移地址 ORG 参数 ORG伪指令是将当前偏移地址指针指向参数表达的 偏移地址: ORG 100h ;从100h处安排数据或程序 ORG $+10 ;使偏移地址加10,即跳过10个字节空间 MASM中,符号“$”表示当前偏移地址值
成功学院信工系
本课程采用微软宏汇编程序 MASM 6.11
成功学院信工系 张莉
标号是反映硬指令位置(逻辑地址)的标识符, 语句中由分号“;”开始的部分为注释内容,用以增加 源程序的可读性 后跟一个冒号分隔 必要时,一个语句行也可以由分号开始作为阶段性注释 名字是反映伪指令位置(逻辑地址)和属性的标识符, 处理器指令的操作数可以是 汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理 后跟空格或制表符分隔,没有一个冒号 立即数、寄存器和存储单元
成功学院信工系 张莉
字符串输入的功能调用
DOS功能调用INT 21H
关键要定义好缓冲区
功能号:AH=0AH 入口参数:DS:DX=缓冲区首地址
执行该功能调用时,用户按键,最后用回车确认
本调用可执行全部标准键盘编辑命令;用户按回车键
结束输入,如按Ctrl+Break或Ctrl+C则中止
成功学院信工系
张莉
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之间的带符号数
数和数值表达式;
汇编语言程序中,指令参数还有地址型,它的主要形式是标
号和名字(变量名、段名、过程名等)
成功学院信工系
张莉
(1) 常数
常数(常量)表示一个固定的数值 它又分成多种形式:
(1)十进制常数 (2)十六进制常数 (3)二进制常数
(4)八进制常数
(5)字符串常数 (6)符号常数
成功学院信工系
成功学院信工系
张莉
data segment ;数据段 count dw 8000h,?,'AB' maxint equ 64h number dw maxint array dw maxint dup(0) data ends
成功学院信工系
张莉
字变量和字常量的定义:
WNUM EQU 5678H COUNT DW 20H
取得名字或标号的段地址和偏移地址两个属性
[ ] 将括起的表达式作为存储器地址 $ 当前偏移地址 : 采用指定的段地址寄存器 OFFSET 名字/标号 返回名字或标号的偏移地址 SEG 名字/标号 返回名字或标号的段地址成功学院Leabharlann 工系张莉array
org $+10 加4个字节单元 db 45,45h .code mov ax,seg array mov ds,ax mov bx,offset array ;等价于 lea bx,array mov cl,array+4 ;等效于 mov cl,array[4] mov ax,es:[2000h]
张莉
例:显示字符串 .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
成功学院信工系
张莉
字符串输出的功能调用
DOS功能调用INT 21H 功能号:AH=09H 入口参数: DS:DX=欲显示字符串在主存中的首地址 字符串应以$(24H)结束 功能:在显示器输出指定的字符串 可以输出回车(0DH)和换行(0AH)字符产生 回车和换行的作用
成功学院信工系
第4讲 变量定义及常用伪指令
熟悉常数的分类及其正确的表示方法 了解表达式中涉及到的运算符的功能作用
掌握变量定义伪指令DB/DW/DD,理解变量在内存存
储空间中的分布
掌握OFFSET、SEG、PTR、$伪指令,了解其他常
用地址操作符和类型操作符
掌握字符串的输入输出方法
成功学院信工系
.code .startup mov ax,X add ax,Y add ax,Z mov W,ax .exit 0 end
成功学院信工系 张莉
定义双字单元伪指令DD
DD伪指令用于分配一个或多个双字单元,并可以将 它们初始化为指定值 初 值 表 中 每 个 数 据 是 一 个 32 位 的 双 字 量 ( Double Word): 可以是有符号或无符号的32位整数 也可以用来表达16位段地址(高位字)和16位的 偏移地址(低位字)的远指针 vardd farpoint DD 0,?,12345678h DD 00400078h
成功学院信工系
张莉
2 变量定义伪指令
变量定义(Define)伪指令为变量申请固定长度
的存储空间,并可同时将相应的存储单元初始化
变量名 伪指令助记符 初值表
变量定义伪指令最常使用
成功学院信工系
张莉
变量名
变量名为用户自定义标识符,表示初值表首元素的逻
辑地址;用这个符号表示地址,常称为符号地址
成功学院信工系
张莉
变量定义伪指令助记符
变量定义伪指令根据申请的主存空间单位分类
DB——定义字节伪指令
DW——定义字伪指令 DD——定义双字伪指令 DF——定义3字伪指令 DQ——定义4字伪指令
DT——定义10字节伪指令
还有定位伪指令
成功学院信工系
张莉
定义字节单元伪指令DB
成功学院信工系
张莉
第4讲 变量定义及常用伪指令
1 数值型参数 2 变量定义伪指令 3 变量和标号的属性 4 字符串的输入输出方法
成功学院信工系
张莉
1 数值型参数
在源程序语句格式的4个组成部分中,参数是指令的操作对
象(学习硬指令时被称为操作数),参数之间用逗号分隔
参数根据指令不同可以没有,可以有1个、2个或多个 汇编语言程序中,指令参数有数值型,它的主要形式是常
张莉
第4讲 变量定义及常用伪指令
硬指令和伪指令
硬指令——使CPU产生动作、并在程序执行时才处理的 语句,如mov、add等
伪指令(Directive)——不产生CPU动作、在程序执 行前由汇编程序处理的说明性语句,例如,数据说明、 变量定义等等 伪指令与具体的处理器类型无关,但与汇编程序的版本 有关
AX,[BX+SI+5678H] AX,[0010H] AX,COUNT[SI] AX,[SI+10H] BX,[0010H] BX,0010H
成功学院信工系 张莉
例题
设有3个字变量X,Y和Z,初值分别为5,6和7,试求出三 者之和,并存入字变量W中。
.model small .stack .data X dw 5 Y dw 6 Z dw 7 W dw ?
变量名可以没有。这种情况,汇编程序将直接为初值
表分配空间,无符号地址
设置变量名是为了方便存取它指示的存储单元
成功学院信工系
张莉
初值表
初值表是用逗号分隔的参数 主要由数值常数、表达式或?、DUP组成
?——表示初值不确定,即未赋初值; DUP——表示重复初值 DUP的格式为: 重复次数 DUP(重复参数)
DB伪指令用于分配一个或多个字节单元,并可以将它 们初始化为指定值 初值表中每个数据一定是字节量(Byte),存放一个 8位数据:
可以是0~255的无符号数 或是-128~+127带符号数 也可以是字符串常数
成功学院信工系
张莉
data X Y data
segment ;数据段 db 'a',-5 db 2 dup(100),? db 'ABC' ends
张莉
(2) 数值表达式
数值表达式一般是指由运算符连接的各种常数所构成的表
达式
汇编程序在汇编过程中计算表达式,最终得到一个数值
程序运行之前,就已经计算出了表达式;所以,程序运行