zoukankan      html  css  js  c++  java
  • 汇编语言--标识符和表达式(四)(简单内存变量的定义)

    四、标识符和表达式

    1、标识符

    在汇编语言中,标号、内存变量名、子程序名和宏名等都是标识符,它一般最多由31个字母、数字及规定的特殊字符(?、@、_、$)等组成,并且不能用数字开头。通常情况下,汇编语言不区分标识符中字母的大小写。标识符不能是汇编语言的保留字,汇编语言的保留字主要是指:指令助忆符、伪指令定义符、寄存器名以及一些具有特殊含义的字符串等。

    例如:MSG1、ERRMSG2、ASC1、asc2等是合法的标识符,而1a、ah、mov等就不是合法的标识符。试比较ABCDH和0ABCDH之间的差异。前者是标识符,而后者是十六位进制数值。

    2、简单内存变量的定义

    在编程序时,我们往往要根据程序的需要定义一些内存单元。在高级语言程序中,要给存储单元取一个符号名,然后通过引用该符号名来访问其所对应的存储单元,而在汇编语言程序中要灵活一些,它可以给存储单元取符号名,也可以不取符号名。当给存储单元取符号名时,则可通过该符号名来访问其对应的存储单元;当不给存储单元取符号名时,则可通过存储单元的偏移量(有效地址)来访问它。

    (1)内存变量定义的一般形式

    定义数据变量语句是在程序中经常使用的伪指令语句,其一般格式如下:

    [变量名]  数据定义符  表达式1[, 表达式2, …, 表达式n] ;注释

    该定义格式的主要解释如下:

    1) 变量名必须是一个合法的标识符,它可以写,也可以不写;

    2) 数据定义符用于确定内存单元的数据类型,常用的定义符有:DB、DW和DD等;

    3) 表达式是定义内存单元时的初值表达式,一个定义语句可以有多个初值表达式,各表达式之间必须用逗号‘,’分开;如果某个存储单元没有初值表达式,则必须用一个问号‘?’来表示;

    4) 在定义语句的后面可以书写注释内容,也可以不写。

    在定义变量时,虽然可以不写变量名,但我们建议还是要写,因为不写变量名,就意味着只能用内存单元的偏移量来访问它。这时,一旦内存单元的偏移量发生变化,那么,程序中的所有引用都要修改,这不仅增加了程序维护的工作量,而且也容易因遗漏修改而出错。

    (2)字节变量

    定义字节变量的定义符为DB/BYTE(Define Byte),每个字节只占一个字节单元。其中:BYTE是MASM 6.0及其以后版本的数据类型说明符,随后的其它类型说明符同此说明。

    例如:

    COUNTER DB 6

    DB 'A', 'D', 0Dh, '$'

    TABLE DB 1, 3, 5, 7, 9, 11

    上面的定义语句经汇编后所产生出的内存单元分配情况如图4.1所示。图中的数据是用十六进制表示的(以后也如此,不再说明),由引号括起来的字符在内存中是存放其ASCII码值。所以,'D'和0Dh是不同的,前者是字符'D',后者是数值12的十六进制编码。

    clip_image002

    注意:在上例中,说明语句“DB 'A', 'D', 0Dh, '$'”之前并没有给出变量名,但我们可以从前面的变量名COUNTER一直往后数,或从TABLE往前数,来访问某存储单元,因为它们是一片连续的存储单元,这和高级语言的变量定义有点区别的。在高级语言中,我们一定要用某个标识符来说明变量,也必须用该变量名来访问其所对应的存储单元。

    用定义符DB还可定义一种特殊的数据形式——字符串。在定义字符串时,必须用成对的单引号或双引号把所要的字符括起来,括号内字符的ASCII码将依次存放在相应的字节单元内。例如:

    MSG1 DB 'I am a student.'

    该说明语句所对应的存储单元分布如下所示。为了看起来方便,并没有用字符的ASCII码来存放在相应的存储单元内,而直接用该字符,请不要引起误解。(字符串内存分配和上图一样会转化成ASCII值)

    clip_image004

    上面的例子也可改写为另一种等价的语句:

    MSG1 DB 'I', ' ', 'a', 'm', ' ', 'a', ' ', 's', 't', 'u', 'd', 'e', 'n', 't', '.'

    显然,前者的说明要比后者方便得多,所以,在程序中都采用前者的书写方式。

    (3)字变量

    定义字变量的定义符为DW/WORD(Define Word),每个字占用两个连续的字节单元。

    例如:

    Word1 DW 89H, 1909H, -1

    DW 0abcdH, ?, 0

    上述定义的内存分配如下所示。

    clip_image006

    由于字变量的数据是按照“高高低低”的原则存于存储单元之中的,而字节数据是按照排列顺序存于存储单元中的,所以,它们的存储方式有所不同。

    试比较下面两个定义的存储顺序,其中:41H和42H分别是'A'和'B'的ASCII码。

    B1 DB 'AB' (字节变量连续存储)

    W1 DW 'AB' (字变量占两个字节,按高高低低存储)

    clip_image008

    (4)双字变量

    定义双字变量的定义符为DD/DWORD(Define Doubleword),每个双字变量占用二个连续的字单元(四个字节)(按高高低低原则存储,注意内存地址是由小到大)。

    DW1 DD 12345678H, ?

    DW2 DD 0abcd1243H

    上述定义的内存分配如下所示。

    clip_image010

    (5)六字节变量

    定义六字节变量的定义符为DF/FWORD(Define Farword)。顾名思义,每个六字节变量占用六个连续的字节。(不够高位用0补足)

    DF1 DF 1234567890abH, -1

    DF 1abcd23H

    上述定义的内存分配如下所示。

    clip_image012

    (6)八字节变量

    定义八字节变量的定义符为DQ/QWORD(Define Quadword)。同理,每个八字节变量占用八个连续的字节。

    DQ1 DQ 12345678H, 0H, -1234H

    DQ ?, 1238H, ?

    第一个八字节常量12345678H在内存中的分配方式如下所示,其存储原则与前面相同。其它八字节常量的存储方式与此一致。

    clip_image014

    (7)十字节变量

    定义十字节变量的定义符为DT/TBYTE(Define Tenbytes)。同理,每个十字节变量占用十个连续的字节。

    DT1 DT 12345678H, 0H, -1234H

    DT2 DT ?, -1H

    第一个十字节常量12345678H在内存中的分配方式如下所示,它同样按“高高低低”的原则来存储。其它十字节常量的存储方式与此一致。

    clip_image016

    以上六个数据类型是汇编语言中最基本的数据类型,其中,前三个是在程序中经常使用的,后三个的使用频率不太高。

  • 相关阅读:
    Marshal's Confusion III(快速幂)
    两种筛素数的方法
    B
    HDU 1563 【Find your present!】
    HDU 2044【一只小蜜蜂】
    HDU 2153 仙人球的残影
    NYOJ 49 【开心的小明】
    最小的回文数
    Google Code Jam 2014资格赛【Problem A. Magic Trick】
    携程编程大赛 (预赛第二场)第一题【剪刀石头布】
  • 原文地址:https://www.cnblogs.com/CIreland/p/9785529.html
Copyright © 2011-2022 走看看