zoukankan      html  css  js  c++  java
  • 三、常用的汇编指令

    常用的汇编指令:

    push :把一个32位的操作数压入堆栈中。这个操作导致esp被减4.esp被形象地称为栈顶。我们认为顶部地址是地址小的区域,那么,
    压入堆栈的数据越多,这个堆栈也就越堆越高,esp也就越来越小。在32位平台上,esp每次减少4(字节)。

    pop :相反,esp被加4,一个数据出栈。pop的参数一般是一个寄存器,栈顶的数据被弹出到这个寄存器中。

    一般不会把sub、add这样的算术指令,以及call、ret这样的跳转指令归入堆栈相关指令中。但实际上在函数参数传递过程中,sub和add最常用来操作
    堆栈;call和ret对堆栈也有影响。所以这里作为特殊处理。
    sub :减法。格式为:sub 被减数,减数
    add :加法。格式与sub类似。
    ret :返回。实际返回地址是当前call对应的下一行代码,这个返回的地址一般会在call执行时被压入堆栈。
    call:调用函数。

    1 call的本质相当于push+jmp      ret的本质相当于pop+jmp

    如果需要在堆栈中分配4个4字节长整型的空间,则用esp减去4*4=16即可。

    同时,也可以用add来恢复。常用于分配函数局部变量空间。


    mov 数据移动指令,或者说数据复制命令。
    用法是 mov 移到哪(到哪去),移动谁(从哪来)

    xor 异或指令,通常用于代替mov eax,0

    lea指令
    lea edi,[ebp-0cch] 表示将[ebp-0cch]数据单元对应的内容赋值给edi
    不过,lea取的是地址,也就是说,相当于mov edi,ebp-0cch(注意,这条指令是不能被执行的,这里只是用来作说明而已)

    stos指令:
    先来看看上次实验的代码

    1 mov ecx,30h
    2 mov eax,0ccccccch
    3 rep stos dword ptr es:[edi]

    stos是串存储指令,它的功能是将eax中的数据放入edi所指的地址中(edi中内容为地址),同时,edi会增加4字节数(dword表示4字节),执行到ecx的值为零为止。这里的stos其实是stosd,对应的还有stosb、stosw,分别对应处理4、1、2个字节,这里对堆栈中30*4(0c0h)个字节初始化为0cch(也就是int3指令的机器码),这样发生意外时执行堆栈里面的内容会引发调试中断。

    jmp 无条件跳转,有去无回
    jg 大于时跳转
    gl 小于是跳转
    jge 大于等于时跳转
    cmp 比较(相减比较)

  • 相关阅读:
    <![CDATA[文本内容]]>
    Java对于表达式中的自动类型提升
    oracle循环语句
    Recastnavigation 创建 off-mesh link 的潜规则
    CritterAI 翻译 Configuration Parameters
    ndk-build 修改输出so位置 (change ndk-build output so lib file path )
    C# List<> Find相关接口学习
    C++ sizeof(struct) 的注意
    Unity使用Resources读取Resources路径下的二进制文件(Binary Data)必须使用 .bytes扩展名
    C++ ifstream ofstream 注意事项
  • 原文地址:https://www.cnblogs.com/tk091/p/2471942.html
Copyright © 2011-2022 走看看