Rutinas hibridas Ensamblador c++

George
17 de Mayo del 2006
Muy buenos dias.

Tengo una rutina hibrida en ensamblador para c++, estoy trabajando en c++ builder de borland, es la siguiente rutina

_asm{
MOV DX, 60H
MOV AL, 0EEH
OUT DX, AL
IN VAL, DX <---- esto no se si este bien
}

en laparte de IN y OUT me dice "Illegal Instruction"

Lo que quiero hacer es mandar el valor 0EEH a el puerto 60H para que el procesador del teclado me devuelva el mismo valor, tengo entendido que es como una herramienta de diagnostico. Se supone que me tiene que devolver el mismo 0EEH, pero no se como leer o guardar lo que me manda.

Y en esta otra:

_asm{
MOV AX, 0
INT 0x33
MOV VAL, AX
}

Sale error cuando va allamar ala interrupcion 0x33, no tengo idea de porque. Tambien esta en c++ Builder de Borland.

Saludos y gracias por su ayuda.

hiei
17 de Mayo del 2006
La insturccion IN trabaja sobre AL o AX pero no sobre una variable asi que siq uieres leer un byte de un puerto haces:
...
IN AL, DX
MOV VAL, DX
...

Sobre la int 33 del DOS (servicio del raton) te dire que en Windows no existe... (aunque programes para consola en Borland C++ estas en una consola de Windows, es un programa que solo puede acceder a las API de Windows y DOS no existe alli) desgraciadamente debes usar las API de Windows o las clases que te proporciona Borland C++ para trabajr con el raton (como es un ambiente protegido, no puedes acceder directamente al hardware)

Te abiso que si lo ejecutas sobre Windows XP las instrucciones IN y OUT daran errores al ejecutarse...

vienvenido al infierno amigo...

Saludos

George
17 de Mayo del 2006
Problema resuelto, con la libreria Inpout32.dll, se puede accesar a los puertos en win XP facilmente,
gracias
saludos

George
17 de Mayo del 2006
Olvide decir que es C++ Builder 6 de borland

cya

George
17 de Mayo del 2006
y lo mando llamar de un boton para probarlo, la idea es poner un timer cada 1 segundo.