2011-07-19 142 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

相关问题