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

    // // ViewController.swift // UILabelTest // // Created by mac on 15/6/23. // Copyright (c) 2015年 fa ...

  2. [转] Matlab中给信号加高斯白噪声的方法

    MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN.WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声. 1. WGN:产生高斯白噪声 y = ...

  3. iOS9新系统下APP Store 应用上传新指南

    一 iTunes Connect介绍 iTunes Connect是面向iOS应用开发人员的苹果门户网站,供开发人员管理其应用,跟踪下载情况.今年1月份闹得沸沸扬扬的iTunes Connect BU ...

  4. shell if判断的种类

    if [ $# != 1 ] ; then echo "USAGE: $0 TABNAME" echo " e.g.: $0 CDR_CALL_20040701" ...

  5. java提供了native2ascii工具

    可以使用这个工具,把中文编码称为ascii码 在命令行输入native2ascii 输入中文 得到数据

  6. Convert Sorted Array to Binary Search Tree

    Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascending ord ...

  7. 四则运算程序扩展:将程序改为java语言,并允许用户输入,对输入结果进行验证

    题目 每个同学选一个方向,把程序扩展一下:1.让程序能接受用户输入答案,并判定对错.最后给出总共对/错 的数量.2.把程序变成一个网页程序,用户通过设定参数,就可以得到各种题目.3.把程序变成一个Wi ...

  8. 【Python】网络编程

    1.TCP编程 2.SocketServer模块 3.Twisted框架 4.UDP编程 1.TCP编程--TCP是面向连接的,其一般的设计如下: # encoding:utf-8 ''' Creat ...

  9. UIFontFamily

    Family: Hiragino Kaku Gothic ProN W3     Font: HiraKakuProN-W3 Family: Courier     Font: Courier     ...

  10. android adb: wireless debug

    http://developer.android.com/tools/help/adb.html#wireless