hola estoy leyendo un libro de masm y dentro de los codigos de ejemplo hay uno que no me funciona:
.386
.model flat, stdcall
option casemap:none
assume fs:nothing
.code
mivariable dd 0
codigo:
mov [offset mivariable], eax
retn
nuevo dd ?
end codigo
el error es :
Citarerror A2001: immediate operand not allowed
asi me funciona:
.386
.model flat, stdcall
option casemap:none
assume fs:nothing
.data?
mivariable dd 0
.code
codigo:
mov [mivariable], 0
retn
nuevo dd ?
end codigo
en ese caso funciona perfectamente
porque no funciona esto?
gracias de antemano
Ademas de que offset ahi no tiene sentido alguno el problema es que si mivariable esta en la sección .code es de solo lectura, si intentas escribir en ella se produce una excepcion.
bueno raro que este asi pero cuando lo quito es igual
.386
.model flat, stdcall
option casemap:none
assume fs:nothing
.code
mivariable dd 0
codigo:
mov [mivariable], eax
retn
nuevo dd ?
end codigo
si sirve de algo en el ollydbg me dice acces violation when writing[direccion ] cuando llega al mov
Cita de: daryo en 2 Agosto 2014, 23:56 PMsi sirve de algo en el ollydbg me dice acces violation when writing[direccion ] cuando llega al mov
Si, como te decia el codigo es read/only, si le haces un VirtualProtect y le das escritura funciona pero no tiene mucho sentido poner variables en el codigo igual.
mmm creo que lo tenia configurado para no solo fuera read/only revisare eso y si algo vuelvo por aca :)
A menos que hagas algo con el linker por defecto la sección de codigo llamada .text tendra permisos de lectura y ejecucion, lo cual es logico.
Asi te funcionara tambien:
link x.obj /subsystem:console /section:.text,RW
Como te dijo @Eternal Idol no puedes escribir en la sección .text, y eso que quieres hacer no tiene sentido alguno, ni .data ni mucho menos en .text, haz un push eax y punto.
Un saludo.
Cita de: Eternal Idol en 3 Agosto 2014, 00:03 AM
A menos que hagas algo con el linker por defecto la sección de codigo llamada .text tendra permisos de lectura y ejecucion, lo cual es logico.
Asi te funcionara tambien:
link x.obj /subsystem:console /section:.text,RW
si tenias razon no lo tenia con RW gracias solucionado
De nadas ::)
Igual si es para comprender el funcionamiento sirve mas alla de eso el codigo en si mismo no tiene ningun sentido (las variables no van junto al codigo y EAX es un valor indefinido a esa altura).
Hola! Yo cuando uso /ALIGN:4 la sección .text se puede escribir.. no se por que.. :rolleyes:
Saludos!
Cita de: daryo en 2 Agosto 2014, 23:35 PM
hola estoy leyendo un libro de masm y dentro de los codigos de ejemplo hay uno que no me funciona:
.386
.model flat, stdcall
option casemap:none
assume fs:nothing
.code
mivariable dd 0
codigo:
mov [offset mivariable], eax
retn
nuevo dd ?
end codigo
el error es :
asi me funciona:
.386
.model flat, stdcall
option casemap:none
assume fs:nothing
.data?
mivariable dd 0
.code
codigo:
mov [mivariable], 0
retn
nuevo dd ?
end codigo
en ese caso funciona perfectamente
porque no funciona esto?
gracias de antemano
Probaste definir la variable como
LOCAL ?
.386
.model flat, stdcall
option casemap:none
assume fs:nothing
.code
local mivariable:DWORD
codigo:
mov mivariable, eax
retn
nuevo dd ?
end codigo
Vaagish: con MASM32 me da LINK : warning LNK4108: /ALIGN specified without /DRIVER or /VXD; image may not run y efectivamente en Windows 8.1 x64 no me funciona. Fijate con dumpbin si .text tiene permisos de escritura en tu caso ...
MCKSys Argentina: no ensambla, tiene que estar dentro de un PROC (o MACRO), en principio deberia funcionar (usando la pila) pero no explica el problema en cuestion.
CitarVaagish: con MASM32 me da LINK : warning LNK4108: /ALIGN specified without /DRIVER or /VXD; image may not run y efectivamente en Windows 8.1 x64 no me funciona. Fijate con dumpbin si .text tiene permisos de escritura en tu caso ...
Tnks por la prueba.. en xp y 7 de 32 bits me funciona.. creo que el problema es en x64 de cualquier versión..
Trate con esto que pusiste ahi:
Citar/subsystem:console /section:.text,RW
CitarLINK.EXE /SECTION:.text,rw /SUBSYSTEM:CONSOLE /RELEASE /VERSION:4.0 /LIBPATH:"$L" /OUT:"$5",3
Desde RadASM, no importa el orden que le de..
Pero me dice:
Citarfatal error LNK1104: cannot open file "rw /SUBSYSTEM:CONSOLE /RELEASE /VERSION:4.0 /LIBPATH:C:\Masm32\Lib /OUT:$5.obj"
EDIT: Ta, problema de RadASM.. funciona perfecto..
Saludos!
Te falta el archivo objeto de input ;D Igual RadASM no es mas que un IDE, para probar algo asi usa la linea de comandos, ya despues cuando lo tengas funcionando lo integraras en la configuracion del IDE.
PD. Asumo que cambiaste el nombre a la sección de codigo por defecto.
CitarTe falta el archivo objeto de input ;D Igual RadASM no es mas que un IDE, para probar algo asi usa la linea de comandos, ya despues cuando lo tengas funcionando lo integraras en la configuracion del IDE.
PD. Asumo que cambiaste el nombre a la sección de codigo por defecto.
Jeje si, había puesto mal el nombre.. ademas el IDE no funciona donde hay una coma
Saludos! ;D
Esto me compila y funciona bien (WinAsm):
.386
.model flat, stdcall
option casemap:none
.code
codigo:
jmp codigo1
mivariable dd 0
codigo1:
mov mivariable, eax
ret
end codigo
Assemble:/c /coff /Cp /nologo
Link: /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0 /SECTION:.text,ERW
Saludos!
Logico, la sección es RW, esta esa la razon para que funcione o no, tener o no permisos de escritura en la sección donde se pone la variable. Aunque esto ya estaba demostrado y sin el salto, simplemente haciendo que el entry point sea posterior ...