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 " ...
随机推荐
- UIWebView swift
// // ViewController.swift // UILabelTest // // Created by mac on 15/6/23. // Copyright (c) 2015年 fa ...
- [转] Matlab中给信号加高斯白噪声的方法
MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN.WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声. 1. WGN:产生高斯白噪声 y = ...
- iOS9新系统下APP Store 应用上传新指南
一 iTunes Connect介绍 iTunes Connect是面向iOS应用开发人员的苹果门户网站,供开发人员管理其应用,跟踪下载情况.今年1月份闹得沸沸扬扬的iTunes Connect BU ...
- shell if判断的种类
if [ $# != 1 ] ; then echo "USAGE: $0 TABNAME" echo " e.g.: $0 CDR_CALL_20040701" ...
- java提供了native2ascii工具
可以使用这个工具,把中文编码称为ascii码 在命令行输入native2ascii 输入中文 得到数据
- Convert Sorted Array to Binary Search Tree
Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascending ord ...
- 四则运算程序扩展:将程序改为java语言,并允许用户输入,对输入结果进行验证
题目 每个同学选一个方向,把程序扩展一下:1.让程序能接受用户输入答案,并判定对错.最后给出总共对/错 的数量.2.把程序变成一个网页程序,用户通过设定参数,就可以得到各种题目.3.把程序变成一个Wi ...
- 【Python】网络编程
1.TCP编程 2.SocketServer模块 3.Twisted框架 4.UDP编程 1.TCP编程--TCP是面向连接的,其一般的设计如下: # encoding:utf-8 ''' Creat ...
- UIFontFamily
Family: Hiragino Kaku Gothic ProN W3 Font: HiraKakuProN-W3 Family: Courier Font: Courier ...
- android adb: wireless debug
http://developer.android.com/tools/help/adb.html#wireless