zoukankan      html  css  js  c++  java
  • 汇编指令

    CALL指令的步骤:首先是将返回地址(也就是call指令要执行时EIP的值)压入栈顶,然后是将程序跳转到当前调用的方法的起始地址。执行push和jump指令。

    RET指令则是将栈顶的返回地址弹出到EIP,然后按照EIP此时指示的指令地址继续执行程序。


    JZ跳转 ZF=1,运算结果为0 跳转

    JNZ跳转 ZF≠1,运算结果不为0时 跳转


    XOR reg,value1 对reg和value1进行异或操作,将结果保存到reg中

    XOR 运算有一个很奇妙的特点:如果对一个值连续做两次 XOR,会返回这个值本身。

    // 第一次 XOR
    1010 ^ 1111 // 0101
    
    // 第二次 XOR
    0101 ^ 1111 // 1010
    

    上面代码中,原始值是1010,再任意选择一个值(上例是1111),做两次 XOR,最后总是会得到原始值1010。这在数学上是很容易证明的。

    XOR 的这个特点,使得它可以用于信息的加密。

    message XOR key // cipherText
    cipherText XOR key // message
    

    上面代码中,原始信息是message,密钥是key,第一次 XOR 会得到加密文本cipherText。对方拿到以后,再用key做一次 XOR 运算,就会还原得到message。


    链接:https://www.zhihu.com/question/20484426/answer/180582779
     

    CMP cmp指令格式: cmp  操作对象1,操作对象2

    功能: 计算操作对象1 - 操作对象2 但不保存结果,仅仅根据计算结果对标志寄存器进行设置.比如cmp ax,ax  是做ax - ax 的运算,结果为0,但并不在ax中保存,仅影响flag的相关各位


    TEST指令

    对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存

    1.Test用来测试一个位,例如寄存器:
    test eax, 100b;          b后缀意为二进制
    jnz  ******;             如果eax右数第三个位为1,jnz将会跳转
    jnz跳转的条件非0,即ZF=0,ZF=0意味着零标志没被置位,即逻辑与结果为1。

    2.Test的一个非常普遍的用法是用来测试一方寄存器是否为空:
    test ecx, ecx
    jz somewhere
    如果ecx为零,设置ZF零标志为1,Jz跳转

    Minds overflow
  • 相关阅读:
    02 python网络爬虫《Http和Https协议》
    09 Django之orm中的锁和事务
    08 Django之自定义标签和过滤器
    07 Django之配置静态文件以及渲染图片
    06 Django之模型层---多表操作
    05 Django之模型层---单表操作
    Spring 中的 18 个注解,你会几个?
    一个 Java 对象到底有多大?
    面试题:InnoDB中一棵B+树能存多少行数据?
    Elasticsearch如何做到亿级数据查询毫秒级返回?
  • 原文地址:https://www.cnblogs.com/rookieDanny/p/7793905.html
Copyright © 2011-2022 走看看