Lắp ráp nội tuyến không hoạt động theo cách tương tự trong Delphi như trong GCC. Để bắt đầu, bạn không có cùng một loại hỗ trợ vĩ mô và mẫu trong Delphi, vì vậy nếu bạn muốn sử dụng một thói quen lắp ráp mục đích khai báo một lần Nói chung, bạn phải khai báo nó như là một chức năng:
function ShiftArithmeticRight(aShift: Byte; aValue: LongInt): LongInt;
{$IFDEF WIN64}
asm
sar edx,cl
mov eax,edx
end;
{$ELSE}
{$IFDEF CPU386}
asm
mov cl,al
sar edx,cl
mov eax,edx
end;
{$ELSE}
begin
if aValue < 0 then
Result := not (not aValue shr aShift)
else
Result := aValue shr aShift;
end;
{$ENDIF}
{$ENDIF}
Trong Delphi, trình biên dịch nội tuyến phải được thực hiện tại chỗ nó được sử dụng, và nó chỉ được hỗ trợ trong 32-bit. Trong các khối asm như vậy, bạn có thể sử dụng EAX, ECX, EDX một cách tự do, cộng với bất kỳ số nhận dạng nào trong mã xung quanh. Ví dụ:
var
lValue: LongInt;
lShift: Byte;
begin
// Enter pascal code here
asm
mov cl,lShift
sar lValue,cl
end;
// Enter pascal code here
end;
Nguồn
2012-02-24 12:24:03
Lời khuyên của tôi là chuyển đổi mã này thành Pascal chứ không phải là bộ lắp ráp. –