变量,初值与赋值
- 变量是变化的量:全局变量和局部变量。
- C的字符串常量在汇编语言中是全局变量:格式串
- 变量的初值为常量或常量表达式.
- 汇编语言与C一样在赋初值时不进行类型检查。也就是有符号数与无符号数可互相赋值,real4与dd,real8与double等也可以互相赋值。
- 全局变量赋初值:是由编译器在指定数据段在本变量偏移位置-即地址处,放置了转换成相应编码的二进制数。
- 局部变量赋初值:局部变量定义时不能赋初值,必须由执行硬指令来赋初值.
- 全局变量在数据段或附加段,在程序整个执行期间都占有固定的空间.程序退出后释放.
- 局部变量在堆栈段,程序开始执行时并不存在其空间或初值,在程序运行进入子程序后,通过机器指令/硬指令动态地分配空间、赋初值,子程序结束返回主程序前,再动态释放其占有空间。
- 全局变量的地址是一个固定的常数,可以用OFFSET获得其地址。
- 局部变量的地址不固定,必须用执行硬指令获得。并可由ADDR宏(LEA硬指令.LEA EAX,[EBP-?])获取.
- 变量可以有初值,编译器会在.obj与.exe执行文件中占用相应的类型空间.
- 变量也可以没有初值(即没有初始化),编译器在.obj与.exe执行文件中不占空间,一般这样的变量可都定义在.data?段中(这也是数据段,有特殊的标志).
- 字符串常量可以用“HELLO”,也可以用‘H’,‘E’,‘L’,‘L’,‘O’,串最后一定要有0,不能用转义符\n等。
- 全局变量可以用DUP循环赋值.并且可以嵌套.
Y DD 5 DUP(1,10 DUP(0,0FFH),0)
.data
x1 db 1, -2, 3, '1', "123a bc"
y10 real4 0.1
zqdq ?
- 局部变量定义:在子程序开始(代码段),定义时不赋初值
sum proc C uses ebx ecx esi arri:ptr sdword,n:dword
local i:dword, a[10]:byte
mov i,-1
mov ecx,10
LL: mov a[ecx],cl
loop LL
伪指令
硬指令
- 执行性语句,在代码段,对应一条机器指令,由CPU执行
- 标号: 硬指令助记符 操作数,操作数 ;注释
- 硬指令的操作数可以是立即数、寄存器和存储单元
软指令:伪指令
- 说明性语句,根据需要位于任一段内,东昌指示编译器或链接器如何编译或链接原指令.
- 名字 伪指令助记符 参数,参数,...
- 伪指令参数可以是常数,变量名,
- 等号伪指令
- 等价伪指令
- 符号名 EQU 数值表达式
- 符号名 EQU <字符串>
- OFFSET/seg 全局变量偏移地址/段地址
- ADDR 局部变量,地址表达式变量的地址
- BYTE/QWORD PDR 等强制类型转换
- $ 当前地址
- TYPE 名字/标号 变量占用的字节数
- Lengthof 变量名 获得数组元素的个数
- SIZEOF
- This 类型 把一个类型的变量变成另一个数据类型来访问(高版本编译器不支持,被强制类型转换替代)
X DWORD 12345678H
X DD 12345678H
X SDWORD 12345678H
XDUP DWORD 5 DUP(1,2,4)
XLEN DWORD ($-XDUP)/4
XADDR DWORD XDUP
XADDR DWORD OFFSET XDUP
MOV EAX,XDUP
MOV EBX,XADDR
MOV ECX,[XDUP]
MOV EDX,[XADDR]
MOV ESI,XDUP[0]
MOV EAX,TYPE XDUP
MOV ECX,LENGTHOF XDUP
MOV EDX,SIZEOOF XDUP
LEA EBX,A+N*4
LEA EBX,[A+N*4]
MOV EBX,(OFFSET A) + N*4