• 周五. 12月 2nd, 2022

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

08、汇编语言–变量

admin

11月 28, 2021

变量

程序运行中有很多变化的结果,需要在可读和可写的主存开辟存储空间,这就是变量(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

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

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

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

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表示。

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注