2011-12-04 38 views
4

我試圖得到一個標籤的地址的地址 - 這裏是一些示例代碼:內聯彙編使用C來的Turbo C 3.0 - 如何讓一個標籤

int main() { 
    asm { 
     mov ax,1 
     mov bx,ax 
    } 
    _labelname: 
    asm { 
     mov ax, OFFSET _labelname 
    } 

    return 0; 
} 

這段代碼的編譯返回此錯誤:「未定義的符號_labelname」 如果我定義ASM塊的標籤,我甚至不能使用 JMP _labelname

我發現this並不起作用,爲this,沒辦法實際。 This說只是跳躍,不處理。而this根本沒有幫助。有什麼建議麼?

+0

您是否嘗試在實際的_asm塊中設置標籤? – Cyclonecode

+4

問了20年太晚了。請更新您的編譯器。 –

+0

@Krister是的,試圖在asm塊中定義;它仍然不起作用。 – Mikael

回答

0

我已經找到一種方法,但你不能使用C標籤,它必須是一個ASM標籤:

int main(void) 
{ 
    asm { 
     mov ax,1 
     mov bx,ax 
    } 

    asm { _labelname: } 

    asm { 
     mov ax, OFFSET _labelname 
     jmp cs:_labelname 
    } 

    return 0; 
} 
+0

爲什麼會倒下投票? OP想要它,OP得到了它。 –

+0

你可能因爲它不適用於Turbo C 3.0而被低估。我只是試了一下。 –

+0

它與Turbo C++ 1.01 + TASM一起工作。編譯器通過TASM切換到編譯。 3.0還應該有-B選項通過彙編程序進行編譯,例如'tcc.exe -v -y -B lab.c'(-v和-y用於調試信息,以便可以檢查TD中生成的.EXE文件。 EXE很容易)。 –

0

通常會有任何語言的路線,但你需要faff約一兩天,因爲這些東西並不總是被記錄在內

聲明一個全局內存操作空間在你的味道HLL。 DIM LABELNAME1(0)

然後搜索這使地址到EAX

mov eax, ^LABELNAME(0) 
mov eax, dword [_lablename] 
mov eax, ^_lablename 
etc etc etc 

然後彈出它在ASM

你不會找到pop [^對谷歌的任何地方ASM語法,但它是一個,這在某些工作高級語言

push eax 
pop [^LABELNAME1(0)] 

現在你HLL和ASM可以聊天對方,只要你喜歡

所以這是非常值得搞清楚


Undefined symbol _labelname 

Probbly需要在程序

._labelname 
mov dword [_lablename], 0 

最開始的聲明,並通過ASM作爲標籤

以後使用正如我所說,你不得不瞎搞,爲你的特定HLL味道而拼命,並且全球化似乎最有效果

您還需要弄清楚如何申報單獨的內存區儲存ASM動態變量和運行操作碼,否則你會得到緩存覆蓋,這將削弱ASM

一個小程序,我寫的速度優勢不分離這些區域需要20個小時才能運行。隨着分離它耗時1小時


mov ax, OFFSET _labelname 

這是16位的東西,(DOS等,與愚蠢的記憶規則)不是你做的32位東西你HLL ???

除非這一切都在一個段發生的事情,你需要一個雙存儲操作數找到_labelnamedx:ax等,如前面提到的,你20年太晚

jmp cs:_labelname 

作品在同一網段,但對於更大的程序,CS部分需要是特定的段覆蓋和遠程跳轉/返回

此外,如果您的動態asm變量插入到您的asm代碼段中,那麼用於最大化asm速度的基本規則已被破壞