zoukankan      html  css  js  c++  java
  • Win32汇编基础1

    1.关于寄存器
    Windows 在内部频繁使用 ESI,EDI,EBP,EBX 寄存器,而且并不去检测这些寄存器的值是否被更改,所以如果要使用这些寄存器时必须先保存它们的值,待用完后再恢复它们

    eax 是WIN32 API 默认的返回值存放处。
    ecx 是LOOP指令自动减一的寄存器,也就是一半用来计数,比如使用rep指令时,也是比较CX的值。
    esp 是堆栈指针,指向栈顶。
    ebp 经常用来在堆栈中寻址。
    esi 好像常常用在指针寻址中。

    edi 是目的地址寄存器。

    2.关于堆栈

    Windows为每个程序安排了堆栈段,它是从高地址向低地址延伸的,之所以采用这种方式,是因为这样可以使堆栈指针始终指向最近入栈的元素的起始地址,这样的话,为访问这个元素提供了非常便利的方式。

    ESP作为堆栈指针始终指向栈顶,如果看一下PUSH和POP的操作就可以明白这句话:
    PUSH: ESP <-- ESP-4 (ESP+3,ESP) <-- 入栈元素
    POP: 出栈元素 <-- (ESP+3,ESP) ESP <-- ESP+4

    因为PUSH和POP自动修改了ESP的值,使它始终指向栈顶了。当然也可以自己来修改ESP的值,例如我们可以:

    sub  esp,4  ;这样就把栈顶指针向下移动了。
    这种操作常常用在局部变量的分配中,在子程序中使用到局部变量时,就在堆栈中为它们提供空间,这样可以使子程序退出时收回局部变量占用的空间,有利于子程序的模块化。

    我们可以用ESP来寻址堆栈中的元素,比如ESP指向当前栈顶元素的起始地址,ESP-4指向前一个元素的起始地址,不过因为ESP常常在变化,这样用ESP在堆栈中寻址的话不方便,所以我们就用EBP来代替ESP寻址,首先把EBP入栈保存,然后把ESP赋值给EBP,这样就可以用EBP来寻址堆栈中的数据了。我用一个例子来说明堆栈的变化。

    push  0x00000001           ;1
    push  ebp                  ;2
    mov  ebp,esp               ;3
    push  0x12345678           ;4
    mov  eax,dword ptr[ebp+4]  ;5
    mov  ebx,dword ptr[ebp-4]  ;6
    mov  ax,word ptr[ebp-2]    ;7
    mov  al,byte ptr[ebp-1]    ;8
    mov  al,byte ptr[ebp-3]    ;9
    mov  ax,word ptr[ebp-3]    ;10

    5 eax=0x00000001
    6 ebx=0x12345678
    7 ax=0x1234
    8 al=0x12
    9 al=0x56
    10 ax=0x3456

    堆栈使用在子程序的实现中,当调用子程序时,首先把参数入栈,然后把返回IP入栈,然后转移到子程序处,如果有局部变量,则下移ESP,然后初始化该局部变量,这样用到EBP来寻址局部变量,参数的寻址同样要用到EBP。

  • 相关阅读:
    Step by step Dynamics CRM 2013安装
    SQL Server 2012 Managed Service Account
    Step by step SQL Server 2012的安装
    Step by step 活动目录中添加一个子域
    Step by step 如何创建一个新森林
    向活动目录中添加一个子域
    活动目录的信任关系
    RAID 概述
    DNS 正向查找与反向查找
    Microsoft Dynamics CRM 2013 and 2011 Update Rollups and Service Packs
  • 原文地址:https://www.cnblogs.com/ht-beyond/p/3919043.html
Copyright © 2011-2022 走看看