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

  • 相关阅读:
    jenkins(3): jenkins执行shell命令
    jenkins(2): jenkins定时构建项目
    jenkins(1): jenkins安装以及从gitlab拉取代码
    gitlab之一: gitlab安装配置使用
    playbook role应用
    Spark(一)—— 大数据处理入门
    Kafka(二) —— Server端设计原理
    Kafka(一) —— 基本概念及使用
    LeetCode 第 159 场周赛
    LeetCode 第 155 场周赛
  • 原文地址:https://www.cnblogs.com/goodloop/p/214559.html
Copyright © 2011-2022 走看看