2015-01-06 180 views
2

是否有編譯器開關我沒有看到這會讓我忽略彙編程序函數中的彙編程序關鍵字?忽略彙編程序函數的彙編程序關鍵字

我是怎樣做到現在,使用例如從FPC文檔:

function geteipasebx : pointer;assembler;   
asm   
  movl (%esp),%ebx   
  ret   
end; 

如何,我想做到這一點:

function geteipasebx : pointer; 
asm   
  movl (%esp),%ebx   
  ret   
end; 

可以這樣做?

編輯:
編譯源文件PSUB.PAS線170:

{ do we have an assembler block without the po_assembler? 
    we should allow this for Delphi compatibility (PFV) } 
if (token=_ASM) and (m_delphi in current_settings.modeswitches) then 
    include(current_procinfo.procdef.procoptions,po_assembler); 

{ Handle assembler block different } 
if (po_assembler in current_procinfo.procdef.procoptions) then ... 

我相信自由帕斯卡的源代碼,這部分意味着這隻能在{$ MODE DELPHI}來完成。

回答

2

是的,這是可以做到的。您必須將編譯器兼容性模式設置爲DELPHI,並將asm語法重新定義爲ATT,因爲模式DELPHI將覆蓋它爲INTEL

更較具體來說,該程序:

program Project1; 
{$MODE DELPHI} 
{$ASMMODE ATT} 
function geteipasebx : pointer; 
asm 
    movl (%esp),%ebx 
    ret 
end; 

var 
    p: pointer; 
begin 
    p := geteipasebx; 
end. 

編譯和運行正常。

+0

哦,真有意思,謝謝!有沒有辦法做到這一點,但在{$ MODE FPC}?我嘗試了一堆{$ MODESWITCH}選項,但沒有找到一個能夠在FPC模式中省略此關鍵字而非DELPHI模式的選項。 – Marladu

+1

我不認爲DELPHI模式只是一組編譯器開關:**彙編器**屬性可能類似於** specialize **關鍵字,沒有開關,它是方言。但我可能是錯的。 –

+0

我會等一兩天,以防有人在接受你的答案之前弄清楚這一點。我已經能夠使用各種編譯器開關將{$ MODE DELPHI}的所有功能添加到{$ MODE FPC}中,但這完全沒有必要,但這會讓編碼更易讀。 – Marladu