Как я могу использовать GCC для добавления кода ассемблера в программы? - PullRequest
0 голосов
/ 19 июля 2011

Предположим, я пишу некоторый код на 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: и первой строкой? Цель состоит в том, чтобы установить все регистры в 0, прежде чем запускать любой ассемблерный код, который был создан с помощью газа из кода c. Это сделано для установки значений по умолчанию в регистре, что требуется для конкретного процессора, с которым я работаю.

Я думал об использовании компоновщика gcc и пользовательского объектного файла для сборки проекта с моим пользовательским кодом впереди, но я не знаю, есть ли у меня такая возможность с компоновщиком.

Я подумал об использовании crtbegin.asm, но я думаю, что это на самом деле предназначено для поддержки конструкторов / деконструкторов C ++. Так что это мне совсем не поможет.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 22 июля 2011

Я выясняю, как именно это сделать:

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

TARGET_ASM_FUNCTION_PROLOGUE вставит любой код, который вам нужен, прямо в main, прежде чем будет выпущен любой другой код.Я оставляю этот ответ здесь, чтобы любой, кто ищет этот вопрос, мог получить ответ.:)

0 голосов
/ 20 июля 2011

Вы можете использовать встроенную сборку, asm(" ... "), сразу после определения main ().Тем не менее, это может фактически появиться после того, как GCC настроит указатель стека.

Другой вариант - передача файла сборки вашему компоновщику.Убедитесь, что вы передаете его как первый объект при связывании.

Поместите в него что-то вроде этого:

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

// Jump to main
jsr main
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...