如何使用GCC将汇编代码添加到程序中?

时间:2011-07-19 16:35:39

标签: gcc

假设我编写了一些c代码,它会生成一些如下所示的程序集:


.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

如何在main:和第一行之间注入更多的汇编代码? 目标是在运行通过c代码生成的气体生成的任何汇编代码之前,将所有寄存器设置为0。这样做是为了默认寄存器的值,这是我正在使用的特定处理器所需的。

我已经考虑过使用gcc链接器和自定义对象文件将项目与我的自定义代码组合在一起,但我不知道我是否具有链接器的那种功能。

我考虑过使用crtbegin.asm,但我认为这实际上意味着支持C ++构造函数/解构器。所以这根本不会帮助我。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我弄明白该怎么做:

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

在发出任何其他代码之前,

TARGET_ASM_FUNCTION_PROLOGUE会在main内部粘贴您想要的任何代码。我在这里留下这个答案,所以搜索这个问题的任何人都可以得到答案。 :)

答案 1 :(得分:0)

您可以在main()定义之后立即使用内联汇编asm(" ... ")。但是,这可能实际上是在GCC设置堆栈指针后显示的。

另一种选择是将程序集文件传递给链接器。确保在链接时将其作为第一个对象传递。

把这样的东西放进去:

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

// Jump to main
jsr main