zoukankan      html  css  js  c++  java
  • asm基础拾遗

    在x86中有8个32位寄存器 EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP
    其中ESP和EBP涉及函数的entry和exit的操作,一般不用于应用程序级的编程。
    剩下的6个寄存器分成两种:
    1 EBX,ESI,EDI为必须受保护寄存器,使用前要push,使用后要pop
    2 EAX,ECX,EDX可以供编程自由临时使用。

    EDI和ESI不可进行字节级操作,但可以使用DI和SI(为EDI和ESI的低16位)

    成套使用的指令:PUSHAD,POPAD    PUSHFD,POPFD

    内存中的数据互相拷贝不可以直接用
    ! mov mVar, lpMem      ; this fails, no opcode to do it.
    因为x86没有对应的操作符。
    可以考虑这两种方案
    1  通过空闲的寄存器
          ! mov eax, lpMem      ; copy memory value into register.
          ! mov mVar, eax      ; copy register into memory value.
    2  通过stack,但慢一些
          ! push lpMem            ; push memory value onto the stack.
          ! pop mVar            ; pop it back off as another memory value.


    STACK使用
    当进行压栈操作PUSH时,首先是将栈指针ESP减小操作数的大小,然后将操作数  的数值存入堆栈。出栈操作POP反之。
    要注意stack的平衡性 也就是push和pop的数据的占用的字节数一致(大多数情况下是必须的)。
    但可以这样使用。
    PUSH eax
    ...
    ...
    pop ax
    pop cx

  • 相关阅读:
    Eclipse consle 输出语句中,误输中文,假死问题
    Eclipse 快捷键 (最实用)
    mysql 4种启动方式
    mysql索引的类型和优缺点
    Windows上 使用Composer安装tp5
    php 更新配置文件
    可视化工具连接Linux上的redis
    HttpClient 4 教程 第3章 HTTP状态管理
    HttpClient 4 教程 第2章 连接管理
    HttpClient 4 教程 第1章 基础
  • 原文地址:https://www.cnblogs.com/goodloop/p/214559.html
Copyright © 2011-2022 走看看