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