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

合集下载

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

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

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

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

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

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

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

变量定义的格式如下所示:变量名数据类型初始值其中,变量名是标识符,用来表示变量的名称;数据类型是变量的类型,包括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(汇编语言源程序的结构、语句格式、伪指令)
如 Start : MOV AX, data JMP/CALL Start
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汇编伪指令

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为止,执行下一条指令.。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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) 数值表达式
数值表达式一般是指由运算符连接的各种常数所构成的表
达式
汇编程序在汇编过程中计算表达式,最终得到一个数值
程序运行之前,就已经计算出了表达式;所以,程序运行
相关文档
最新文档