zoukankan      html  css  js  c++  java
  • 学习:数学指令

    add指令:加

    之前测试的时候用的都是add eax,0x1,其实add不仅可以给寄存器的地址加值add eax,0x1,还可以给取地址的值加值add dword ptr ds:[0x402000],0x2,也同样可以寄存器给寄存器加值add eax,ecx,如下图值为4的原因是自己原本就给了2,为什么是第一个为4呢,因为是倒着来的,实际值应该是00000004


    sub指令:减

    跟上面一样,同样可以进行给寄存器的地址减值sub eax,0x1,还可以给取地址的值加值sub dword ptr ds:[0x402000],0x2,也同样可以寄存器给寄存器加值sub eax,ecx,如下图原本值为4减2了,就自然是2了


    adc指令:加的时候需要考虑上进位标志CF

    1、修改当前地址的汇编指令为adc eax,0x1
    2、单步步过
    发现eax中的地址值加1

    3、把C寄存器置为1
    4、修改汇编指令adc eax,0x1
    5、单步步过

    发现eax的地址值为3,也就是说加了2,所以adc指定加的时候需要考虑上进位标志CF


    sbb指令:减的时候需要考虑上进位标志CF

    1、修改当前地址的汇编指令为sbb eax,0x1
    2、单步步过
    发现eax中的地址值减1,eax的地址值为2

    3、把C寄存器置为1
    4、修改汇编指令sbb eax,0x1
    5、单步步过

    发现eax的地址值为0,也就是说减了2,所以sbb指定减的时候需要考虑上进位标志CF


    inc指令:递增

    1、修改多个连续地址的汇编指令为inc eax,0x1
    2、单步步过

    那么在C语言中,一个变量的值是存储在相应的内存地址中的,我们也可以尝试实现对地址中的数值进行操作,同样可以通过汇编语言实现inc dword ptr ds:[0x402000],这是肯定的


    dec指令:递减

    1、把当前的eax的寄存器中的地址值修改为00001234
    3、然后修改多个连续地址的汇编指令为dec eax,0x1
    2、继续单步步过

    那么在C语言中,一个变量的值是存储在相应的内存地址中的,我们也可以尝试实现对地址中的数值进行操作,同样可以通过汇编语言实现dec dword ptr ds:[0x402000],这是肯定的


    mul指令(无符号位计算):乘,这里需要注意的是默认是跟eax寄存器中的地址值相乘

    1、修改eax寄存器的地址值为FFFFFFFF,ecx的地址值为5
    2、把当前的地址的汇编指令修改为mul ecx
    3、单步步过

    我们事先知道十六进制5*FFFFFFFF的值为4FFFFFFFB,但是这里发现EAX的值保存的为FFFFFFFB,那4呢,仔细观察可以发现存储到了EDX寄存器中了,所以可以知道如果结果是大于32位的,多出来的存储到其他寄存器中


    div指令(无符号位计算):除,这里需要注意的是默认的被除数是eax寄存器中的地址值

    第一种:
    1、修改eax寄存器的地址值为17,ecx的地址值为5
    2、把当前的地址的汇编指令修改为mul cl,cl是ecx中的第四个字节那么也就是05
    3、单步步过

    会发现十六进制17的十进制为23 然后除以十进制5 商4 余3,在这里的表达方式就是 在eax寄存器中ah中存储着余数,al中存储商

    第二种:
    1、修改eax寄存器的地址值为17,ecx的地址值为5
    2、把当前的地址的汇编指令修改为mul cx,cx是ecx中的后两个字节那么也就是0005
    3、单步步过

    会发现eax寄存器中的后面存储商,edx寄存器中的dx存储余

    第三种:
    1、修改eax寄存器的地址值为17,ecx的地址值为5
    2、把当前的地址的汇编指令修改为mul ecx,ecx也就是00000005
    3、单步步过

    会发现结果跟mul cx一样,但是存放的位置不同,这次存放的是edx完整的位置,也就是32位的地址中


    imul指令(有符号位计算):乘

    第一种:单操作符
    1、修改eax寄存器的地址值为FFFFFFFB,ecx的地址值修改为5
    2、把当前的地址的汇编指令修改为imul cl,cl也就是05
    3、单步步过

    发现EAX寄存器的值为FFFFFFE7,有符号位的十进制为-25,因为FFFFFFFB有符号位的十进制就是-5,-5*5=-25

    第二种:双操作符
    1、修改eax寄存器的地址值为FFFFFFFB,ecx的地址值修改为5
    2、把当前的地址的汇编指令修改为imul ax,cx,意思就是cx也就是0005,结果存储在ax中
    3、单步步过

    EAX的值为FFFFFFE7,十进制为-25

    第三种:三操作符
    1、修改eax寄存器的地址值为FFFFFFFB,ecx的地址值修改为5
    2、把当前的地址的汇编指令修改为imul ax,cx,2,意思就是cx也就是0005,结果存储在ax中
    3、单步步过

    EAX的值为FFFFFFF6,十进制为-10


    idiv指令(有符号位计算):除,自己试的时候有问题,值对不上,先放着吧,等知道了再来填充


    xadd指令:交换相加

    xadd eax ecx可以理解为 xchg eax,ecx然后再add eax,ecx

    1、修改eax寄存器的地址值为00000001,ecx的地址值为00000004
    2、把当前的地址的汇编指令修改为xadd eax ecx
    3、单步步过

    可以发现先交换了1和4,然后给eax赋值5


    neg指令:取反
    1、修改eax寄存器的地址值为00000005
    2、把当前的地址的汇编指令修改为neg eax
    3、单步步过

    可以发现eax的地址值为FFFFFFFB 转换为十进制为-5

  • 相关阅读:
    Raknet是一个基于UDP网络传输协议的C++网络库(还有一些其它库,比如nanomsg,fastsocket等等)
    Arch Linux 是个 针对 i686 优化的 Linux 发行版(通过可以轻松使用的二进制包系统
    使用网盘(Dropbox/Google Drive)同步Git仓库
    百度网盘web端项目总结
    国内的网盘一个个倒下,这里有一份能让你用到老的存储指南(有好多评论)
    单元测试
    C# Closure
    gulp
    Net Memory Profiler 分析.Net程序内存泄露
    Net内存泄露原因及解决办法
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12045478.html
Copyright © 2011-2022 走看看