Delphi was once a great and popular Pascal programming language, but after years of bad management and false promises, developers just abandoned it
in favor of more fashionable languages like C#.
One of the main criticisms was the lack of support for 64-bit computing. But now, things have really changed under the management of Embarcadero (which took over the company
from CodeGear, which had taken it from Inprise, which in turn had done the same from Borland).
I have been testing the new Delphi XE2 for a couple of days. One thing I have no doubts right now is that Embarcadero was able to gather
a fantastic team of coders and come up with a great product. There are really amazing features, and I am pretty sure most of them are not being properly advertised to developers.
Well, marketing and documentation are important and coders were never great guys for that, so I hope Embarcadero can assemble other teams of guys/girls to produce decent
documentation and to show the developers how great the product is. This is probably more important than doing marketing near the board of directors of companies.
During my tour with Delphi XE2, I was particularly surprised with the 64-bit BASM facility. Well, I started as an Assembly Language nerd in my old days and still
can not resist to experiment a bit when the opportunity arises.
With BASM, we can mix Assembly Language with Delphi code in the same source file (even inline in the same function for 32-bit BASM).
Microsoft Visual Studio allows as well the mix of C/C++ with Assembly Language but only in 32-bit code. So, Embarcadero won here because
it supports both 32-bit and 64-bit. Really amazing.
I know there are limitations in BASM, there are also many limitations with the Microsoft inline Assembly Language and, of course, for very complex
Assembly Language parts, it is still better to compile in a separate file and link all together.
Using the code
I have prepared a small demonstration program were BASM is called from Delphi. It will compile both in 32-bit and 64-bit. The program is simple
although more advanced than most samples you can find in the internet. The program shows as well how you can return a large amount of information from the call, in this case an array.
One thing you will notice immediately by looking at the code below is that 32-bit Assembly Language is totally different from 64-bit Assembly Language.
So, if you want to port 32-bit routines to 64-bit, forget about that and start new ones from scratch.
Here is the source code (you can download the full source code for the demo program from the provided link):
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
TBasmTest = class(TForm)
procedure btGoClick(Sender: TObject);
myReturnString : string = 'I am back in Delphi!';
charCount : integer;
bigarray = array[0..127] of char;
function assemblyTestFunction(myCaption: string; myText : string): bigarray;
push dword ptr 0
push dword ptr myCaption
push dword ptr myText
push dword ptr 0
mov edi, ecx;
mov esi, dword ptr myReturnString
mov ecx, [charCount]
sub rsp, 28h
xor r9, r9
mov rbx, rcx
mov rax, rdx
mov rdx, r8
mov r8, rax
xor rcx, rcx
mov rdi, rbx
mov rsi, qword ptr myReturnString
mov ecx, [charCount]
add rsp, 28h
procedure TBasmTest.btGoClick(Sender: TObject);
retValue : bigArray;
charCount := length(myReturnString);
retValue := assemblyTestFunction(edCaption.Text, edInput.Text);
Jose Pascoa is the owner of AtelierWeb Software (http://www.atelierweb.com). We produce security and network software and mixed utilities since 1999. The first program I published (in a BBS) was a MS-DOS utility, had the size of 21 KB and was done in Assembly Language. Nowadays, my low level languages are more likely to be "C", "C++" and "Delphi" rather than Assembly Language but I still like it. I have nothing against more fashionable languages like C# and technologies like WPF, actually I have played with them and published software with them.