变量,初值与赋值

  • 变量是变化的量:全局变量和局部变量。
  • 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) ;10遍赋值内括号,5遍复制外括号.因此这个数组有110个元素.
  • 全局变量定义:在数据段,可以赋初值
.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 ;与上一句意思相同

;135等价,24等价
MOV EAX,XDUP ;传数组的第0号元素
MOV EBX,XADDR ;取XADDR内容,即xdup地址
MOV ECX,[XDUP]
MOV EDX,[XADDR]
MOV ESI,XDUP[0]

MOV EAX,TYPE XDUP
MOV ECX,LENGTHOF XDUP
MOV EDX,SIZEOOF XDUP

;以下三个等价,取A[N]元素
LEA EBX,A+N*4
LEA EBX,[A+N*4]
MOV EBX,(OFFSET A) + N*4

results matching ""

    No results matching ""