BASM基础实例(一、基本概念)
堆是一块内存区域,一般用于内存的动态分配和释放
栈是一种先进后出的列表数据结构,在高级语言的编程中使用广泛,在低级语言中更是不可
或缺的基础概念。栈也是一个内存区域,不过它具有快速灵活的特点,CPU直接提供指令去访问栈。
EBP、ESP、BP和SP都称为指针寄存器,主要用于存放堆栈内存储单元的偏移量,
用它们可实现多种存储器操作数的寻址方式
EBP是基址指针寄存器: 一般用来确认堆栈帧的起始位置,也就是指向栈底。
ESP是栈指针寄存器: 指向当前线程的栈顶。
整型数据:8位的用AL返回,16位的用AX返回,32位的用EAX返回。
BYTE(8位): BYTE、CHAR、SHORTINT、BOOLEAN
WORD(16位): SMALLINT、WORD
DWORD(32位): INTEGER、LONGWORD、ANSISTRING、POINTER、CLASS、LONGINT、STRING
ST(0): SINGLE、DOUBLE、EXTENDED、COM
实型:用ST(0)返回
指针:用EAX返回
长字符串:用EAX返回其所在地址
变量:可用@Result返回
16进制的表示方式:
如果是0-9开头的16进制值直接在后面加H或在前面加$号,如:1AH,$1A
如果是字母开头的前面加0再在后面跟H,或者直接用$号,如:0AH,$A
几个修饰符:
OFFSET 返回内存地址中的立即数
[....] 返回内存地址,与OFFSET相反,如:
MOV EAX,OFFSET [XXXX]=MOV EAXX,[OFFSET XXXX]=MOV EAX,XXXX
HIGH 返回高8位的立即数
LOW 返回低8位的立即数
& 防止变量与汇编中的寄存器同名而在前面加& 号,如:
EAX:INTEGER; ...
MOV &EAX,10H 这里的&EAX不是EAX寄存器
. .号的一种用法:
var
STR: Word; ..
MOV DL,STR.Byte或DL,Byte(STR)
调用规则:
Register
Delphi默认的调用规则,效率非常高,但规则很复杂,下面是它的简要规则:
1. 头三个不大于4个字节(DWORD)的参数从左到右的传入EAX,EDX,ECX寄存器;接下去的参数按从左到右压栈。
2. 浮点数总压栈,不管它所占的字节是多少。
3. 对象方法总是有一个Self隐含参数,这个参数在所有的参数前面,即总是传给EAX。
Stdcall
Windows API的标准调用规则,效率不高,但规则很简单:参数总是从右向左地压栈。
Cdecl
这是C语言的标准调用规则,在Delphi中很少需要用到这种规则,但Delphi仍然提供了支持。
与stdcall类似,参数总是从右向左地压栈。
Safecall
Safecall常用于COM,Delphi作了很多处理,使得函数返回值小于0时,自动抛出异常。
1. 任何Safecall函数,都可以转换成等价的Stdcall函数。
2. 函数返回时,Delphi自动检查其返回值,如果小于0,就引发reSafeCallError异常。