2012-02-24 42 views
7

xin vui lòng tôi đã GCC này inline lắp ráp đoạn mãChuyển đổi một nhà lắp ráp nội tuyến GCC để delphi lắp ráp nội tuyến

int src = 0; 
dword n; 
__asm(
      "sar %%cl,%%edx" 
      : "=d" (n) // saves in eax,edx 
      : "c" (src), "d" (n) // the inputs 
      ); 

và nỗ lực delphi của tôi là:

asm 
mov ecx, &src 
mov edx, &n 
sar cl,edx 
mov eax,edx 
end; 

xin là đúng?

+5

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. –

Trả lời

10

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; 
+0

cảm ơn Henrick Hellström, tôi sẽ bắt đầu lại dựa trên câu trả lời có giá trị của bạn. cảm ơn bạn – Alexis

+2

@Alexis Vui lòng đọc http://meta.stackexchange.com/questions/5234/ này và sau đó xem xét chấp nhận câu trả lời này và một số câu trả lời cho các câu hỏi trước của bạn –

+0

Đã sửa lỗi trong câu trả lời ban đầu của tôi. SAR là một thao tác đã ký, vì vậy tham số aValue phải là LongInt và không phải là LongWord. –

Các vấn đề liên quan