elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Examen de Ensamblador [Ayuda]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Examen de Ensamblador [Ayuda]  (Leído 11,132 veces)
Alpha1020

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Examen de Ensamblador [Ayuda]
« en: 27 Octubre 2009, 06:24 am »

Bueno me han pedido que desarrolle un programa en Ensamblador que haga lo siguiente:

1.- Desarrolle una macro llamada lenstr que tenga como argumento la etiqueta a un arreglo de bytes, la macro deberá contar el número de caracteres que tiene el arreglo hasta encontrar un CTRL/D, la macro deb regresar el número de caracteres del registro DX.


2.- Crear dos arreglo myarreglo que contenga "este arreglo tiene 20 caracteresª" y el arreglo cuenta que contenga "ejemplo de arregloª", a donde ª es el carácter CTRL/D:
Dada la macro anterior contar los caracteres del arreglo myarreglo y cuenta y sumar la longitud de los dos arreglos en AX.

3.- Desarrollar el punto 1 como un procedimiento al cual se le pasa en el stack la dirección del arreglo y regresa BX la cuenta de caracteres.

4.- De acuerdo al punto 2 llamar la función lentsr y sumar la longitud del arreglo myarreglo y cuenta en el registro DX.


He desarrollado el siguiente código:
.ASM
Código:
.386
.model flat,stdcall
option casemap:none
.stack

include examen.inc
include \MASM32\macros\macros.asm

lenstr macro

LOCAL myarreglo


endm

.code
inicio:
invoke lstrcat,addr myarreglo ,addr cuenta
invoke lstrlen,addr myarreglo
invoke wsprintf,addr buffer,addr fmo,eax
mov edx , eax
invoke MessageBox,NULL,addr buffer,addr MsgTitulo,MB_OK + MB_ICONINFORMATION
invoke ExitProcess,0
mov ebx , edx

add edx , ebx

end inicio

.INC
Código:
include windows.inc
include user32.inc
include kernel32.inc

includelib user32.lib
includelib kernel32.lib

.data
myarreglo db "este arreglo tiene 20 caracteresª",0
cuenta db "ejemplo de arregloª",0

MsgTitulo db "Programa en Assembler",0

fmo db "la longitud de nuestra cadena es %d caracteres",0
.data?
buffer db 100 dup (?)

No he podido colocar el codigo dentro de la macro como es requerido...realiza la suma de las cadenas de caracteres pero necesito ayuda con la forma de introducir las instrucciones en la MACRO.

Y un poco de orientación en el enlace con un lenguaje de alto nivel de estas mismas funciones.


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Examen de Ensamblador [Ayuda]
« Respuesta #1 en: 27 Octubre 2009, 08:04 am »

Hasta ahora se podria decir que no tenes nada, excepto el punto dos y la logica del cuatro, ojo que aca no se hacen tareas asi que unicamente te daremos orientacion. ¿Estas seguro de que lo tenes que hacer en 32 bits? Leyendo los registros mencionados apostaria que tenes que hacer un programa para MS-DOS (16 bits).

Obviamente NO podes usar lstrlen, tenes que escribir el codigo para que se recorra la cadena hasta encontar el caracter mencionado. Primero en una macro y despues como una funcion.


En línea

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
Alpha1020

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Examen de Ensamblador [Ayuda]
« Respuesta #2 en: 27 Octubre 2009, 09:12 am »

Agradezco la ayuda, la verdad ensamblador no es lo mio, se hace lo que se puede con lo que he leido por ahi xD. Hasta ahora usando el lstrlen, porqe ha sido la unica forma que masomenos entendi para sumar los caracteres por eso la utilize, conforme al punto 3 creo que se puede resolver utilizando un "PUSH" y la dirección del arreglo... lo de regresar el valor de BX con otro MOV...mi mas grande problema ahora viene siendo la forma de definir la macro y otra forma de contar caracteres distinta a la qe tengo ahora X_x y al maestro me dijo qe no le importa si es en 16,32,64 bits...si qe si pueden ayudarme unicamente con esa parte con algun ejemplo de otra forma de resolver esa bendita Macro se los agradecere mucho xd
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Examen de Ensamblador [Ayuda]
« Respuesta #3 en: 27 Octubre 2009, 09:26 am »

Documentacion oficial de MASM sobre macros:
http://doc.ddart.net/asm/Microsoft_MASM_Programmers_Guide_v6.1/Chap_09.htm
En línea

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
Alpha1020

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Examen de Ensamblador [Ayuda]
« Respuesta #4 en: 30 Octubre 2009, 10:53 am »

Ya logre resolver todos los puntos del examen, gracias por el apoyo. Ahora me gustaria consultar sobre un poco de orientacion con respecto a llamar las funciones de ensamblador en un lenguaje de alto nivel
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Examen de Ensamblador [Ayuda]
« Respuesta #5 en: 30 Octubre 2009, 11:43 am »

Tenes que hacer coincidir la convencion de llamada (stdcall, cdecl, etc.) en tu codigo y en la declaracion en el lenguaje de alto nivel. Podes enlazar a nivel de codigo objeto (.obj) y usar librerias estaticas (.lib de codigo)  o dinamicas (.dll y .lib de importacion).


Lo siguiente es un articulo/tutorial/lo que sea que escribi hace ya un poco mas de 5 años:



Bueno supongo que todos saben que la mayoria de los compiladores de C++ permiten incluir instrucciones de ensamblador dentro del codigo fuente y estas son ensambladas directamente en el codigo objeto. A esto se le llama inline assembler generalmente.

Pero eso no es siquiera interesante; lo que si es muy interesante es la capacidad de escribir librerias (estaticas y dinamicas) tanto en ensamblador como en C++ (MASM y VC++) y linkearlas en ambos lenguajes.

Osea, que por ejemplo podemos crear una libreria en ensamblador y linkearla estaticamente en un programa de C++. Vamos a ver el ejemplo.

Codigo de la libreria de ensamblador:


Código
  1. .386
  2. .model stdcall,flat
  3.  
  4. include windows.inc
  5. include kernel32.inc
  6. include user32.inc
  7.  
  8. includelib kernel32.lib
  9. includelib user32.lib
  10.  
  11. CTEXT MACRO text:VARARG
  12. LOCAL TxtName
  13. .data
  14. TxtName BYTE text,0
  15. .code
  16. EXITM <OFFSET TxtName>
  17. ENDM
  18.  
  19. SayLong PROTO number:DWORD
  20.  
  21. .code
  22.  
  23. SayLong PROC number:DWORD
  24. LOCAL pointer:DWORD
  25. invoke GetProcessHeap
  26. invoke HeapAlloc,eax,HEAP_ZERO_MEMORY or HEAP_GENERATE_EXCEPTIONS,1024
  27. mov pointer,eax
  28. invoke wsprintf,pointer,CTEXT("%d"),number
  29. invoke MessageBox,0,pointer,pointer,0
  30. invoke GetProcessHeap
  31. invoke HeapFree,eax,0,pointer
  32. ret
  33. SayLong ENDP
  34.  
  35. End



Tranquilidad que ahora paso a explicar el codigo anterior.

.386 es una directiva que le indica a MASM que nuestro codigo va optimizado para la arquitectura 386

.model stdcall,flat es una directiva que le indica a MASM que nuestro codigo usa stdcall (convencion de funciones que utiliza la API de Windows) y un modelo de memoria plano (el unico posible en Windows).

Los includes justamente incluyen bibliotecas al estilo de los .H de C++, para conseguir estas bibliotecas hay que tener MASM32 MASM32 instalado y con el path configurado.

Los includelib nos ahorran pasarle en la linea de comandos parametros de librerias que vamos a linkear, tambien hay que tener el MASM32 o sino crearlas (eso lo dejamos para otro tutorial).

El macro CTEXT nos permite utilizar texto al modo de C++ usando CTEXT("TEXTO") cosa que no es posible directamente en ensamblador.

La funcion SayLong simplemente muestra un MessageBox con el numero que hayamos especificado como parametro.

Ustedes diran que carajo hacemos con este codigo, bueno aca esta la respuesta, ensamblamos y linkeamos con MASM:

ml /c /Cp /coff asm_called.asm
lib asm_called.obj

Con eso conseguimos el archivo asm_called.obj que es el codigo objeto y el archivo asm_called.lib que es el codigo ejecutable que vamos a linkear desde C++.

Ahora el codigo de C++ que llama a la funcion de ensamblador:

Código
  1. #include <windows.h>
  2. extern "C" void __stdcall SayLong(DWORD number);
  3.  
  4. void main()
  5. {
  6.  SayLong(50);
  7. }



Muy simple este codigo, muy simple. Declara la funcion externa SayLong con el paso de paremetros de stdcall (la misma que usamos en ensamblador). Y la llama desde un main con un parametro de 50.

Compilamos y linkeamos con VC++:

cl -c calling_asm.cpp
link calling_asm.obj asm_called.lib kernel32.lib user32.lib

Ahora obtenemos un archivo objeto calling_asm.obj y un archivo ejecutable calling_asm.exe.

Ejecuten el archivo calling_asm.exe y veran que aparece un MessageBox con el numero 50, la rutina SayLong (programa en ensamblador) fue llamada desde C++.

Espero que les haya gustado el tutorial y hayan aprendido algo nuevo.
En línea

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
Alpha1020

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Examen de Ensamblador [Ayuda]
« Respuesta #6 en: 6 Noviembre 2009, 17:28 pm »

Al momento de construir el EXE en C++, ocurre un problema que no he podido resolver por mas que le muevo es este.

Error:  Error: Unresolved external 'lenstr' referenced from C:\DOCUMENTS AND SETTINGS...\PROGRAMA.OBJ



tomando en cuenta que lenstr es la funcion que yo quiero llamar, el *.Obj ya lo coloque en la carpeta del proyecto junto con las *.Lib, si que no comprendo el porque del problema.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Examen de Ensamblador [Ayuda]
« Respuesta #7 en: 6 Noviembre 2009, 17:34 pm »

¿Se lo estas pasando al enlazador? Como en este caso:
link calling_asm.obj asm_called.lib kernel32.lib user32.lib

Fijate en las opciones del proyecto, ahi podes ver la linea de comandos del enlazador y las opciones.
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con mi EXAMEN de COMANDOS en gnu-linux
Scripting
beholdthe 8 8,074 Último mensaje 25 Enero 2011, 00:21 am
por Foxy Rider
[C++] Ayuda con programa para examen
Programación C/C++
Wally_Heber73 0 2,045 Último mensaje 20 Enero 2017, 23:48 pm
por Wally_Heber73
ayuda Examen Redes
Ejercicios
kikelillo 0 2,247 Último mensaje 28 Junio 2017, 17:13 pm
por kikelillo
Ayuda con un examen final!!!
Programación C/C++
elbixx 1 2,478 Último mensaje 15 Noviembre 2017, 19:35 pm
por MAFUS
ayuda es para un examen
Programación C/C++
anderson1221 1 2,319 Último mensaje 20 Febrero 2020, 12:45 pm
por simorg
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines