64位BASM学习随笔(一)



64位BASM学习随笔(一)

    Delphi的BASM一直是我最喜爱的内嵌汇编语言,同C/C++的内联汇编相比,它更方便,更具灵活性,因为C/C++的内联汇编只能是或插入式的汇编代码,函数花括号背后隐藏的函数框架,限制了汇编代码的发挥,如无论有无参数和局部变量,总是有个栈框架,更烦人的是只要你在函数中使用了esi,edi,ebx寄存器,就自动给你保存和恢复,使得这些寄存器没法在函数之间传递信息等;而Delphi的BASM可以是插入式的汇编代码,也可是完全的汇编方法,在完全的汇编方法下,怎么发挥就是自己的事了。
    Delphi XE2后就可以编写64位应用程序了,但我一直没时间试一下64位的BASM代码有无变化,春节前后抽时间研究了一下,发现64位的BASM变化还是很大的,不仅仅是简单的寄存器位数更长的问题,而是整个BASM方法的框架(不只是BASM,而是整个64位计算机应用程序框架)都发生了根本性的变化,从编写程序代码的角度而言,这种变化似乎比以前16位程序向32位程序进阶时更大。
    一、64位BASM不支持插入汇编代码,只能写纯BASM方法。如下面的代码是错误的:

function Test(v: Integer): Integer;
var
  i: Integer;
begin
  i := v * v;
  asm
    mov   eax, i
  end;
end;

    只能这样写:

function Test(v: Integer): Integer;
asm
  mov   eax, v
  imul  eax, eax
end;

    二、64位BASM只支持一种调用方式,不论你标明stdcall,pascal,cdecl与否,调用方式都是寄存器参数传递,清栈由调用方法负责(与cdecl类似)。这种变化不只是BASM,好像整个64位程序都是这样,只有一种调用方式。stdcall,pascal,cdecl调用说明只是对32位程序代码的兼容,不会报错

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值