• Viernes 26 de Abril de 2024, 18:32

Autor Tema:  Combinacion invalida de opcode y operandos  (Leído 1697 veces)

Death_13

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Combinacion invalida de opcode y operandos
« en: Lunes 17 de Noviembre de 2008, 18:56 »
0
Hola ya hacia tiempo que no me surgia una duda con mis trabajos en c y asm, bueno tengo una duda, estoy tratando de resolver el siguiente problema:
"Autogenerar el codigo de un alumno tomando como datos los dos primeros caracteres del apellido paterno y el segundo y tercer caracter del apellido paterno"

esto es algo mas o menos asi:
Suponiendo que la entrada es esta:
Death Hell Arise

el codigo a generar quedaria de la siguiente manera:
Heri

y pues lo estaba haciendo muy tranquilo hasta que me surgio este error para ser precisos en el bloque de asm "combinacion invalida de opcode y operandos"

el codigo que estoy construyendo es el siguiente:

#include <conio.h>
#include <stdio.h>

void main (void)
{
clrscr();
int aux;
char nombre[40], ap_p[15], ap_m[15];

printf("Nombre?n");
gets(nombre);
printf("Apellido Paterno?n");
gets(ap_p);
printf("Apellido Materno?n");
gets(ap_m);

printf("Tu nombre es:%s ",nombre);
printf("%s ",ap_p);
printf("%s ",ap_m);

Ap_Pat:
asm mov cx,1
asm{
mov si,0
mov ax,ap_p[si] <-- Aqui me aparece el error T_T
inc si
push cx
}
asm pop cx
asm loop Ap_Pat



getch();
}

y no se por que, se supone que lo que quiero hacer es mover el indice si a la posicion 0 que seria la posicion del primer caracter del apellido paterno y de hay mandarla a ax, creo que el problema esta en que ax no guarda letras o no se, si me pueden hechar una mano se los agradecere, el programa no esta terminado pro pues hay me trabe por que ya no puedo continuar, no pido que lo terminen solo me gustaria que me dijeran como puedo destrabarlo por asi decirlo jeje, salu2 y gracias de antemano  :hola:

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Combinacion invalida de opcode y operandos
« Respuesta #1 en: Lunes 17 de Noviembre de 2008, 19:21 »
0
Tu problema radica en que no puedes asignar el registro SI como índice del vector en una intrucción de ensamblador, porque el ensamblador lo considera un índice de direccionamiento y éste no se puede usar con una dirección de memoria (ap_p es un puntero). Carga primero ap_p en AX y ve sumándole lo que quieras con usando AX[SI] que equivaldría a lo que quieres hacer. ¡Recuerda siempre que ensamblador no es un lenguaje de alto nivel!

P.D: mi consejo es que lo hagas todo en C. Más legible y el ensamblador genera código óptimo para algo tan sencillo.