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位程序代码的兼容,不会报错