2011-07-19 59 views
0

假設我寫一些C代碼,並生成一些組件是這樣的:如何使用GCC將彙編代碼前綴到程序上?

 

.text 

main: 
    mvs $r3, $sp 
    addi $r3, $r3, -16 
    mvs $sp, $r3 
    mvs $r3, $sp 
    addi $r3, $r3, 3 
    shri $r3, $r3, 2 
    shai $r3, $r3, 2 
    call __main 
    sti 8($r3), 25 
    sti 4($r3), 23 
    sti ($r3), 43 
L2: ld $r4, 8($r3) 
    ld $r5, 4($r3) 
    add $r4, $r4, $r5 
    st 8($r3), $r4 
    ld $r4, 8($r3) 
    ld $r5, 4($r3) 
    sub $r4, $r4, $r5 
    st ($r3), $r4 
    jmp L2 

我怎麼能注入更多的彙編代碼,就在主之間:和第一線? 目標是在運行通過c代碼生成的任何彙編代碼之前,將所有寄存器設置爲0。這是爲了默認寄存器的值,這是我正在使用的特定處理器所需的。

我想過使用gcc鏈接器和一個自定義對象文件來組裝我的自定義代碼在前面的項目,但我不知道我是否有與鏈接器的那種能力。

我曾考慮過使用crtbegin.asm,但我認爲這實際上意味着支持C++構造函數/解構器。所以這根本不會幫助我。

任何想法?

+0

它會工作,只是將其作爲內聯彙編代碼插入C代碼文件中?或者甚至在'main'函數啓動之前就必須發生? –

+0

理想情況下,它應該發生在主函數內部,但在生成的代碼之前。我發現你可以使用以下代碼注入代碼:TARGET_ASM_FILE_START,但它也發生在.text之前,我認爲這是錯誤的/錯誤的。 – RGroppa

回答

1

我弄清楚究竟是如何做到這一點:

http://www.dis.com/gnu/gccint/Function-Entry.html

TARGET_ASM_FUNCTION_PROLOGUE會堅持你想在那裏裏面主要的任何代碼,之前的任何其他代碼被髮射。我在這裏離開這個答案,所以任何其他搜索這個問題的人都可以得到答案。 :)

0

您可以在main()定義之後使用內聯彙編,asm(" ... ")。但是,GCC設置堆棧指針後可能實際顯示。

另一種選擇是將彙編文件傳遞給鏈接器。確保在鏈接時將其作爲第一個對象傳遞。

把下面的內容在裏面:

// Clear registers 
move 0, $r0 
move 0, $r1 

// Jump to main 
jsr main 
+0

這是真的,不幸的是,需求需要它甚至在堆棧指針設置之前發生。 – RGroppa

+0

啊,我明白了。剛剛編輯我的文章與另一個建議。 – kcbanner

相關問題