⦁ 2^8=256 2^10=1024 2^16=65536[二进制]1111=F[16进制]
⦁ 有符号二进制整数的最高有效位[MSB]表示数的符号,0=正数 1=负数
⦁ 数据的意义,由其数据类型决定,单纯的数字没有意义.比如11111111,如果数据类型是无符号整数,代表十进制255,如果是有符号整数,代表-1.
⦁ 负整数用其绝对值的补码表示,也就是对应的正数取反加1
⦁ IA32处理器基本寄存器包括8个32位通用寄存器[EAX EBX ECX EDX EBP ESP ESI EDI],6个16位段寄存器[CS SS DS ES FS GS],一个处理器状态标志寄存器[EFLAGS]和一个指令指针寄存器[EIP].
⦁ EFLAGS寄存器,当某标志等于1被称为置位,等于零为复位.
⦁ 整数常量后可接数字基数,大小写均可: H:十六进制 B:二进制 D:十进制 R:编码实数,字母开头的十六进制数前面加零
⦁ 汇编语言大小写不敏感
⦁ 伪指令定义程序的节.data:变量区 .code:指令区 .stack:栈
⦁ move count, ebx 等同于 count = ebx
⦁ Intel CPU使用小尾顺序的方案存取内存数据,变量的最低有效字节存储在地址值最小的内存单元中.如果内存地址从左到右递增的话,BYTE型数据1在内存中存储为1000 0000
⦁ $运算符返回当前语句的地址偏移值
⦁ 在几乎所有汇编指令中,左边的操作数都是目的操作数,右边的操作数是源操作数.
⦁ movzx:零扩展传送 movsx:符号扩展传送
⦁ xchg:交换两个操作数的内容
⦁ 方括号表示提权内存内容,括号中是内存地址
⦁ inc dec:从操作数中加1或减1
⦁ offset操作符返回数据标号相对数据段起点的偏移,单位字节
⦁ align 4: 之后的变量4字节对齐
⦁ type:返回按字节计算的变量单个元素的大小
⦁ lengthof:返回数组元素的数目
⦁ sizeof:type*lengthof
⦁ 间接操作数:通用寄存器用方括号括起来,寄存器里存放数据的偏移.
⦁ PTR:指明操作数的尺寸大小.inc byte ptr [esi]
⦁ TYPEDEF:创建用户自定义数据类型.PBYTE TYPEDEF PTR BYTE
⦁ JMP 标号:无条件转移指令,标号将由汇编器翻译成偏移地址
⦁ LOOP指令的执行分两步:1.ECX减1,接着与0作比较,如果不等于0,则JMP到目的地址,如果ECX等于0,则继续执行LOOP下一行指令.
⦁ ESP:extended stack pointer 堆栈指针寄存器
⦁ 32位压栈PUSH操作,首先将栈指针减4,然后把值复制到栈指针指向的位置
⦁ 32位出栈POP操作,首先从堆栈顶端移走一个值,将其复制到寄存器或内存,栈指针增加4
⦁ 过程:PROC与ENDP之间的代码构成一个过程,关键字之前的是过程的标识符,过程结束前必须返回ret
⦁ 标号 PROC [属性] [USES 寄存器列表],参数列表
⦁ USES:列出被过程修改的所有寄存器
⦁ cmp 目的操作数,源操作数,cmp操作改变ZF CF标志
⦁ jz:如果比较操作后,ZF置位,ZF=1,则跳转
⦁ jnz:如果比较操作后,ZF清零,ZF=0,则跳转
⦁ 全局标号:标号后跟::,跳转指令可以突破过程的限制,跳转到全局标号行
⦁ JE=JZ[相等则跳转] JNE=JNZ[不相等则跳转]
⦁ 决策伪指令:.IF .ELSE .ELSEIF .ENDIF
⦁ .MODEL 内存模式 [,模式选项] .model flat,STDCALL
⦁ STDCALL把要导出的过程名修改为:_name@nn,过程名开头加一条下划线,@符号后加了表示参数使用字节数的整数.[向上取整为4的倍数]
⦁ INVOKE是CALL指令的增强替代品,允许在一行代码中传递多个参数,INVOKE 过程名[,参数列表]
⦁ PROTO为一个已存在的过程创建一个原型
⦁ 联合union与结构类似,把多个标识符组合在一起,不过这些标识符共用同一块内存内存
⦁ 宏定义: Name MACRO para1,para2... statement-list ENDM
⦁ C++中使用__asm{}内联汇编代码