zoukankan      html  css  js  c++  java
  • BASM遵循的规则

    任何情况下,在寄存器的使用上,BASM遵循如下的规则:
     ASM 语句执行过程中,必须保存EDI、ESI、ESP、EBP、EBX 的值(5个寄存器,意思是可以用,但最后得恢复成原模原样)
    ASM 语句可以任意使用EAX、ECX、EDX(三个参数寄存器,也许是编译器提前帮我们存放了三个寄存器的值,并给予恢复)
     一个ASM 代码块开始时,EBP 指向当前堆栈,ESP 指向栈顶(这个当然,EBP=Base)。
     SS 存放堆栈段的段地址;DS 存放数据段的段地址;CS 存放代码段的段地址(不知道SS和DS何时用得上)。
     通常情况下,段地址寄存器满足如下条件:SS=ES=DS(看来DS一统江湖)。
     如果需要,函数总是以EAX(32 位)、AX(16 位)或AL(8 位)作为返回值的寄存器(这个简单)。

    Delphi 的例程入口参数有以下几种:
    procedure TestProc(I : Integer); // 值参数
    procedure TestProc(var I : Integer); // 变量参数
    procedure TestProc(const I : Integer); // 常数参数
    procedure TestProc(out I : Integer); // 输出参数

    对于值参数,必要的情况下,编译器会生成一段代码,用于创建值参数的一个备份并用它的地址替换入口参数的地址。除此之外,值参数与常数参数使用相同规则:
    如果传入的数据长度小于或等于4Bytes(这存在一些例外,如Int64,好像是分成劈成两份分别放到一个寄存器里),则直接传值
    否则传值的(对于值参数来说,是值的备份的)内存地址


    在不违背上述寄存器使用规则和例程参数传递规则的前提下,Delphi 支持5 种调用约定:
    register 由左至右,例程自身清除参数,Delphi默认
    pascal 由左至右,例程自身清除参数,向下兼容
    cdecl 由右至左,调用者清除参数,C/C++模块交互
    stdcall 由右至左,例程自身清除参数,WINAPI
    safecall 由右至左,例程自身清除参数,WINAPI/COM

    --------------------------------------------------------------------------

    另外关于那个堆栈的生长模型,从这里可以观察:

    function StdWndProc(Window: HWND; Message, WParam: Longint; LParam: Longint): Longint; stdcall; assembler;
    asm
            XOR     EAX,EAX
            PUSH    EAX
            PUSH    LParam // 即 ESP = ESP - 4
            PUSH    WParam
            PUSH    Message
            MOV     EDX,ESP
            MOV     EAX,[ECX].Longint[4]
            CALL    [ECX].Pointer
    	// 如果说栈的高地址在上面的话,那么就是向下生长(一般采用这种说法)
    	// 如果说栈是高地址在下面的话,那么就是向上生长
    	// 但是由于push之后是栈顶数值变小,因此不能以低地址为基数去想象模型(无论上下),必须以高地址为基础模型
            ADD     ESP,12 // 手动恢复栈平衡,是地址加12,可见的每次push都是地址减去4
            POP     EAX
    end;
    

    其中:
    EBP = Base Pointer,所以保持不变,至少也是使用前要备份,使用后恢复
    ESP = Stack Pointer,随时变化的栈顶指针
    打个比喻:
    把当前栈想象成海平面,那么ESP就是一个海平面的浮标,每次放一个元素上去(push),那么就把ESP往下压一格,POP那是更形象,从海里冒泡出来一个元素。
    正好海平面的基址是0,海平面以下就是负数,这样也是向下生长,地址模型都一致(把海平面的基址改成2G)。

    --------------------------------------------------------------------------

    参考:
    http://lqcros.blog.hexun.com/60879045_d.html
    http://dennishomepage.gugs-cats.dk/BASM-filer/BASMForBeginners.htm
    http://www.kansoftware.ru/?tid=5097
    http://www.phatcode.net/res/260/files/html/MixedLanguageProgramming2.html
    http://www.programmershare.com/350217/
    http://www.cnpack.org/showdetail.php?id=528&lang=zh-cn
    http://dennishomepage.gugs-cats.dk/BASM-filer/BASMForBeginners.htm
    http://kruglinski.bokee.com/4272896.html
    http://bbs.2ccc.com/topic.asp?topicid=359733
    http://www.delphifans.com/softview/softview_1163.html

    CSDN:
    http://download.csdn.net/user/kaixingba/uploads/6
    http://download.csdn.net/detail/kaixingba/4489455
    http://download.csdn.net/detail/kaixingba/4489440
    http://download.csdn.net/detail/kaixingba/4489436

    小例子:
    http://club.topsage.com/thread-2261089-1-1.html
    http://www.zzzyk.com/show/b035d97f69902e79.htm

    Delphi 5开发人员指南》第十三章
    http://ftp.cs.istu.ru/public/docs/other/_New/Books/Lang/Delphi/Delphi%20Developer's%20Guide/Ebooks/d5dg/chapter13.pdf
    http://maurette.thomas.free.fr/index.php?chapitre=livres/livre_4602/tdm.htm
    http://bjaman.blog.sohu.com/201500060.html
    http://wenku.baidu.com/view/f5b8e480b9d528ea81c779f2.html

    其它论坛:
    http://fastbasm.blogspot.fr/
    www.masmforum.com
    http://www.programmershare.com/350217/

    http://www.asmedu.net/bbs/forum.jsp
    http://bbs.csdn.net/forums/ASM

  • 相关阅读:
    一个购物网站的思路设计分享
    B/S和C/S的区别(转)
    TreeSet
    计算出给你一个随机乱敲的一个字符串最多的一个
    JavaScript来实现打开链接页面(转载)
    js小数计算小数点后显示多位小数(转)
    java中使用 正则 抓取邮箱
    浅谈 正则表达式
    jQuery中each()、find()、filter()等节点操作方法
    Xcode插件VVDocumenter Alcatraz KSImageNamed等安装
  • 原文地址:https://www.cnblogs.com/findumars/p/4113897.html
Copyright © 2011-2022 走看看