汇编指令整理

  • xor 异或运算

  • shl 按位左移

    • shl是一个汇编指令,作用是逻辑左移指令,将目的操作数顺序左移1位或CL寄存器中指定的位数。左移一位时,操作数的最高位移入进位标志位CF,最低位补零。
    • SHR指令将目的操作数顺序右移1位或CL寄存器指定的位数。逻辑右移1位时,目的操作数的最低位移到进位标志位CF,最高位补零。
    • 等价命令:sal
  • shr与sar

    • 汇编语言中SAR和SHR指令都是右移指令,SAR是算数右移指令(shift arithmetic right),而SHR是逻辑右移指令(shift logical right)。
    • 两者的区别在于SAR右移时保留操作数的符号,即用符号位来补足,而SHR右移时总是用0来补足。
    • 例如10000000算数右移(SAR)一位是11000000,而逻辑右移(SHR)一位是01000000
  • rcl、rcr:带进位循环左移、带进位循环右移

    • RCL AL,1则把AL的最高位1送给CF,使CF=1,AL其它位相应左移,成为 0100 000X,最后空下的X位被CF原来的值补齐;
      同样,ROL AL,CL(CL=2),相当于2次 RCL AL,1,最后AL变成 1000 00X1,AL原第二位的0到了CF,CF原来的值补AL中的x。
    • RCR AX,1 ;先用进位标志CF填补AX空出的1位,然后将AX最右边的1位移进CF
  • ror、rol 循环左移、循环右移

    • rol——循环左移指令:ROL DEST,COUNT
      指令功能:把目的地址中的数据循环左移COUNT次,每次从最高位(最左)移出的数据位都补充到最低位(最右),最后从最高位(最左)移出的数据位保存到CF标志位。
      标志位影响:CF标志用于保存最后从最高位移出的数据位。如果COUNT=1,OF标志有意义,如果移位前后数据的符号位发生了变化,OF=1;如果符号位没有发生变化,OF=0。如果COUNT>1,OF标志不确定(没有意义)。
    • ror 是循环右移指令,被移出的位,补回到最左端。
      ror al,cl 就是将al的内容,向右循环移位cl指定的位数。如cl=3,就表示移位3次。
  • 似乎不能在最后可以跟一个数字,也可以rol一个寄存器

与、或、异或运算可以用来改变某些位的值

  • xchg
    交换指令XCHG是两个寄存器,寄存器和内存变量之间内容的交换指令,两个操作数的数据类型要相同,可以是一个字节,也可以是一个字,也可以是双字

  • les
    LES( load ES)指令的功能是:把内存中指定位置的双字操作数的低位字装入指令中指定的寄存器、高位字装入ES寄存器。

  • cbw
    AL符号扩展为AX。在8086中CBW指令将AL的最高有效位D7扩展至AH,即:如果AL的最高有效位是0,则AH = 00;AL的最高有效位为1,则AH = FFH。AL不变。(即将AL的符号位移至AH)

    CBW属符号扩展指令,它可以把8位扩展到16位,扩展前后两数的真值不变,主要用于数据类型不同时用符号扩展指令可以使得数据类型相同。

  • cwd
    是汇编语言中的字扩展指令,它的功能是将一个字型变量扩展为双字型变量。
    就是把AX的符号位去填充DX

  • adc:带进位加法

  • neg:求相反数,会影响CF、ZF、SF等标志位

    1
    2
    mov ax,0FFFEh
    neg ax

    在代码运行结束后CF=1

    neg ax==(not ax)+1 ;对二进制求反再加一

  • sbb 带借位减

  • jg:SF==OF

  • jl:SF!=OF

  • rep:循环执行cx次字符串操作指令

  • stosb、stosw:把AL或AX中的数据装入ES:DI指向的存储单元,然后根据DF标志增减DI(di++或di–)

  • lodsb、lodsw:把DS:SI指向的存储单元中的数据装入AL或AX,然后根据DF标志增减SI

  • 关于转移指令

    • JGB是大于或等于,JLE是小于或等于
    • A(above)大于,B(below)小于,E(equal)等于,用于比较无符号数
    • G(great)大于,L(less than)小于, E(equal)等于,用于比较带符号数
  • repne scasb指令,用于扫描字符串,计算字符串的长度,如下两条指令:

    1
    2
    cld
    repne scasb

    对应的等价指令是:

    1
    2
    3
    4
    5
    scans:inc edi
    dec ecx
    je loopdone
    cmp byte [edi-1],al
    loopdone:
    • 对比:repe:扫描到字符则退出。
  • 串传送指令
    格式:movsb
    功能:

    (1)、((es)16+(di))=((ds)16+(si))
    (2)、如果df=0,则:(si)=(si)+1
       (di)=(di)+1
        如果df=1,则;(si)=(si)-1
       (di)=(di)-1
    当然也可以传送一个字,movsw,增量为2
    一般来说,movsb,movsw都和rep配合使用,用汇编语法来描述rep movsb的功能就是:

    1
    2
    s:movsb
      loop s

    可见,rep的作用是根据cx的值,重复执行后面的串传送指令。

跳转指令和它的机器码

短跳

两个字节

第一个字节=EB

第二个字节=目标地址-下一条指令偏移地址

近跳

第一个字节=E9

第二个(含第三个)字节=目标地址-下一条指令偏移地址

记得按照小端规则颠倒算出的差值填入命令

远跳

例如,jmp 1234h:5678h,应该表示为

1
2
3
db 0EAh
dw 5678h
dw 1234h