Murphy的记事本

若教眼底无别离,不信人间有白头
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

BASM基础实例(一、基本概念)

Posted on 2009-08-27 20:12  Murphy(土豆)  阅读(395)  评论(0编辑  收藏  举报

  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异常。