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

  • 相关阅读:
    复合文档(Compound Document)读写栗子
    JavaScript修改IE注册表
    mysql_real_connect 端口号说明
    _beginthreadex创建线程,立即执行?
    Access 是/否 字段
    JavaScript格式化日期输出
    STM32-串行SPI nor
    全球唯一标识符:GUID在线生成
    如何交叉编译Python到ARM-Linux平台(转)
    CMOS Sensor的调试经验分享(转)
  • 原文地址:https://www.cnblogs.com/goodloop/p/214559.html
Copyright © 2011-2022 走看看