• 08、汇编语言--变量


    变量

    程序运行中有很多变化的结果,需要在可读和可写的主存开辟存储空间,这就是变量(Variable)。

    变量的定义

    变量的定义是给变量申请固定长度的存储空间,然后进行相应的存储单元初始化。

    变量定义伪指令

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

    变量名 变量定义伪指令 初值表

    变量名表示初值表首个数据的逻辑地址,汇编语言使用这个符号表示地址,当变量名不存在的情况下,汇编程序将直接为初值表分配空间,无符号地址。

    初值表是用逗号分隔的参数,由各种形式的常量和特殊的符号“?”、“DUP”组成。

    其中“?”表示未赋初值,如果多个存储单元的初值相同,可以用复制操作符DUP说明。

    重复次数 dup(重复参数)

    变量定义伪指令有DB、DW、DD、DF、DQ和DT。

    汇编语言还支持复杂的数据变量,例如结构(Structure)、记录(Record)、联合(Union)等。

    字节量数据

    用DB定义的变量是字节(BYTE)类型的,占8位,对应无符号整数0 ~ 255(C & C++的char类型)。

    .model small
    .stack
    .data   ; 数据段
        minint = 10
        bvar1 db 0,128,255,-128,0,+127
        bvar2 db 1,-1,38,-38,38h,-38h
        bvar3 db ?	;无初始值,一般用0填充存储空间
        bvar4 db 5 dup('$')
        bvar5 db minint dup(0),minint dup(minint,?)
        db 2 dup(2,3,2 dup(4))
    .code   ;代码段
    .startup
    .exit
    end
    

    通过DUP操作符为BVAR4定义了5个相同的数据,DUP操作符可以嵌套,像最后一个无变量名的变量初值依次是:02 03 04 04 02 03 04 04。

    db 2 dup(2,3,2 dup(4))
    

    字量数据

    用DW定义的变量是16位、字量(Word-sized)数据(对应C、C++语言的short类型)。

    8086逻辑地址的段地址和偏移地址都是16位的,可以用16位变量保存。

    .model small
    .stack
    .data   ; 数据段
        minint = 10
        wvar1 dw 0,32768,65535,-32768,0+32767
        wvar2 dw 1,-1,38,-38,38h,-38h
        wvar3 dw ?
        wvar4 dw 2010h,1020h
              dw 5 dup(minint,?)
        wvar6 dw 3139h,3832h
        bvar6 db 39h,31h,32h,38h
              db '$'
    .code
    .startup;代码段
        mov dx,offset wvar6 ;从wvar6开始显示
        mov ah,09h
        int 21h
    .exit
    end
    

    低字节存放在低地址存储单元、高字节存放在高地址存储单元称为小端模式。(80x86系列处理器)

    低字节存放在高地址、高字节存放在低地址称为大端模式

    小端模式:低位在前,高位在后。

    wvar6是字量数据,占16位,相当于两个字节量数据就是3139H和3832H。

    bvar6是字节量数据,占8位,相当于一个字节量数据就是39H,31H,32H,38H。

    双字量数据

    用DD定义的变量是32位、双字量(Doubleword-Sized)数据(对应C、C++语言的long类型),占用4个连续的字节空间,采用小端方式存放。

    .model small
    .stack
    .data 
    	miint   =   10
        dvar1   dd 0,80000000h, 0ffffffffh, -80000000h, 0, 7fffffffh
        dvar2   dd 1, -1, 38, -38, -38h
        dvar3   dd ?
                dd 2010h, 1020h
        dvar5   dd miint dup(miint, ?)
        dvar6   dd 38323139h
        bvar6   dd 39h, 31h, 32h, 38h
        db  '$'
        
    .code
    .startup
    	mov dx,offset dvar6	;指定字符串在数据段的偏移地址
    	mov ah,9			;AH赋值9
    	int 21h				;利用功能调用显示信息
    .exit
    end
    

    8086 处理器采用“低对低、高对高”的小端方式,如果从偏移地址 0090H 开始连续 4个存储单元的内容依次是39H、31H、32H、38H。

    变量定位

    变量定义的存储空间是按照书写的先后顺序一个接一个分配的。而定位伪指令可以控制其存放的偏移地址。

    ORG伪指令

    ORG伪指令将参数表达的偏移地址作为当前偏移地址,格式是:

    org 参数

    ALIGN伪指令

    以字节为存储单位的主存储器来说,多字节数据不仅存在按小端或大端方式存放问题,还存在是否对齐地址边界问题。

    对N个字节的数据(N=2,4,8,16,……),如果起始于能够被N整除的存储器地址位置(也称为模N地址)存放,则对齐地址边界。

    为了获得更好的性能,常要进行地址边界对齐。ALIGN伪指令便是用于此目的,其格式如下:

    align n

    N是对齐的地址边界值,取2的乘方(2,4,8,16,…)。

    ;数据段
    org	100h
    bvar1	db	100	
    	    align 2
    wvar2	dw	100	
            even
    dvar3	dd	?
    

    变量的属性

    变量定义除分配存储空间和赋初值外,还可以创建变量名。这个变量名一经定义便具有两类属性:

    (1)地址属性——指首个变量所在存储单元的逻辑地址,含有段基地址和偏移地址。

    (2)类型属性——指变量定义的数据单位,有字节量、字量、双字量、3 字量、4 字量和10字节量,依次用类型名BYTE、WORD、DWORD、FWORD、QWORD和TBYTE表示。

    在汇编语言程序设计中,经常会用到变量名的属性,汇编程序提供有关的操作符,以方便获取这些属性值:

  • 相关阅读:
    AGC041
    二分图 学习笔记
    区间DP 学习笔记
    3月21日考试 题解(数据结构+区间DP+贪心)
    Tarjan 做题总结
    3月15日考试 题解(数学+背包+线段树)
    差分约束 学习笔记
    Tarjan算法 学习笔记
    拓扑排序 学习笔记
    并查集 学习笔记
  • 原文地址:https://www.cnblogs.com/pengjingya/p/15022481.html
Copyright © 2020-2023  润新知