Pufff, vamos a ver chiquillo. Es que en Windows NT, 2000, 2003 o Xp la memoria es virtual. Cada proceso tiene la memoria asignada que no es en absoluto la física. Simplificando, si tu intentas acceder a la dirección 4000, el Sistema Operativo te lo impide por que estas fuera del rango. Y si por cualquier razón, es imposible pero es un ejemplo, tu programa se ejecutara en el rango de la dirección 0000 a la FFFFFFF, cuando accedes a la 4000 no estas accediendo a la dirección física 4000, si no una dirección dentro de tu memoria que el SO ha asignado a tu proceso. De hecho, si tu lanzas 20 procesos distintos hechos por ti, y mostraras en una ventana en que dirección están corriendo, verías que todos te muestran la misma dirección de inicio. Eso no quiere decir que el código este en la misma dirección.
Y respondiendo a tu pregunta, para acceder al puerto COM1 lo debes hacer usando el API Windows te suministra.
Otra manera es acceder al driver.
Otra es crearte un driver que hable directamente con el puerto. Y para esto ultimo, debes llamar a unas funciones que te mapean la dirección física 4000 en tu espacio de direcciones, y luego acceder a esa dirección virtual que el SO te devuelve.
La ultima opción es en modo usuario, no en modo kernel, mapearte las direcciones en tu espacio de memoria y acceder a ella.
[email protected]