2012-02-24 241 views
7

请我已经这个代码GCC内联汇编件转换一个GCC内联汇编德尔福内联汇编

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

和我的德尔福的尝试是:

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

请是正确的?

+5

我的建议是将此代码转换为Pascal而不是汇编程序。 – 2012-02-24 12:07:35

回答

10

内联汇编程序在德尔福中的工作方式与在GCC中的工作方式不同。对于初学者来说,你没有同类型的德尔福宏观和模板支撑,所以如果你想使用一个声明,一旦通用汇编程序,你必须将其声明为一个函数:

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} 

在Delphi中,内联汇编程序必须在使用它的地方实现,并且只支持32位。在这样的模块中,您可以自由使用EAX,ECX,EDX以及周围代码中的任何标识符。例如:

var 
    lValue: LongInt; 
    lShift: Byte; 
begin 
    // Enter pascal code here 
    asm 
    mov cl,lShift 
    sar lValue,cl 
    end; 
    // Enter pascal code here 
end; 
+0

非常感谢亨里克Hellström,我将根据您的宝贵 答案重新启动。 谢谢 – Alexis 2012-02-24 12:53:52

+2

@Alexis请仔细阅读这个http://meta.stackexchange.com/questions/5234/,然后考虑接受这个答案,并回答一些你以前的问题 – 2012-02-24 14:10:06

+0

修复了我原来的答案中的一个错误。 SAR是一个有符号操作,所以aValue参数应该是LongInt而不是LongWord。 – 2012-02-24 14:57:25