假设我编写了一些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 ++构造函数/解构器。所以这根本不会帮助我。
有什么想法吗?
答案 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