汇编系列文章:
https://www.jianshu.com/nb/29822876
Status flags
- Zero、Carry(无符号溢出)、Sign(负数)、Overflow(有符号溢出)、Parity(低字节偶数个1)、Auxiliary Carry(第3bit到第4有进位)
逻辑操作
- AND、OR、XOR、NOT
- 可以与Bit-Mapped sets一起进行交集并集等操作
- TEST:只进行and的检查,不改变操作数但会改变Zero flag。配合jz和jnz使用
CMP
- 只改变flag,ZF、CF、OF等
- 通过这些flag的改变。用Jcondition来跳转,包括:
- JB、JC(b表示below,c表示carry flag)
- JE、JZ(e表示equal,z表示zero flag)
- JS(s表示sign)
- JNE、JNZ(n为not)
- JECXZ(表示ecx为zero)
- JA、JB、JBE、JNA分别表示Unsigned的大于(above)、小于、小于等于、不大于
- JG、JL、JNGE分别表示Signed的大于、小于、不大于等于(即小于)
- Jcondition的操作数是代码label,对应机器码是EIP需要增大的数。由于在当前这一句时,EIP是在下一句,所以需要用目标label的地址减去下一句的地址
BT
BT bitBase, n
是把bitBase
的第n位放到Carry Flag里面- 之后可以用jc来跳转
LOOPZ&LOOPE
- 依然有ECX的判断,但是必须ZF=1才能跳转
- 同理有LOOPNE和LOOPNZ
伪指令
- 可以使用.IF .ELSE .ENDIF .ELSEIF这几个指令(后面没有冒号)
- 可以使用.REPEAT .UNTIL或者.WHILE .ENDW
- 条件里面可以用与或非大小比较按位与的符号,以及CARRY?OVERFLOW?PARITY?SIGN?ZERO?,但是要注意顺序,不能写.IF 2 > eax之类的
- SIGNED和UNSINGED的判断是通过数据label声明得到的,如果是寄存器默认认为UNSIGNED但是可以用SDWORD PTR来说明是signed