ctf逆向入门 — 汇编语言中一些容易弄错的指令

数据传送指令

  • movsx 符号扩展后传送

    传送目标的字节数大于源字节数时,需要扩展后传送

    符号扩展意思是:对于正数高位补0,对于负数高位全补1

  • movzx 补零后传送

算数运算指令

  • mul 无符号乘法

    如果参数是8位,把 al 做乘数,结果放在 ax

    如果参数是16位,把 ax 做乘数,结果放在 eax

    如果参数是32位,把 eax 做乘数,结果放在 edx:eax (edx是高32位,eax是低32位)

  • imul 有符号乘法

    操作数乘数和存放结果的寄存器与mul指令相同,乘数均为正时结果与mul相同,乘数为负时结果与mul不同

    有三个操作数时,结果存放在第一个操作数中

  • div 无符号除法

    如果参数是8位,把 ax 作为被除数,商放在 al,余数放在 dl

    如果参数是16位,把 eax 作为被除数,商放在 ax,余数放在 dx

    如果参数是32位,把 edx:eax 作为被除数,商放在 eax,余数放在 edx

  • idiv 有符号除法

    • cdq 扩展被除数

    由于32位除法要求被除数为64位,执行idiv指令前需要先执行cdq指令

    cdq(Convert Double to Quad)指令用于扩展被除数(将eax扩展成edx:eax),当eax为正数时,将edx置为0,当eax为负数时,将edx置为0xFFFFFFFF

  • xor 异或

比较和转移指令

  • cmp 比较两个操作数 (以作减法的方式),一般在后面接跳转指令

  • test 比较两个操作数 (以作逻辑与的方式),一般在后面接跳转指令

  • 跳转类指令 见下表

    指令 英文全称 跳转条件 有无符号
    je/jz equal/zero 为0或相等
    jne/jnz not equal/not zero 不为0或不相等
    jb below < 无符号
    jae above equal >= 无符号
    ja above > 无符号
    jbe below equal <= 无符号
    jl lower < 有符号
    jge greater equal >= 有符号
    jg greater > 有符号
    jle lower equal <= 有符号

  无符号(unsigned) 指的是所有数都为正数,0xFF 表示 255有符号(signed) 指的是最高位为1时为负,最高位为0时为正,0xFF表示 -1

装入指令

  • lea 将第二个操作数偏移地址装入第一个操作数

重复指令

  • rep 重复的前缀

    重复前缀 终止条件 1 终止条件 2
    rep ecx=0
    repe/repz ecx=0 zf=0 (结果为0时继续重复)
    repne/repnz ecx=0 zf=1