Podes compilar el código escrito en C, lo que genera su correspondiente código objeto, luego compilar el código escrito en ASM, obteniendo así otro código objeto, y luego enlazarlos en un único archivo binario, donde las funciones escritas en C pueden ser llamadas desde las funciones escritas en ASM y viceversa. En teoría esto permite mezclar muchos lenguajes y sacar provecho a sus características particulares, pero infelizmente las convenciones de llamadas y el formato de los objetos no es estándar, lo que entre muchos otros problemas, hacen que esto no sea siempre posible. Casi todos los compiladores permiten hacer esto, tienes que leer un poco el manual, por sobre todo por el tema del paso de parámetros.
Te paso un ejemplo para SDCC.