Muchos compiladores de C/C++ permiten ensamblador embebido que no es otra cosa que crear pequeñas partes o bloques en ensamblador dentro de otro lenguaje, en este caso C++. Raro es programar completamente en asm porque lleva mucho trabajo y sólo es necesario para partes puntuales que requieren un alto rendimiento y eficiencia.
Para trabajar directamente con el hardware se usan muchas veces sistemas mapeados de memoria. Esta técnica consiste en reservar un espacio de memoria compartido con el periférico o dispositivo conectado al ordenador o computadora. Por ejemplo, hace años en el PC, antes de las tarjetas gráficas 3D, uno podía escribir/leer directamente en la memoria de vídeo (direcciones de memoria mapeadas como la 0xA000 o algo así), y esos datos luego por hardware la tarjeta los pasaba a la pantalla.
https://es.wikipedia.org/wiki/E/S_mapeada_en_memoria