Профессор хотел бы, чтобы мы запрограммировали часть программы, используя ассемблерный код, а затем он хотел бы, чтобы мы назвали этот код из программы C, а затем вернемся к программе C, когда она будет завершена. Кажется, я не могу найти документацию. Я использую плату Dragon12, которая использует 68HC12, если это имеет значение. Не похоже, что он хочет, чтобы мы использовали встроенную функцию asm().Как вызвать код сборки из файла C в CodeWarrior?
ответ
Вы можете вызвать функцию, определенную в сборке, как любую нормальную функцию на C (при условии, что вы используете правильное соглашение о вызове), просто убедитесь, что тип возвращаемого значения и аргументы совпадают. Например, если сборка выглядит следующим образом:
my_func:
; assembly code here
; some more assembly code
; etc.
xor ax, ax
ret
Тогда вы можете вызвать его из C следующим образом:
extern int my_func();
// ...
int zero = my_func();
Самый простой способ узнать правильный способ вызова вашей функции просто написать функцию в C с теми же аргументами и возвратом, выполняющую минимальную работу внутри (доступ к каждому аргументу, заполнение значения результата) и компиляцию для ассемблера. Определите, как выполняется каждая из операций, которые вас интересуют, и вы настроены.
Меню справочная документация для CodeWarrior Development Studio 10.5 описывает, как назвать чистые функции ассемблера внутри C код/C++ следующим образом:
метки, заданные в файле сборки имеют локальную область видимости. Чтобы получить доступ к ним из другого файла (файл .c), они должны быть помечены как глобальные. Например, .global _my_asm_func
.
Для иллюстрации приведем пример фрагмент кода:
.global _my_asm_func
.text
_my_asm_func:
subq.l #4,a7
move.l d1,(a7)
add.l (a7),d0
addq.l #4,a7
rts
В вашем C код/C++, сначала объявить прототип функции. Например, int my_asm_func(int a, int b);
. Затем вызовите эту функцию, как и любую другую функцию C/C++. Например, my_asm_func(5, 2);
.
Обратите внимание, что в коде сборки функция имеет префикс с подчеркиванием, но в C/C++ это не так. Я не уверен, что это требуется, или просто соглашение.
Параметры передаются в последовательные регистры данных. В этом случае вы ожидаете найти 5
в D0
и 2
в D1
.
Вопрос давно, но ответ может по-прежнему помогать.
Для Kinetis MCU и gcc, , возможно, следующий фрагмент может проиллюстрировать возможность. (Это было частью моего обработчика ошибок) Ниже в прерывании PE_ISR используется встроенный ассемблер для вызова функции FaultHandlerAsm , которая, в свою очередь, также является встроенным ассемблером. В конце он переходит в c-функцию «faultHandlerC», которая здесь не включена.
void FaultHandlerAsm(void)
{
__asm volatile (
" movs r0,#4 \n"
" movs r1, lr \n"
" tst r0, r1 \n"
" beq _MSP \n"
" mrs r0, psp \n"
" b _HALT \n"
"_MSP: \n"
" mrs r0, msp \n"
"_HALT: \n"
" ldr r1,[r0,#20] \n"
" b FaultHandlerC \n"
//" bkpt #0 \n"
);
}
PE_ISR(Cpu_INT_Hard_FaultInterrupt)
{
__asm( " b FaultHandlerAsm \n");
}
- 1. Как я могу вызвать функцию сборки из другого файла сборки?
- 2. Как вызвать функцию сборки из C++ динамически?
- 3. Как вызвать функцию C из сборки?
- 4. Как вызвать макрос c из процедуры сборки?
- 5. Код цикла C из сборки
- 6. Как я могу вызвать функцию сборки из C-кода?
- 7. Код сборки в C++
- 8. Как написать код сборки из C#?
- 9. Как вызвать код MATLAB из Objective C
- 10. Как вызвать код R из C++
- 11. Как вызвать код C# из dll Fortran
- 12. Как вызвать код C# из JavaScript
- 13. Как вызвать код Java из C#?
- 14. (C++) Как вызвать структуру из другого файла?
- 15. Можно вызвать код C++ из C#?
- 16. Как вызвать функцию C от сборки
- 17. Вызвать и скомпилировать код C из пакетного файла?
- 18. Как вызвать функцию Cpp из файла C
- 19. Как вызвать функции C из файла .js
- 20. Как вызвать функцию C++ из внешнего файла?
- 21. Как вызвать код C# в C++
- 22. Код воина Код сборки
- 23. C-код для сборки
- 24. CodeWarrior 10.6 Ошибка компоновщика
- 25. код сборки функции c
- 26. Как сгенерировать код сборки (* .s) из модуля ядра (* .c)?
- 27. Понять код сборки в c
- 28. Реверсированный оптимизированный код c из сборки
- 29. Схема файлов проекта CodeWarrior xml?
- 30. MIPS - вызов функции C в код сборки
Звучит так, как будто он хочет, чтобы вы написали свой код сборки, чтобы использовать соглашение о вызове C для своей платформы, чтобы вы могли объявить его как внешнюю функцию в своей программе на C. – Neil
Существует замечательная техническая заметка по этому вопросу, вы должны иметь ее где-то в своей установке Codewarrior в формате pdf. В противном случае выполните поиск на сайте Freescale. – Lundin