【汇编语言】 变量

汇编语言 变量

在这里插入图片描述

一、变量的概念

变量实质上是主存单元的数据,因而可以改变 变量需要事先定义 (Define) 才能使用,并具有属性,方便应用

  • 随程序运行会发生变化的数据
  • 保存在可读可写的主存空间
  • 变量的实质是主存单元的数据,因而可以改变
  • 变量需要事先定义才能使用
  • 变量具有属性方便应用
  • 变量表达主存数据,即存储器操作数

二、变量的定义

变量定义伪指令是最常使用的汇编语言说明性语句,它的汇编语言格式为:

变量名 变量定义伪指令 参数,参数…(初值表) 

变量定义之后 :

  • ►分配了存储空间
  • ►赋予了初值(也可以没有初值)
  • ►创建了变量名 (可以获知变量的地址和类型)

(1)变量名

变量名即汇编语句名字部分,是用户自定义的标识符,表示初值表首个数据的逻辑地址。汇编语言使用这个符号表示地址,故有时被称为符号地址。变量名可以省略,在这种情况下,汇编程序将直接为初值表分配空间,没有符号地址
设置变量名是为了方便存取它指示的存储单元

  • 变量名是用户标识符,表示首元素逻辑地址

(2)变量定义伪指令

伪指令助记符:byte、word、dword…,表示变量类型

助记符变量类型变量定义功能
BYTE字节分配1个或多个字节单元;每个数据是字节量,也可以是字符串常量,字节量表示8位无符号数或有符号数、字符的 ASCII 码值
WORD分配1个或多个字单元;每个数据是字量、16 位数据,字量表示 16 无符号数或有符号数、 16 位段选择器、 16 位偏移地址
DWORD双字分配1个或多个双字单元 ;每个数据是双字量 32 位数据,双字量表示 32 位无符号数或有符号数、32 位段基地址、32 位偏移地址
FWORD3个字分配1个或多个6字节单元,6字节变常表示含 16 位段选择器和 32 位偏移地址的 48 位指针地址
QWORD4个字分配一个或多个8字节字单元,8字节量表示 64 位数据
TBYTE10个字分配一个或多个十字节字单元,表示 BCD 码、 10字节数据(用于浮点运算)
1.助记符:BYTE

变量类型:字节

  • 8位变量定义,使用byte伪指令
    ►每个数据是一个字节量,占用一个存储单元

  • 字符(串)变量定义也使用byte伪指令
    ►每个字符是一个8位ASCII码

  • 变量定义的参数不区别有无符号
    ►可以是无符号数,也可以是有符号数

  • 分配一个或多个字节单元每个数据是8位字节量:

    8位无符号整数:0~255
    8位补码表示的有符号整数:-128~+127
    一个字符(ASCII码值)
    压缩BCD码:0~99
    非压缩BCD码:0~9

  • BYTE伪指令定义的每个数据都是8位、1个字节

      msg byte 'Hello',13,10,0 
      const1 byte 100,64h,'d' 
      const6 byte 4*4,34h+34
    
2.助记符:WORD

变量类型:字

  • 16位变量定义,使用word伪指令
    ►每个数据是一个字量,占用2个存储单元

  • 变量定义的参数不区别有无符号
    ►可以是无符号数,也可以是有符号数

  • 分配一个或多个字单元每个数据是16位、字量

16位无符号整数:0~65535
16位补码表示的有符号整数:-32768~+32767
16位段地址
16位偏移地址

  • WORD伪指令定义的每个数据都是16位、2个字节

      wvar1 word 0,-32768,65535 
      wvar2 word ? 
      minint = 10 
      wvar3 word 5 dup(minint)
    
3.助记符:DWORD

变量类型:双字

  • 32位变量定义,使用dword伪指令
    ►每个数据是一个双字量,占用4个存储单元

  • 变量定义的参数不区别有无符号
    ►可以是无符号数,也可以是有符号数

  • 分配一个或多个双字单元每个数据是32位双字量

    32位无符号整数:0~232-1
    32位补码表示的有符号整数:-231 ~ +231-1
    32位逻辑地址(含16位段地址和16位偏移地址)

      dvar1 dword 0,80000000h,0ffffffffh 
      dvar2 dword ? 
      array dword 5 dup(0)
    

(3)初值表

初值表是用逗号分隔的一个或多个参数,表示变量初值

  • 变量定义的初值表

    • 变量定义是申请存储空间

      • 同时还可以进行存储单元初始化
      • 即用初值表赋予变量初值
    • 初值表可以有一个或多个参数,多个参数用逗号分隔

      • 各种形式的常量
      • 使用“?”表示初值不确定,即未赋初值
      • 使用复制操作符DUP表示多个同样数值
        • 复制操作符格式:

           重复次数  DUP  (重复参数)
          
        • 复制操作符举例
          在这里插入图片描述

          word 5 dup(10,?)
          

三、多字节数据的存储顺序

(1)字节编址的主存储器

  • 最小的存储单位:二进制位(比特位bit)

  • 最常用的存储单位:字节(Byte)

  • 8个二进制位是一个字节

    • 一个存储单元保存一个字节量数据
    • 一个存储单元对应一个存储器地址

(2)数据的存储顺序

  • 变量保存于字节编址的主存储器中
  • 每个存储单元保存一个8位、字节量数据
  • 多个字节数据顺序逐个存放在主存相邻单元

(3)小端存储和大端存储

  • 小端方式(Little Endian)

    • 高字节数据保存在高地址存储单元
    • 低字节数据保存在低地址存储单元
  • 大端方式(Big Endian)

    • 高字节数据保存在低地址存储单元
    • 低字节数据保存在高地址存储单元

四、变量的定位

(1)变量(代码)的存储位置

  • 变量定义的数据按照定义的先后顺序一个接着一个分配存储空间
  • 指令代码也由汇编程序按照语句的书写顺序逐个单元安排存储空间

(2)定位伪指令

定位伪指令可以控制存放的存储器地址

  • ORG伪指令控制存放的偏移地址

    org 参数 ;从“参数”指定的位置存放
    
  • ALIGN伪指令控制数据对齐地址边界

     align N ;按对齐N字节地址边界的位置存放
    

(3)多字节数据对齐地址边界获得更高的性能

地址A对齐N字节边界A mod N=0(能够被N整除的地址)

  • 2字节、16位数据是被2整除的地址(偶地址)
  • 4字节、32位数据是被4整除的地址(模4地址)
  • 8字节、64位数据是被8整除的地址(模8地址)

五、变量属性

(1)变量的地址属性

变量的地址属性指所在存储单元的逻辑地址,含有段基地址和偏移地址

  • 地址操作符

    通过地址操作符获得变量的地址属性值

    • [ ]括起的表达式作为存储器地址指针
    • $ 返回当前偏移地址
    • OFFSET 变量名 返回变量名所在段的偏移地址
    • SEG 变量名 返回段基地址(实地址存储模型)
  • 变量地址属性程序

    • 数据段使用变量名,代表其偏移地址

      00000020 5678		wvar word 5678h 
      =00000016 			arr_size = $-array
      ;计算出当前到ARRAY变量所占存储空间
      =0000000B 			arr_len = arr_size/2 
      ;(除以类型值)计算出变量个数
      00000022 9ABCDEF0	dvar dword 9abcdef0h
      
    • 代码段使用变量名,代表其首个数据(变量值)

      00000000 A0 00000000 R
      mov al, bvar
      ;bvar等同于[bvar]
      
    • 变量名加减常量,指向首个数据的前后单元

      00000005 8A 25 00000001 R
      mov ah, bvar+1
      
    • 变量名[n] = 变量名+n,常量n表示n个存储单元
      指向首个数据的前后单元

      0000000B 66|8B 1D 00000022 R
      mov bx, wvar[2]
      

(2)变量的类型属性

变量的类型属性表示变量定义的数据单位

  • 类型操作符

    通过类型操作符获得变量的类型属性值

    • 类型名 PTR 变量名 将变量名按照指定的类型使用
      mov eax, dword ptr array;以双字类型访问
      
    • TYPE 变量名 返回占用字节空间的字量数值
      mov ebx, type bvar
      ;获得字节变量类型值
      mov ecx, type wvar
      ;获得字变量类型值
      mov edx, type dvar
      ;获得双字变量类型值
      
    • LENGTHOF 变量名 返回整个变量的数据项数
      mov esi, lengthof array
      ;获得变量的数据个数(项数)
      
    • SIZEOF 变量名 返回整个变量占用的字节数
      mov edi, sizeof array
      ;获得变量所占的存储空间个数
      
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BkbK-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值