汇编选择&循环结构

汇编系列文章:
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