Programación General > ASM (Ensamblador)
Problema En Masm
JuanK:
Saludos,
no he usado MASM nunca y recien lo estoy utilizando, he tratado de ensamblar un còdigo sencillo pero me arroja un error:
prog.asm(20) : error A2070: invalid instruction operands
No se que pueda ser ya que ese mismo codigo finciona perfectamente en NASM (haciendo las modificaciones pertienentes), este es el còdigo:
--- Código: Text --- .486.model tiny .datacad db "prueba",0.code imprimir:mov ah,0ehcaracter:lodsbcmp al,0jz fincharint 10hjmp caracterfinchar:ret _start:cldmov SI,cad call imprimirend _start
Eternal Idol:
Hay mas de un problema en este planteamiento, el primer problema lo podes solucionar cambiando el .486 por .186, lo segundo que veo es que definis diferentes secciones de codigo cuando en realidad un .COM no tiene cabeceras ni secciones sino datos binarios. Tambien veo que este ejecutable no define el origen a 0100h como debe hacer todo .COM y que empieza su ejecucion en imprimir. Eso lo podes comprobar facilmente con el depurador de MS-DOS (debug.com).
Sin cambiar demasiado asi funciona:
--- Código: Text --- .186.model tiny Codigo segment 'code'org 0100h _start:cldmov SI, offset cadcall imprimirret imprimir:mov ah,0ehcaracter:lodsbcmp al,0jz fincharint 10hjmp caracterfinchar:ret cad db "prueba",0 Codigo ends end _start
:devil:
JuanK:
--- Citar ---cambiando el .486 por .186
--- Fin de la cita ---
para que hago esto?
--- Citar --- lo segundo que veo es que definis diferentes secciones de codigo cuando en realidad un .COM no tiene cabeceras ni secciones sino datos binarios. Tambien veo que este ejecutable no define el origen a 0100h como debe hacer todo .COM
--- Fin de la cita ---
bueno es que no quiero hacer un COM por eso omiti lo del 0100h y agregue segmentos adicionales y quiero hacerlo con asm de 32 bit no con asm de 16 como lo tenia en NASM.
--- Citar ---mov SI, offset cad
--- Fin de la cita ---
que hace offset?
donde puedo conseguir un BUEN manual de MASM?
los que he visto son pateticos...
Eternal Idol:
--- Cita de: "JuanK" ---para que hago esto?
--- Fin de la cita ---
Para que no te de el error al cual haces mencion en el mensaje inicial.
--- Cita de: "JuanK" ---bueno es que no quiero hacer un COM por eso omiti lo del 0100h y agregue segmentos adicionales y quiero hacerlo con asm de 32 bit no con asm de 16 como lo tenia en NASM.
--- Fin de la cita ---
Entonces hay muchos mas errores que no eran aparentes. El primero es que el modelo .tiny no existe en un Sistema Operativo de 32 bits como Windows que solo tiene un modelo de memoria plana.
El segundo y mucho mas importante es que no podes acceder a esa interrupcion de la BIOS ni usar punteros de 16 bits (mov si, cad) en modo protegido. En sintesis ese codigo es para 16 bits.
:smartass:
JuanK:
eso lo explica todo, o sea que tendria que hacerlo con la 21H supongo,
este era el codigo de 16 bits en nasm:
--- Código: Text ---[ORG 0X0100][BITS 16]jmp INICIO IMPR:mov AH, 0EhSIGCHAR:lodsb; carga SI en AL, e incrementa SIcmp AL, 0; verifica fin de cadenajz FININT 10Hjmp SIGCHAR ;FIN IMPR INICIO:mov SI,cadenacall IMPRFIN:ret;FINALcadena db "JuanK",0
Si quisiera hacer codigo de 32 bit sin usar el OS.. e decir digamios que estoy haciendo un OS y que no uso ningun compilador de C nio de C++ sino que solo quiero asm..
como puedo hacer ese mismo proceso en 32 bit?
Navegación
[#] Página Siguiente
Ir a la versión completa