errores al compilar asm

Iniciado por Drewermerc, 3 Mayo 2014, 22:15 PM

0 Miembros y 4 Visitantes están viendo este tema.

Drewermerc

muchas gracias eternal idol.
esta muy interesante los tutos y bueno pues ya pude ensamblar.
bueno quisiera preguntarte lo siguiente.
1.-¿se puede ensamblar el codigo de masm en nasm?
2.-¿quisera saber si cuales la estructura para imprimir por consola es que quisiera saber hacerlo tanto en consola como por gui?
3-¿todos los programas sigues esta sintaxis como la de los tutos que me pasate o cambia?
4.-como quiero aprender asm para despues inciarme en ingieneria inversa quisiera saber si ¿aprendiendo a ensamblar de este modo despues podria intepretar cualquier programa desensamblado?
por que e visto que loscodigo se pueden pueden esribir diferente pero hacen lo mismo o solo con la experencia ire dandoe de todos esos detalles.

Eternal Idol

Que yo sepa, no, aunque no use mas que un par de veces NASM:
http://www.nasm.us/doc/nasmdoc2.html#section-2.2

Hay que usar la API de Windows: GetStdHandle con STD_OUTPUT_HANDLE y WriteConsole.

No se a que sintaxis en particular te referis, esos tutoriales son para MASM ...

Si, las diferencias no son tan grandes como para no entender un codigo.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Drewermerc

hola gracia spor la respuestas.
bueno pues estuve buscando lo que me dijiste y encontre este ejemplo y me compila pero cuando lo ejecuto no imprime nada nose si me podrias ayudar a correjirlo y acompletarlo para que lea datos y lo buelba a imprimir y s i no es mucha molestia que me digas como funciona el codigo que agreges.


.386

.model flat,stdcall

option casemap:none


include \masm32\include\windows.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\kernel32.lib 

.data
;se declara la variable con el texto hello world con salto de linea y final de cadena
output db "Hello World!", 0ah, 0h 

.code
start:

;le indicamos que seba a usar el estandar de salida
; getstdhandle como tiene tres  tipos de opcion y aqui se indica que se usara el de salida
invoke GetStdHandle, STD_OUTPUT_HANDLE
;aqui es la linea que no entiendo bien se que se escribe en la patalla con writeconsole  y se supone que eax es un acumulador se guarda hay y luego nose por que usan sizeof ebx y NULL
invoke WriteConsole, eax, addr output, sizeof output, ebx, NULL

invoke ExitProcess, 0

end start


bueno espero que me puedas ayudar y gracias de nuevo y si me equivoco en algo corregeme porfavor.

Eternal Idol

#13
En el registro EAX esta el valor de retorno de GetStdHandle. sizeof calcula el tamaño de la cadena en cuestion. No entiendo la razon de usar EBX en ese contexto. ¿Cual es su valor? Es indefinido y ahi tenes que poner un puntero a un DWORD:

 _Out_       LPDWORD lpNumberOfCharsWritten,
lpNumberOfCharsWritten [out]
   A pointer to a variable that receives the number of characters actually written.

Código (asm) [Seleccionar]
.data
...
written dd 0
...
invoke WriteConsole, eax, addr output, sizeof output, offset written, NULL


Todo esto es basicamente uso de la API de Windows, no esta relacionado con assembly necesariamente, asi que primero busca en la MSDN la documentacion de las funciones de consola y practica con C/C++ si tenes problemas.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Drewermerc

hola Eternal Idol.
bueno gracias entonces revisar los tutoriales y me pondre en practica gracias por todo nos vemos saludos.

Eternal Idol

De nadas, con el arreglo del EBX ya deberia funcionar (ejecuta el programa desde cmd sino se te va a cerrar la consola automaticamente sin ver nada).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Drewermerc

hola perdon pero no teentendi bien eso de con el arreglo ebx deberia de funciona.
nose si me pueda explicar.
y bueno si cuando ejecuto el programa no me muestra nada segun y buscando encontre que me faltaba iniciar el stout con allocConsole yahora si me habre rapido la consola y segun yo el codigo queda asi.

Código (asm) [Seleccionar]

.386

.model flat,stdcall

option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib 

.data
;se declara la variable con el texto hello world con salto de linea y final de cadena
output db "Hello World!", 0ah, 0h 
;data
;written dd 10
.code
start:
  invoke AllocConsole
invoke GetStdHandle, STD_OUTPUT_HANDLE

invoke WriteConsole, eax, addr output, sizeof output, offset written, NULL
invoke ExitProcess, 0

end start

Eternal Idol

Si el SUBSYSTEM es CONSOLE no hace falta llamar a AllocConsole, y en este caso deberia serlo. Asi genere el ejecutable yo:
ml /Cp /coff console.asm /link /subsystem:console

Ahora con ejecutarlo desde cmd.exe (tecla de Windows + R, cmd) deberias ver la cadena.

PD. Ahi en tu codigo tenes comentado written por ejemplo.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Drewermerc

hola si es cierto mi error fue que yo al momento de likear lo ponia asi.
SYSTEM:WINDOWS
Y ERA COMO TU ME DIJISTE
SYSTEM:CONSOLE.

muchas gracias nos vemos saludo.

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón