任何情况下,在寄存器的使用上,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

BASM遵循的规则的更多相关文章

  1. 实现GetHashCode时要遵循的规则

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:实现GetHashCode时要遵循的规则.

  2. bug提交遵循的规则

    在提交缺陷时,需要遵循以下5个原则: 准确性:缺陷每个组成部分描述准确,不会产生误解,减少“异常”“正常”等模糊词的使用 完整性:复现该缺陷完整的步骤.截图.日志 一致性:按照一致的格式书写全部缺陷信 ...

  3. 为什么 RMAN 控制文件自动备份的名称格式没有遵循 %F 规则

    在 Oracle 中越是简单的问题,往往越难找到答案,举个例子: 你是否留意观察过在 RMAN 进行备份的时候,自动生成的控制文件名称是否是按照 %F 规则来生成的? 关于控制文件自动备份路径格式,在 ...

  4. 关系型数据库遵循ACID规则

    事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性: 1.A (Atomicity) 原子性原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的 ...

  5. Delphi内嵌汇编语言BASM精要(转帖)

    1 BASM概念简要  汇编语句由指令和零至三个表达式构成.表达式由常数(立即数).寄存器和标识符构成.例如: movsb        // 单指令语句 jmp @Here    // 一个表达式: ...

  6. PHP 面向对象编程和设计模式 (5/5) - PHP 命名空间的使用及名称解析规则

    PHP高级程序设计 学习笔记 2014.06.12 命名空间概述 PHP 在 5.3.0 以后的版本开始支持命名空间.什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这 ...

  7. c++中头文件include规则浅析[译]

    英文原文地址 在开发大型的软件项目时,头文件需要得到恰当的管理,甚至在c中也会面临这种问题,当我们用c++开发时,头文件的管理会变得更复杂,更加耗费我们的时间去管理,下面我将讲一些包含规则来简化这个苦 ...

  8. 【CSS】class和id命名规则

    说明,本篇内容为书籍<高流量网站CSS开发技术>的学习总结,文字出自书本 书不错,推荐阅读学习 也可参阅网上的博文 原载:彬Go链接:http://blog.bingo929.com/cs ...

  9. 编写PHP规则

    PHP是运行在服务器端的语言,可以动态生成html页面.这篇博客介绍它的一些编码规则. 一.基本规则 1.PHP代码总是用<?php和?>包围,例如 <?php echo " ...

随机推荐

  1. .net sql 防注入 httpmodule

    1 新建一个类,实现IHttpModule接口 using System; using System.Collections.Generic; using System.Linq; using Sys ...

  2. heap size eclipse 堆内存

    可以根据eclipse 或 myeclipse heapstats 使用情况调整堆内存大小,heap size 设置,-vmargs-Xms256-Xmx1024 ,其中Xms表示初始值,Xmx表示最 ...

  3. JavaScript 类型转换

    在 JavaScript 中有 5 中不同的数据类型: string number boolean object function 3 种对象类型: Object Date Array 2 个不包含任 ...

  4. Careercup - Microsoft面试题 - 5673934611546112

    2014-05-10 23:26 题目链接 原题: what is the best,worst and average case complexity for fibonacci no.s ..ex ...

  5. 15、android 用toast实现简单的进度显示

    if(mtoast!=null) { mtoast.setText(progress); } else { mtoast=Toast.makeText(getApplicationContext(), ...

  6. Django RequestContext用法

    模版中的变量由context中的值来替换,如果在多个页面模版中含有相同的变量,比如:每个页面都需要{{user}},笨办法就是在每个页面的请求视图中都把user放到context中.   from d ...

  7. Codeforces Beta Round #69 (Div. 1 Only) C. Beavermuncher-0xFF 树上贪心

    题目链接: http://codeforces.com/problemset/problem/77/C C. Beavermuncher-0xFF time limit per test:3 seco ...

  8. bzoj 2761 平衡树

    裸地平衡树,只需要用到find操作 /**************************************************************     Problem:     U ...

  9. Net数值计算MathNet.Numerics类库

    一.Net自带的数值计算:System.Numerics 1.大整数BitInteger 方法:除数和余数.最大公约数 2.复数Complex 属性:实部.虚部.量值.相位 方法:共轭.倒数 二.Ma ...

  10. UML对象图(转载)

    概述: 对象图都来源于类图,依赖类图对象图. 对象图表示一个类图的一个实例.类图和对象图的基本概念是相似的.对象图也代表了一个系统的静态视图,但这种静态视图是系统在某一时刻的一个快照. 对象图是用于呈 ...