masm32汇编语言

masm32汇编语言

admin 2019年6月1日
寻址:
 立即寻址方式
 寄存器寻址方式
 直接寻址方式
 寄存器间接寻址方式
 寄存器相对寻址方式
 基址加变址寻址方式
 相对基址加变址寻址方式
 32位基址寄存器是:EAX、EBX、ECX、EDX、
 ESI、EDI、EBP和ESP;
 32位变址寄存器是:EAX、EBX、ECX、EDX、
 ESI、EDI和EBP(除ESP之外)。
数据类型:
 byte
 sbyte
 word
 sword
 dword
 sword
 fword 48位整数,保护模式中的远指针
 qword 64位
 tbyte 80位
 real4
 real8
 real10
常用的伪指令:
 dup
 db
 dw
 dd
 dq
 dt
 $
 equ 表达式,符号,<…>
 textequ 文本宏 <…>,原文本宏,%表达式
与数据相关的指令:
 mov movzx movsx
 lahf eflags低字节->ah sahf ah->eflags
 xchg 交换
 inc dec
 add sub
 neg
与数据相关的伪指令:
 offset 标号到数据段起始地址的距离
 align 字节对齐
 ptr 重写被声明过的数据的大小类型
 type 返回单个元素的大小
 lengthof 元素的个数
 sizeof 返回lengthof和type的乘积
 jmp和loop:
 jmp无条件跳转
 loop以ecx为计数器进行循环
 loopd ecx
 loopw cx
 64位:
 mov 在8位或16位内存操作数送入寄存器低
 位,目标寄存器高位不清零,其他清零
 movsxd 符号拓展传送
堆栈:
 push先减esp pop先复制再增加
 pushfd 压eflags
 popfd 弹出到eflags
 pushad eax,ecx,edx,ebx,esp,ebp,esi,edi这样的顺序压入堆栈
 pusha ax,……
 popa
 popad相反顺序出栈
 enter 字节数,0
 leave
 push ebp
 mov ebp,esp
 sub esp,字节数
 mov esp,ebp
 pop ebp
过程:
 call 之后的地址压入堆栈
 ret 堆栈中数据弹出到eip
 main proc uses eax ebx …
 ………
 main endp
 uses是保护寄存器的做法原理:push pop
 标号只在过程中可见
 办法是标号后后面加::
 64位没有invoke 只有call
 压参顺序:
 rcx,rdx,r8,r9 然后从右向左堆栈
 至少分配20h的影子空间以便保存寄存器参数
 rsp必须16字节对齐
条件处理:
 and or xor not test loopz 为零跳转
 cmp loope
 jcc: ecx>0,zf=1
 jc cf=1 loopnz loopne
 jnc cf=0 ecx>0,zf=0
 jz,je zf=1
 jnz,jne zf=0
 jo of=1
 jno of=0
 js sf=1
 jns sf=0
 jp pf=1
 jnp pf=0
 jcxz cx=0
 jecxz ecx=0
 jrcxz rcx=0
 无符号:ja jnbe jae jnb jb jnae jbe jna
 有符号:jg jl jnle jnge jge jle jnl jng
条件控制流伪指令:
 .break
 .continue
 .else
 .elseif
 .endif
 .endw
 .if
 .repeat
 .until
 .untilcxz
 .while
 < > == != || &&
 .repeat
 ……..
 .until ….
 .while …..
 ……
 .endw
整数运算:
 shl shr
 sar sal
 rol ror
 rcl rcr
 shld 双精度左移
 shrd 双精度右移
 xxxx dest,source,count
 mul imul ax,dx:ax,edx:eax
 div idiv al:ah ax:dx eax:edx 前者是商后者余数
 adc sbb 带进位
一些伪指令:
 invoke 按照model伪指令的顺序将参数入栈
 invoke main,1,2,3….
 push 3
 push 2
 push1
 call main(stdcall)
 addr取地址只能用在invoke
 proc distance langtype visbility prologuearg uses…….. ,参数:type
 distance:near far =>ret retf
 langtype:可覆盖.model规定的调用约定
 visbility:可见性 public private export
 prologuearg:指定会影响开始和结尾代码生成的参数
 proto创建过程的原型
字符与数组:
 cld 由低到高
 std 由高到低
 movsb,movsw,movsd esi->edi
 cmpsb,cmpsw,cmpsd 可以使用重复段前缀:rep(ecx>0) repz,repe(zf=1,ecx>0) repnz,repne(zf=0,ecx>0)
 scasb scasw scasd 将al/ax/eax与edi的比较 相等或者ecx=0退出
 stosb stosw stosd al/ax/eax 的内容存入edi内存中
 lodsb lodsw lodsd 加载,是sto的反向
结构与联合:
 xxxx struct
 …….
 …….
 xxxx ends
 aaa xxxx <字段值>或者{字段值}
 aaa.bbb
 xxxx union
 ……..
 ……..
 xxxx ends
 其他同上
 宏我就不讲了,太多了。。。。。
FPU:
 8个80位数据寄存器 R0-R7
 6个专用寄存器
 默认舍入方式是舍入到最接近的偶数
 fld 加载操作数到st(0)
 fst 复制到内存
 fstp st(0)->内存 弹出st(0)
 fchs
 fadd
 fsub
 fsubr
 fmul
 fdiv
 fdivr
 fcom fcomp fcompp fcom
 AVX/SSE
 略
 这些浮点数比较复杂,本人能力有限,有兴趣的参考《现代x86汇编语言程序设计》
 操作符:=,!=,>,>=,<,<=,&,!,&&,||。
 条件测试语句的限制:
 表达式左边只能是变量或者寄存器,不能是常数,表达式俩边不能同时为变量,但可以是寄存器。
标志位状态指示:
 CARRY?       表示状态位是否置位
 OVERFLOW?
 PARITY?
 SIGN?
 ZERO?
分支语句:
 .if 表达式    
      指令
 .elseif 表达式    
      指令
 .else
      指令
 .endif
循环语句:
 .while 表达式
    指令   
    .break .if 退出条件表达式   
    .continue
 .endw
 .repeat
    指令  
    .break .if 退出条件表达式  
    .continue
    .until 表达式 (或者 .untilcxz 表达式(.untilcxz用ecx计数进行loop循环))
 代码规范之变量名和函数名:b  bytew  worddw  dword
 h  句柄
 lp指针
 sz 以0结尾的字符串
 lpsz 指向以0结尾字符串的指针
 f 浮点数
 st 表示一个数据结构
 提示:局部变量用lea取址,addr用于invoke,offset用于全局变量。函数参数和自己定义的函数前加_,局部变量前加@。

发表评论

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