滴水三期:day04.4-其他的汇编指令

一、ADC指令

  • 带进位加法,即在两个数正常相加后,还要加上CF标志位的值:如果CF位为0,则不用管;如果CF位为1,则结果还要加上1

  • 格式:

    ADC R/M,R/M/IMM    #两边不能同时为内存,且宽度要一样
    #举例:
    ADC AL,CL
    ADC BYTE PTR DS:[12FFC4],2
    ADC BYTE PTR DS:[12FFC4],AL
    

二、SBB指令

  • 带借位减法,即在两个数正常相减后,还要减去CF标志位的值

  • 格式:

    SBB  R/M,R/M/IMM    #两边不能同时为内存,宽度要一样
    #举例:
    SBB AL,CL
    SBB BYTE PTR DS:[12FFC4],2
    SBB BYTE PTR DS:[12FFC4],AL   #宽度一致
    

三、XCHG指令

  • 交换数据

  • 格式:

    XCHG  R/M,R/M     #后面不能是立即数!两边不能同时为内存,宽度要一样
    #举例:
    XCHG AL,CL
    XCHG DWORD PTR DS:[12FFC4],EAX
    XCHG BYTE PTR DS:[12FFC4],AL        #宽度一致
    

四、MOVS指令

  • 内存和内存之间移动数据(这是比较少有的源操作数与目标操作数都可以为内存的命令)

    • 将后面ESI中存的内存地址编号中的值(按照给定的数据宽度来取),存入到前面的EDI中存的内存地址编号中

    • 如果DF标志位为0,则继续

      • 根据指定的内存宽度byte/word/dword来决定ESI和EDI的内存地址编号+1/+2/+4
    • 如果DF标志位为1,则继续

      • 根据指定的内存宽度byte/word/dword来决定ESI和EDI的内存地址编号-1/-2/-4
  • 格式:

    MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]    简写为    MOVSB
    MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI]    简写为    MOVSW
    MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]   简写为    MOVSD
    
  • 举例说明movs指令作用

    mov esi,0x19ff74     #esi寄存器中存的值为内存地址0x19ff74,且已知此内存地址中存的值为0x11111111
    mov edi,0x19ff80     #edi寄存器中存的值为内存地址0x19ff80,且已知此内存地址中存的值为0x22222222
    
    #当DF标志位为0时
    movsb   #执行后,edi中的存的内存地址0x19ff80中的值变化为0x22222211,且esi和edi中的值都加1,则esi中值为			0x19ff75,edi中的值为0x19ff81
    
    #当DF标志位为1时
    movsb   #执行后,edi中的存的内存地址0x19ff80中的值变化为0x22222211,且esi和edi中的值都减1,则esi中值为			0x19ff73,edi中的值为0x19ff7f
    
    mov esi,0x19ff74
    mov edi,0x19ff80
    
    #当DF标志位为0时
    movsw   #执行后,edi中的存的内存地址0x19ff80中的值变化为0x22221111,且esi和edi中的值都加2,则esi中值为			0x19ff76,edi中的值为0x19ff82
    
    #当DF标志位为1时
    movsw   #执行后,edi中的存的内存地址0x19ff80中的值变化为0x22221111,且esi和edi中的值都减2,则esi中值为			0x19ff72,edi中的值为0x19ff7e
    
    mov esi,0x19ff74
    mov edi,0x19ff80
    
    #当DF标志位为0时
    movsd   #执行后,edi中的存的内存地址0x19ff80中的值变化为0x11111111,且esi和edi中的值都加4,则esi中值为			0x19ff78,edi中的值为0x19ff84
    
    #当DF标志位为1时
    movsd   #执行后,edi中的存的内存地址0x19ff80中的值变化为0x11111111,且esi和edi中的值都减4,则esi中值为			0x19ff70,edi中的值为0x19ff7c
    
  • 以后开发中要注意:如果遇到MOVS指令,很可能是字符串的复制

五、STOS指令

  • AL/AX/EAX存储到**[EDI]指定的内存单元**,至于是AL、AX、EAX,取决于给的数据宽度是byte、word、dword,接着将EDI中存的值依据DF标志位为0还是1以及数据宽度,加1/2/4或者减1/2/4

  • 格式:

    STOS BYTE PTR ES:[EDI]    简写为    STOSB
    STOS WORD PTR ES:[EDI]    简写为    STOSW
    STOS DWORD PTR ES:[EDI]   简写为    STOSD
    
  • 举例说明STOS指令执行结果:

    MOV EAX,0x12345678
    MOV EDI,0x19FF74     #将内存地址编号0x19ff74存入edi中,且已知此内存地址中的值为0x75b5fa29
    
    #当DF标志位为0时
    STOS BYTE PTR ES:[EDI]   #edi指定的0x19ff74内存单元中的值变为0x75b5fa78,并且edi中的值加1,变为							  0x19ff75
    ----------------------------
    #当DF标志位为1时
    STOS BYTE PTR ES:[EDI]   #edi指定的0x19ff74内存单元中的值变为0x75b5fa78,并且edi中的值减1,变为							  0x19ff73
    
    MOV EAX,0x12345678
    MOV EDI,0x19FF74     #将内存地址编号0x19ff74存入edi中,且已知此内存地址中的值为0x75b5fa29
    
    #当DF标志位为0时
    STOS WORD PTR ES:[EDI]   #edi指定的0x19ff74内存单元中的值变为0x75b55678,并且edi中的值加2,变为							  0x19ff76
    ----------------------------
    #当DF标志位为1时
    STOS  WORD PTR ES:[EDI]   #edi指定的0x19ff74内存单元中的值变为0x75b55678,并且edi中的值减2,变为							  0x19ff72
    
    MOV EAX,0x12345678
    MOV EDI,0x19FF74     #将内存地址编号0x19ff74存入edi中,且已知此内存地址中的值为0x75b5fa29
    
    #当DF标志位为0时
    STOS DWORD PTR ES:[EDI]   #edi指定的0x19ff74内存单元中的值变为0x12345678,并且edi中的值加4,变为							  0x19ff78
    ----------------------------
    #当DF标志位为1时
    STOS DWORD PTR ES:[EDI]   #edi指定的0x19ff74内存单元中的值变为0x12345678,并且edi中的值减4,变为							  0x19ff70
    

六、REP指令

  • 按计数寄存器 (ECX) 中指定的次数重复执行字符串指令(STOS、MOVS),每执行一次,ECX的值会减1,最终减为0结束执行

  • 格式:

    MOV ECX,0x10        #重复的次数为16次
    MOV EAX,0x12345678      #存入EDI中的值为0x12345678,根据数据宽度来取
    
    #如果DF标志位为0
    REP STOS DWORD PTR ES:[EDI]   #将EAX中的值0x12345678取DWORD--32位存入EDI中存的内存地址中,并且EDI								 中存的值会自动+4。接着将上述过程循环16次
    -----------------------------------------------------------------------
    #如果DF标志位为1
    REP STOS DWORD PTR ES:[EDI]   #将EAX中的值0x12345678取DWORD--32位存入EDI中存的内存地址中,并且EDI								 中存的值会自动-4。接着将上述过程循环16次
    
    MOV ECX,0x10        #重复的次数为16次
    
    #如果DF标志位为0
    REP MOVSD    #将ESI中存的内存地址中的值取DWORD--32位存入EDI中存的内存地址中,并且EDI和ESI中存的内存地			  址值自动+4。接着将上述过程循环16次
    -----------------------------------------------------------------------
    #如果DF标志位为1
    REP MOVSD    #将ESI中存的内存地址中的值取DWORD--32位存入EDI中存的内存地址中,并且EDI和ESI中存的内存地			  址值自动-4。接着将上述过程循环16次
    

七、作业

1.熟练记住CF/PF/AF/ZF/SF/OF的位置

  • CF为进位标志,0位;PF为奇偶标志,2位;AF为辅助进位标志,4位;ZF为零标志,6位;SF为符号标志,7位;OF为溢出标志,11位;DF为方向标志,10位

2.写汇编指令影响标志位

  • 只影响CF位的值(不能影响其他标志位)

    mov eax,0xff
    add eax,0x4
    
  • 只影响PF位的值(不能影响其他标志位)

    mov eax,0x1
    add eax,0x2
    
  • 只影响AF位的值(不能影响其他标志位)

    mov eax,0x20
    sub eax,0x01
    
  • 只影响SF位的值(不能影响其他标志位)

    mov eax,0x01111111
    or eax,0xf0000000
    
  • 只影响OF位的值(不能影响其他标志位)?????不会

    mov eax,0x7f11  
    add ax,0x1123
    

3.MOVS、STOS指令练习

  • MOVS指令分别移动5个字节、5个字、5个双字

    movsb   movsw  movsd
    movsb   movsw  movsd
    movsb   movsw  movsd
    movsb   movsw  movsd
    movsb   movsw  movsd
    
  • STOS指令分别存储5个字节、5个字、5个双字

    mov eax,0x11111111
    stosb   stosw   stosd
    stosb   stosw   stosd
    stosb   stosw   stosd
    stosb   stosw   stosd
    stosb   stosw   stosd
    

4.使用REP指令重写3练习

  • rep movs

    mov ecx,0x5
    rep movsb
    
  • rep stos

    mov eax,0x11111111
    mov ecx,0x5
    rep stosd
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值