目录
数据表示
常量的表达
常数
字符和字符串
符号常量
数值表达式
数据表达程序:
变量定义
变量定义结构:
变量定义伪指令:
变量定义的初值表
总结:
字节变量程序一(8位 byte):
字节变量程序二(16位 word):
字节变量程序三(32位 dword):
变量的应用
多字节变量存储顺序
变量属性
常量是汇编程序中使用的一个确定的数值
汇编语言支持多种常量的表达形式:
十、十六和二进制表达的数值
以后缀字母(D,H和B)来进行区分,十进制可不加
注:以字母A-F开头的十六进制常数,要加前导0
以便于区分以字母开头的标识符
例如:“AH”是指寄存器
“0AH”是指十六进制常数
单个字符或多个字符用单引号或双引号括起来即可
每个字符的数值使对应的ASCII值
使用一个标识符来表达一个数值
符号名 = 数值表达式
符号名 equ 数值表达式
符号名 equ <字符串>
用运算符连接各种常量构成的算式
常用的运算符:+(加) -(减) *(乘) /(除)
数值用作地址,数值表达式就成为地址表达式
地址表达式只能使用加减
地址移动的表示:
地址 ± 常量
;eg0201.asm
include io32.inc
.data
const1 byte 100,100d,01100100b,64h, 'd'
const2 byte 1,+127,128,-128,255,-1
const3 byte 105,-105,32,-32,32h,-32h
const4 byte '0123456789', 'abcxyz', 'ABCXYZ'
crlf byte 0dh,0ah,0
minint = 10
maxint equ 0ffh
const5 byte minint,minint+5,maxint-5,maxint-minint
const6 byte 4*4,34h+34,67h-52h,52h-67h
.code
start:
mov eax,offset const4
call dispmsg
exit 0
end start
byte : 字节变量定义伪指令(8位)
这里我们主要分析的是数据段,这是运行结果:输出的是常量const4的值
变量:
随程序运行会发生变化的数据
保存在可读可写的主存空间
注:变量必须事先定义才可使用
注:汇编语言的基本单位是以字节位存储单元
一个字 = 两个字节
变量的定义需要申请存储空间
同时用初值表赋予变量初值
初值表可以有一个或多个参数,多个参数用逗号隔开
各种形式的常量
使用 “?” 表示初值不定
使用复制操作符DUP表示多个同样的数值
复制操作符格式: 重复次数 DUP(重复参数)
列如:2 DUP(20h)
;eg0202.asm
include io32.inc
.data
minint = 10
bvar1 byte 0,128,255,-128,0,+127
bvar2 byte 1,-1,38,-38,38h,-38h
bvar3 byte ?
bvar4 byte 5 dup ('$')
bvar5 byte minint dup(0),minint dup(minint,?)
byte 2 dup(2,3,2 dup(4))
.code
start:
exit 0
end start
分析:
下面我们直观的感受一下这些变量在主存中的具体形式
8位变量定义,使用byte伪指令
每个数据是一个字节量,占用1个存储单元
可以是无符号数,也可以是有符号数
;eg0203.asm
include io32.inc
.data
minint = 10
wvar1 word 0,32768,65535,-32768,0,+32767
wvar2 word 1,-1,38,-38,38h,-38h
wvar3 word ?
wvar4 word 2010h,1020h
word 5 dup(minint,?)
wvar6 word 3139h,3832h
bvar6 byte 39h,31h,32h,38h
byte 0
.code
start:
mov eax,offset wvar6
call dispmsg
exit 0
end start
分析同上8位自己变量程序;
我们主要来看一下他们在主存中的表现
16位变量定义,使用word伪指令
每个数据是一个字量,占用2个存储单元
可以是无符号数,也可以是有符号数
;eg0204.asm
include io32.inc
.data
minint = 10
dvar1 dword 0,80000000h,0ffffffffh,-80000000h,0,7fffffffh
dvar2 dword 1,-1,38,-38,38h,-38h
dvar3 dword ?
dword 2010h,1020h
dvar5 dword minint dup(minint,?)
dvar6 dword 38323139h
bvar6 byte 39h,31h,32h,38h
byte 0
.code
start:
mov eax,offset dvar6
call dispmsg
exit 0
end start
同样,我们来看一下主存中的表现
32位变量定义,使用dword伪指令
每个数据是一个双字量,占用4个存储单元
可以是无符号数,也可以是有符号数
变量保存与字节编址的主存储器中
- 一个存储单元保存一个字节量数据
- 一个存储单元对应一个存储器地址
小端方式
大端方式
我们现在用的处理器80x86它采用的是小端方式
1、地址属性:首个字节变量所在存储单元的逻辑地址
含有段基地址和偏移地址
可以通过地址操作符来获得变量的地址属性
变量地址属性程序
;eg0206.asm
include io32.inc
.data
bvar byte 12h,34h
org $+10
array word 1,2,3,4,5,6,7,8,9,10
wvar word 5678h
arr_size = $-array
arr_len = arr_size/2
dvar dword 9abcdef0h
.code
start:
mov al,bvar
mov ah,bvar+1
mov bx,wvar[2]
mov ecx,arr_len
mov edx,$
mov esi,offset dvar
mov edi,[esi]
mov ebp,dvar
call disprd
exit 0
end start
org 参数 指定下一条汇编语句的位置
分析:
运行结果:
2、类型属性:变量定义的数据单位
通过类型操作符获得变量的类型属性值
类型操作符使用变量名的类型属性
变量类型属性程序
;eg0207.asm
include io32.inc
.data
bvar byte 12h,34h
org $+10
array word 1,2,3,4,5,6,7,8,9,10
wvar word 5678h
arr_size = $-array
arr_len = arr_size/2
dvar dword 9abcdef0h
.code
start:
mov eax,dword ptr array
mov ebx,type bvar
mov ecx,type wvar
mov edx,type dvar
mov esi,lengthof array
mov edi,sizeof array
mov ebp,arr_size
call disprd
exit 0
end start
分析
数据段和前面一样,我们就不做分析了
重点来看代码段
运行结果: