Programación General > ASM (Ensamblador)

 Cambiar el estado de los LEDs del teclado.

<< < (2/2)

posman:
Para enviar datos a algun puerto en ensamblador, se utiliza in y out

out 60h, 0EDh

En C creo que se utilizan inport/inportb/outport/outportb, pero no estoy seguro

Sporeman:
Pues sí, Windows (XP SP3) me cierra inmediatamente cualquier programa que intente hacer nada con el puerto 60h. En el mejor de los casos, no hace nada.

Como parece que bajo windows no voy a conseguir mucho, he instalado el MS-Dos en una máquina virtual. En MS-Dos y con el debug he creado tres programas muy similares entre sí. Ahí va el código del "nums":


--- Código: Text --- 16D2:0100   mov ax,ed16D2:0103   out 60,ax16D2:0105   mov ax,216D2:0108   out 60,ax16D2:010A   mov ax,4c16D2:010D   int 21 
Así funciona exactamente como yo quiero. El 2 es, como os imaginareis, el segundo bit, 2^(n-1)

He probado también con turbo C,

--- Código: Text --- void main () {      asm mov ax,0xED;      asm out 0x60,ax;      asm mov ax,7; //Todos los leds encendidos      asm out 0x60,ax;}  
E igual, funciona en MS-Dos puro (el virtual PC), pero no en Windows. Me parece que con el modo protegido hemos topado.  :argh:  :hitcomp:

m0skit0:
En Windows (y en Linux) un programa no puede acceder a direcciones de memoria que no le pertenezcan. Lo que sí puede hacer (que es lo que tú haces en Linux con ioctl) es pedirle al SO que ejecute ciertas acciones. Lo que tú buscas es la API de Windows que modifique esos LEDs: SetKeyboardState() y GetKeyBoardState(). Suerte programando estas llamadas en ensamblador...

Eternal Idol:
http://en.wikipedia.org/wiki/IOPL

Hilo muy relacionado.

En sintesis no deberias intentar acceso directo al hardware (o memoria fisica) bajo Windows (o cualquier S.O. moderno, 32/64 bits) sino usar la API como bien te indico m0skit0. Usar la API de Windows desde assembly es muy simple, empujas los parametros a la pila (push) y llamas a la funcion (call), incluso hay una directiva en MASM (y creo que otros ensambladores la soportan) llamada invoke que simplifica esto a una linea tipo C:


--- Código: Text ---push param3push param2push param1call Funcion 

--- Código: Text ---invoke Funcion, param1, param2, param3 

m0skit0:
Una nota: si vas a pasar los parámetros por ensamblador, fíjate bien (como pone Eternal Idol) que tienes que meter los parámetros en la pila en orden inverso a cómo los pide la API (o cualquier función).

Navegación

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa