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
BASM遵循的规则的更多相关文章
- 实现GetHashCode时要遵循的规则
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:实现GetHashCode时要遵循的规则.
- bug提交遵循的规则
在提交缺陷时,需要遵循以下5个原则: 准确性:缺陷每个组成部分描述准确,不会产生误解,减少“异常”“正常”等模糊词的使用 完整性:复现该缺陷完整的步骤.截图.日志 一致性:按照一致的格式书写全部缺陷信 ...
- 为什么 RMAN 控制文件自动备份的名称格式没有遵循 %F 规则
在 Oracle 中越是简单的问题,往往越难找到答案,举个例子: 你是否留意观察过在 RMAN 进行备份的时候,自动生成的控制文件名称是否是按照 %F 规则来生成的? 关于控制文件自动备份路径格式,在 ...
- 关系型数据库遵循ACID规则
事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性: 1.A (Atomicity) 原子性原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的 ...
- Delphi内嵌汇编语言BASM精要(转帖)
1 BASM概念简要 汇编语句由指令和零至三个表达式构成.表达式由常数(立即数).寄存器和标识符构成.例如: movsb // 单指令语句 jmp @Here // 一个表达式: ...
- PHP 面向对象编程和设计模式 (5/5) - PHP 命名空间的使用及名称解析规则
PHP高级程序设计 学习笔记 2014.06.12 命名空间概述 PHP 在 5.3.0 以后的版本开始支持命名空间.什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这 ...
- c++中头文件include规则浅析[译]
英文原文地址 在开发大型的软件项目时,头文件需要得到恰当的管理,甚至在c中也会面临这种问题,当我们用c++开发时,头文件的管理会变得更复杂,更加耗费我们的时间去管理,下面我将讲一些包含规则来简化这个苦 ...
- 【CSS】class和id命名规则
说明,本篇内容为书籍<高流量网站CSS开发技术>的学习总结,文字出自书本 书不错,推荐阅读学习 也可参阅网上的博文 原载:彬Go链接:http://blog.bingo929.com/cs ...
- 编写PHP规则
PHP是运行在服务器端的语言,可以动态生成html页面.这篇博客介绍它的一些编码规则. 一.基本规则 1.PHP代码总是用<?php和?>包围,例如 <?php echo " ...
随机推荐
- urllib3 PoolManager
A pool manager is an abstraction for a collection of ConnectionPools.If you need to make requests to ...
- [shell基础]——if/for/while/until/case 语句
for语句 do echo $loop done ` do echo $loop done for loop in `ls /tmp` do echo $loop done while语句 while ...
- [uwp开发]数据绑定那些事(2)
接着上一篇来侃. 二.实体到控件之间的绑定 这儿不知道用实体这个词恰不恰当,凑活着理解就行了.他可以是一个类实例,也可以是一个集合. 所以,相应的我们就引入两个Demo,第一个介绍用简单的类作为作为数 ...
- Hdu 1009 FatMouse' Trade 分类: Translation Mode 2014-08-04 14:07 74人阅读 评论(0) 收藏
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 聊一聊js中的null、undefined与NaN
零.寒暄 翻翻自己的博客,上一篇竟然是六月26号的,说好的更新呢?回顾刚刚过去的这个七月,整天都是公司的入职培训加上自己的小论文,每天奋战到凌晨1点多,这是要挂的节奏啊!但是不论怎么说,自己的时间管理 ...
- How Big Is A Petabyte, Exabyte, Zettabyte, Or A Yottabyte?
一个关于Byte递增的描述,蛮有趣的! Bytes -> Kilobyte -> Megabyte -> Gigabyte -> Terabyte -> Petabyte ...
- 解决IE不支持position:fixed问题
#box { /* 非IE6浏览器使用固定元素 */ position:fixed; top:0; left:0; /* IE6改为绝对定位,并通过css表达式根据滚动位置更改top的值 */ _po ...
- hadoop安装问题
1. 运行start-dfs.sh启动HDFS守护进程,start-yarn.sh面向YARN的资源器和节点管理器,资源管理器web地址是http://localhost:8080/.输入stop.d ...
- Ruby探针的基本实现原理
李哲 - MAY 13, 2015 语言本身 Ruby语言支持语法级别的系统,框架,甚至语言本身的方法复写,一般叫做元编程(meta programming), 此基础之上还有一些术语为mixin,方 ...
- 由浅入深了解Thrift之客户端连接池化续
前文<由浅入深了解Thrift之客户端连接池化>中我们已经实现了服务调用端 连接的池化,实现的过于简陋,离实际的项目运用还很遥远.本文将在进一步改造,主要是两方面:1.服务端如何注册多个服 ...