标识符和表达式

  标识符和表达式是程序设计经常用到的两个基本概念。在用高级语言进行程序设计时,如果程序要对某个变化的量进行处理时,通常都要对该变化量定义一个具有某种数据类型的符号名,用该符号名也就等于使用了该变化量。在汇编语言中,也是如此,所不同的是它们的说明和引用方式不同。

4.1 标识符

  在汇编语言中,标号、内存变量名、子程序名和宏名等都是标识符,它一般最多由31个字母、数字及规定的特殊字符(?、@、_、$)等组成,并且不能用数字开头。通常情况下,汇编语言不区分标识符中字母的大小写。

  和高级语言的变量名一样,一般要求标识符尽可能取得有点含义,这会大大改善程序的可读性,并有助于对程序的理解。但标识符不能是汇编语言的保留字,汇编语言的保留字主要是指:指令助忆符、伪指令定义符、寄存器名以及一些具有特殊含义的字符串等。

  例如:MSG1、ERRMSG2、ASC1、asc2等是合法的标识符,而1a、ah、mov等就不是合法的标识符。

  试比较ABCDH和0ABCDH之间的差异。前者是标识符,而后者是十六位进制数值。

4.2 简单内存变量的定义

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

  汇编语言中,常见的数据类型有字节、字和双字等。下面介绍如何定义各种整型类型的内存变量,有关浮点类型变量的定义方式将在第11章中介绍

4.2.1 内存变量定义的一般形式

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

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

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

    1、变量名必须是一个合法的标识符,它可以写,也可以不写;
    2、 数据定义符用于确定内存单元的数据类型,常用的定义符有:DB、DW和DD等;
    3、 表达式是定义内存单元时的初值表达式,一个定义语句可以有多个初值表达式,各表达式之间必须用逗号‘,’分开;如果某个存储单元没有初值表达式,则必须用一个问号‘?’来表示;
    4、 在定义语句的后面可以书写注释内容,也可以不写。

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

4.2.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的十六进制编码。

图4.1 内存单元的分配情况示意图

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

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

    MSG1 DB 'I am a student.'

  该说明语句所对应的存储单元分布如下所示。为了看起来方便,并没有用字符的ASCII码来存放在相应的存储单元内,而直接用该字符,请不要引起误解。

'I' ' ' 'a' 'm' ' ' 'a' ' ' 's' 't' 'u' 'd' 'e' 'n' 't'

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

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

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

4.2.3 字变量

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

  例如:

    Word1 DW 89H, 1909H, -1
        DW 0abcdH, ?, 0

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

89 00 09 19 FF FF CD AB -- -- 00 00

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

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

    B1 DB 'AB'

    W1 DW 'AB'

41h 42h 42h 41h

4.2.4 双字变量

  定义双字变量的定义符为DD/DWORD(Define Doubleword),每个双字变量占用二个连续的字单元(四个字节)。

    DW1 DD 12345678H, ?
    DW2 DD 0abcd1243H

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

78 56 34 12 -- -- -- -- 43 12 CD AB

4.2.5 六字节变量
  定义六字节变量的定义符为DF/FWORD(Define Farword)。顾名思义,每个六字节变量占用六个连续的字节。

    DF1  DF 1234567890abH, -1
        DF 1abcd23H

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

abH 90H 78H 56H 34H 12H 0FFH 0FFH 0FFH 0FFH 0FFH 0FFH 23hH 0cdH 0abH 01H 00H 00H

(占6个字节)

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

    DQ1 DQ 12345678H, 0H, -1234H
       DQ ?, 1238H, ?

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

78

56 34 12 00 00 00 00

(占8个字节)

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

    DT1 DT 12345678H, 0H, -1234H
    DT2 DT ?, -1H

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

78

56 34 12 00 00 00 00 00 00

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

转载于:https://www.cnblogs.com/little-kwy/p/9744292.html

汇编语言从入门到精通-4标识符和表达式相关推荐

  1. Java从入门到精通十四(Lambda表达式)

    Java从入门到精通十四(Lambda表达式) Lambda的引入体验 实例一(抽象方法无参无返回值) 实例二(抽线方法有参无返回值) 实例三(抽象方法带参带返回值) lambda的表达式的简化操作 ...

  2. 汇编语言程序教程:从入门到精通!

    汇编语言程序教程:从入门到精通! 作者:zzmdl0297140  来源:不祥  发布时间:2006-2-13 下午 10:54:59  发布人:941xz <script language=& ...

  3. 《Visual C++ 开发从入门到精通》——2.5 标识符

    本节书摘来自异步社区出版社<Visual C++ 开发从入门到精通>一书中的第2章,第2.5节,作者: 王东华 , 李樱,更多章节内容可以访问云栖社区"异步社区"公众号 ...

  4. C 语言从入门到精通教程(2021 )

    C 语言从入门到精通教程(2021年) 文章目录 计算机常识 什么是计算机程序 ? 什么是计算机语言 ? 常见的计算机语言类型有哪些 ? 什么是C语言? C语言历史 C语言标准 C语言现状 为什么要学 ...

  5. 《Visual C++ 开发从入门到精通》——2.7 变量

    本节书摘来自异步社区出版社<Visual C++ 开发从入门到精通>一书中的第2章,第2.7节,作者: 王东华 , 李樱,更多章节内容可以访问云栖社区"异步社区"公众号 ...

  6. 爬虫入门到精通-HTTP协议的讲解

    HTTP协议的讲解 本文章属于爬虫入门到精通系统教程第三讲 什么是HTTP协议? 引用自维基百科 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是互联网 ...

  7. 【PHP】最详细PHP从入门到精通(二)——PHP中的函数

     PHP从入门到精通 之PHP中的函数 各位开发者朋友大家好,自上次更新PHP的相关知识,得到了大家的广泛支持.PHP的火爆程度不言而喻,函数作为PHP中极为重要的部分,应诸位的支持,博主继续跟进更新 ...

  8. php flock 都是true_PHP从入门到精通(三)PHP语言基础

    PHP从入门到精通(三)PHP语言基础 一.PHP标记风格 PHP支持4种标记风格 1.XML风格.(推荐使用) <?phpecho "这是XML分割的标记"; ?> ...

  9. 《C++ 开发从入门到精通》——第2章 C++的重要特质分析2.1 什么是面向对象(object-oriented)...

    本节书摘来自异步社区出版社<C++ 开发从入门到精通>一书中的第2章,第2.1节,作者: 王石磊 , 韩海玲,更多章节内容可以访问云栖社区"异步社区"公众号查看. 第2 ...

最新文章

  1. QEMU-KVM自己主动创建虚拟机,以指定IP构造
  2. JAVA计算应缴住房基金,事业单位的住房基金如何核算?
  3. Python 的列表的一些方法
  4. SpringBoot中通过重写WebMvcConfigurer的addCorsMapping方法实现后台服务解决跨域问题
  5. python flask服务_在python中Flask配置服务
  6. 几种HtmlEncode的区别(转)
  7. 自定义异常禁用异常堆栈_如何在Mac上禁用或自定义自动更正
  8. axure元件库 文件上传_手把手教你打造一套属于产品经理自己的元件库
  9. python的属性访问,python:如何访问函数的属性
  10. python3----练习题(弹幕跟随)
  11. html 折叠焦点图切换,jQuery层叠式图片切换焦点图插件
  12. 微软推补丁服务器,[图]微软再推稳定性补丁 为即将到来功能更新做准备
  13. 傲梅分区助手克隆Linux硬盘,傲梅分区助手复制磁盘或克隆磁盘到另外磁盘
  14. canvas书写图片并修改尺寸
  15. GPU并行运算与CUDA编程--基础篇
  16. 用Python验证指数基金定投策略
  17. 华三交换机开机dhcp snooping
  18. 计算机辅助地理教学的内容,信息技术辅助地理教学
  19. 文字细化算法matlab,细化算法matlab
  20. 如何做好电脑重要文件数据的备份

热门文章

  1. iOS 正则表达式判断UITextField是否为全汉字,全字母,全数字,数字和字母
  2. windows下修改mysql密码 10054错误
  3. Flask对请求的处理
  4. mp4无法用于直播流
  5. perl xml dom中文乱码问题解决
  6. VC 为静态控件添加事件
  7. 分布式设计与开发(一)------宏观概述
  8. ubuntu20.04 黑屏 进入不了图形界面 dev/sda1: clean
  9. 安装fastdfs出现/usr/local/lib/libfastcommon.so: undefined reference to `fcntl64@GLIBC_2.28‘
  10. django-allauth定制模板(转载)