• Viernes 19 de Abril de 2024, 15:09

Autor Tema:  Ayuda En Asm  (Leído 3285 veces)

y0mism0

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
Ayuda En Asm
« en: Jueves 7 de Septiembre de 2006, 01:33 »
0
1. TEngo un problemilla con un pekeño code en ASM. Esta compilado con el "Turbo Assembler  Version 2.01  Copyright © 1988, 1990 Borland International" (tasm).

POngo en codigo:
Código: Text
  1.  
  2. Código:
  3. pila segment stack 'stack'
  4. dw 150 dup (?)
  5. pila ends
  6. datos segment 'data'
  7. mensa db 'Esto es un ejemplo exe$'
  8. datos ends
  9. codigo segment 'code'
  10. assume cs:codigo,ds:datos,ss:pila
  11. entrada proc
  12. mov ax,datos
  13. mov ds,ax
  14. lea dx,mensa
  15. mov ah,9
  16. int 21h
  17. mov ax,4c00h
  18. int 21h
  19. entrada endp
  20. codigo ends
  21. end entrada
  22.  
  23.  

El caso eske el programa funciona bien, pero cuando lo quiero debuggear con el olly, no puede leer el archivo, no se si tiene algo k ver con los bits, ya k el olly solo lee prgs de 32 bits.... k pasa, porke no puedo debuggearlo con el olly????

2. Otra pregunta k iva a acer, ya puestos, es, k significa k un programa sea de 32 bits? se k en los cpus son los buses de datos y en el SO tb, no? pero y en losa programas? eske lei k los com eran de 16 bits, y los exe de 32..

Saludos.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Ayuda En Asm
« Respuesta #1 en: Jueves 7 de Septiembre de 2006, 08:25 »
0
1. Efectivamente, tu codigo es de 16 bits, usa el Debug que viene con Windows.

2. El microprocesador puede ejecutar codigo de 16, 32 y 64 bits (los ultimos micros AMD 64 y clones de Intel). Dependiendo del modo de ejecucion real (16 bits), modo protegido (32 bits) y modo largo (64 bits) tenes disponibles unos registros especificos (ax, eax, rax,  etc).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

y0mism0

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
Re: Ayuda En Asm
« Respuesta #2 en: Jueves 7 de Septiembre de 2006, 18:43 »
0
Gracias Eternal Idol, y como pongo ese mismo codigo, pero k sea para 32 bits? Eske yo lo cogi de un manual, q decia k era para archivos .exe, y crei k todos los exe eran para 32 bits. Pues bien, necesito este mismo programa, pero q sea para 32 bits, ayuda xfa !!

Saludos.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Ayuda En Asm
« Respuesta #3 en: Jueves 7 de Septiembre de 2006, 21:11 »
0
Cita de: "y0mism0"
Gracias Eternal Idol, y como pongo ese mismo codigo, pero k sea para 32 bits? Eske yo lo cogi de un manual, q decia k era para archivos .exe, y crei k todos los exe eran para 32 bits. Pues bien, necesito este mismo programa, pero q sea para 32 bits, ayuda xfa !!

Saludos.
No, los EXEs pueden ser de 16, 32 o 64 bits. ¿Que queres hacer exactamente? ¿Un programa para Windows?

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

y0mism0

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
Re: Ayuda En Asm
« Respuesta #4 en: Viernes 8 de Septiembre de 2006, 00:38 »
0
Si, lo q keria hacer es un programa para Windows, un exe, de 32 bits.
Pero una cosa, si lo quisiera para unix, el codigo asm seria el mismo, porque solo depende del cpu, lo q variaria serian las instrucciones antes del codigo no??
Pues ya te digo, lo q queria hacer de momento es un programa, con este codigo , q sea de 32 bits para Windows. Este programa me funciona, pero no es de 32 bits, q es lo q quiero, y lo mejor. Si intento poner los registros extended con la "e", no lo reconoce el tasm, q tengo q hacer??

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Ayuda En Asm
« Respuesta #5 en: Viernes 8 de Septiembre de 2006, 09:24 »
0
Cita de: "y0mism0"
Si, lo q keria hacer es un programa para Windows, un exe, de 32 bits.
Pero una cosa, si lo quisiera para unix, el codigo asm seria el mismo, porque solo depende del cpu, lo q variaria serian las instrucciones antes del codigo no??
Pues ya te digo, lo q queria hacer de momento es un programa, con este codigo , q sea de 32 bits para Windows. Este programa me funciona, pero no es de 32 bits, q es lo q quiero, y lo mejor. Si intento poner los registros extended con la "e", no lo reconoce el tasm, q tengo q hacer??
El Sistema Operativo necesita un tipo de ejecutable en particular (ELF, PE, etc) y exporta una API determinada. No podes hacer un ejecutable portable entre S.O.s de 32 bits ya que no podes acceder a la BIOS y sus servicios son diferentes.

Para Windows tendrias que usar por ejemplo la funcion WriteFile para escribir en la consola que obtendrias con GetStdHandle.

Que yo sepa el TASM solo crea ejecutables para MS-DOS, si queres hacer programas para Windows te recomiendo el MASM32.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

y0mism0

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
Re: Ayuda En Asm
« Respuesta #6 en: Viernes 8 de Septiembre de 2006, 19:26 »
0
ok, mire el MASM32, y bueno, como soy nuevo tengo varias preguntas, sobre el tema de ASM.

1. Mire el programa, me se me parecio mucho a un compilador de C o C++. COn sus librerias. headers y demas. Pero digo una cosa, para q necesito todas esas birerias y prototipos de funciones si estoy programando en ensamblador? Por ej, lo que me dijiste en el post anterior de WriteFile y GetStdHandle, q son, funciones, la 1 para escribir un archivo? Esque no parece ensamblador, xq en ensamblador segun tenia entendido, para escribir en un archivo tenias q invocar un rutina de SO, poniendo el num de puntero de la IDT en dx, (sino recuerdo mal) y posteriormente llamar a la interrupcion 21...

2. Yo lo unico que queria es hacer un programa, con el codigo q puse arriba, para win de 32 bits, tengo q cambiar algo del code q puse? como lo compilo y linkeo con el masm32?

3. Ahora un pregunta sobre ASM en general, y la memoria.  Haber, el otro dia practicando con el debug de win, hice un comprobacion. Puse :

d f000:fff0  (no recuerdo si era la direccion exacta) y me salio esto:

f000:fff0  f5 e4 55 .......             ...23/8/88... (me lo estoy inventando)

Luego hice lo mismo con otra direccion y me salio algo asi :

83f8:2ff2: ....f4 77 82.....     BIOS PWD ...... (en fin caracteres ascii q se guardaban en esas direcciones de memoria)

PEro lo raro esque luego puse :
u f000:fff0 y u 83f8:2ff2

y me salio lago asi :
83f8:2ff2   ea53f635   jmp f000:f454

En vez de salirme los caracteres ascii k me salian volcando el contenido de la mem con el dump... se supone k en esas direcciones de memoria tiene k aver los caracteres ascii, no instrucciones de asm como cmp, y eso , no????

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Ayuda En Asm
« Respuesta #7 en: Viernes 8 de Septiembre de 2006, 21:38 »
0
Cita de: "y0mism0"
1. Mire el programa, me se me parecio mucho a un compilador de C o C++. COn sus librerias. headers y demas. Pero digo una cosa, para q necesito todas esas birerias y prototipos de funciones si estoy programando en ensamblador? Por ej, lo que me dijiste en el post anterior de WriteFile y GetStdHandle, q son, funciones, la 1 para escribir un archivo? Esque no parece ensamblador, xq en ensamblador segun tenia entendido, para escribir en un archivo tenias q invocar un rutina de SO, poniendo el num de puntero de la IDT en dx, (sino recuerdo mal) y posteriormente llamar a la interrupcion 21...

La int 21h, es de MS-DOS, con ella accedes a los servicios de este Sistema Operativo. En Windows existen DLLs que exportan servicios como WriteFile y GetStdHandle, es la forma documentada de usar los servicios del S.O. y es la que deberias usar. En fin que no existe ninguna diferencia REAL entre usar los servicios de MS-DOS y los de Windows, no estas a mas bajo nivel por hacer un int 21h que por llamar a una funcion ya que finalmente Windows hara su int 2Eh o sysenter/syscall para pasar al Kernel. Es cierto que en MS-DOS podias utilizar la BIOS y tenias libre acceso a los puertos de I/O pero esto en S.O.s de 32 bits no suele ser para nada cierto.

Cita de: "y0mism0"
2. Yo lo unico que queria es hacer un programa, con el codigo q puse arriba, para win de 32 bits, tengo q cambiar algo del code q puse? como lo compilo y linkeo con el masm32?

TODO tenes que cambiar, tiene que usar los servicios de Windows y no los de MS-DOS.

Cita de: "y0mism0"
En vez de salirme los caracteres ascii k me salian volcando el contenido de la mem con el dump... se supone k en esas direcciones de memoria tiene k aver los caracteres ascii, no instrucciones de asm como cmp, y eso , no????

U desensambla, da lo mismo que haya en la memoria ya que siempre seran BYTEs, puede llegar a decirte que no son opcodes validos o interpretarlos como si lo fueran dependiendo de los valores que contengan los mismos.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

y0mism0

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
Re: Ayuda En Asm
« Respuesta #8 en: Sábado 9 de Septiembre de 2006, 02:25 »
0
1. ok, entonces, pongo en el code por ej esto WriteFile, para llamar a la subrutina almacenada en una dll, k son las apis,  y esa subrutina hace una interrupcion, no es asi? ( en ese caso me pareceria trabajar a un nivel superior...)
Y k son las llamadas rapidas  sysenter/syscall, son otra forma diferente a las interrupciones, o k??

2. Sabes de algun manual, o algun ejemplo de codigo, para Windows? Eske todos los mauales k encuentro en google me hablan de interrupciones y demas..

3. Perdona pero no te entendi. Mira, corrijeme si estoy ekivocado. Bueno en primer lugar me gustaria hacerte una pregunta. Cual es la diferencia entre cargar un programa en memoria y ejecutarlo? Cuando tu tienes un programa, y "haces 2 clicks", o desde la shell o como sea, lo q haces es ejecutarlo, y no te da opcion a cargarlo en memoria. Sin embargo el debug tiene la opcion "l" para cargarlo en memoria. Bueno yo entiendo q para ejecutar un programa, este previamente tiene k cargarse en memoria, y por cargarlo en memoria entiendo, copiar su codigo ASM a partir de un offset, es decir copiar integramente el codigo ASM del programa en la memoria, para q luego la unidad de control del micro, mande las instrucciones a la ALU. Pues bien, a partir de esto, lo q no entiendo, es, q como si tu vuelcas el contenido de esos offsets (con el programa cargado en memoria), no te te aparecen las instrucciones ASM de tu programa, sino otros simbolos q no tienen nada q ver, es decir, no las instrucciones transformadas a hexadecimal del codigo ASM, q es lo q deberia salir.
 
Nose si entendiste lo q quise decir, en cualkier saludos y gracias.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Ayuda En Asm
« Respuesta #9 en: Sábado 9 de Septiembre de 2006, 08:28 »
0
Cita de: "y0mism0"
1. ok, entonces, pongo en el code por ej esto WriteFile, para llamar a la subrutina almacenada en una dll, k son las apis,  y esa subrutina hace una interrupcion, no es asi? ( en ese caso me pareceria trabajar a un nivel superior...)
Y k son las llamadas rapidas  sysenter/syscall, son otra forma diferente a las interrupciones, o k??

Es exactamente lo mismo. ¿Acaso conoces el codigo de MS-DOS? En Windows tambien podrias usar interrupciones o llamadas rapidas (son instrucciones especiales para hacer la transicion de modo Usuario a modo Kernel mucho mas rapido que con interrupciones). ¿Que beneficio obtendrias? NINGUNO, no pienso seguir con ese tema, investiga y averigua todo lo que quieras.

Cita de: "y0mism0"
2. Sabes de algun manual, o algun ejemplo de codigo, para Windows? Eske todos los mauales k encuentro en google me hablan de interrupciones y demas..

Esos no son manuales para Windows entonces. http://win32asm.cjb.net/

Cita de: "y0mism0"
3. Perdona pero no te entendi. Mira, corrijeme si estoy ekivocado. Bueno en primer lugar me gustaria hacerte una pregunta. Cual es la diferencia entre cargar un programa en memoria y ejecutarlo?

Cargar es eso y ejecutar es eso, uno lo pone en memoria y el otro "interpreta" las instrucciones que haya en la misma.

Cita de: "y0mism0"
Pues bien, a partir de esto, lo q no entiendo, es, q como si tu vuelcas el contenido de esos offsets (con el programa cargado en memoria), no te te aparecen las instrucciones ASM de tu programa, sino otros simbolos q no tienen nada q ver, es decir, no las instrucciones transformadas a hexadecimal del codigo ASM, q es lo q deberia salir.

Estaras mirando en las direcciones equivocadas y te deberian salir los mnemonicos (inc, add, jmp, etc) de las instrucciones cuando hagas uses u. Busca en la ayuda del Debug ... es tecnologia obsoleta.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

y0mism0

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
Re: Ayuda En Asm
« Respuesta #10 en: Sábado 9 de Septiembre de 2006, 16:55 »
0
No conoces ninguno en español? Pues es una putada, ya q me habia familiarizado con las interrupciones...

3.  Ya mire en la ayuda del debug y no vi nada al respecto. MIra, vuelco el contenido de estoso offsets, es decir lo q contienen esa direcciones de memoria :
231f-2324
y me pone k la memoria contiene valores hexadecimales q corresponden a los caracteres ascii "HOLA"

PUes bien, desemsamblo con -u en este mismo rango de direcciones
231f-2324
y me pone esto : mov ax,bx

Pues lo q no entiendo, es, q "mov ax,bx" != (no es igual) "HOLA". Con ambos comandos estoy mirando el contenido de esas direcciones de memoria, x lo q me deberia de salir lo mismo, no por utilizar un comando u  otro va a cambiar el contenido , no? Es decir, si utilizando -u, me saliera mov ax,bx, utilizando posteriormente -d, me tiene k salir tb mov ax,bx, solo q transformado a hexadecimal, ya q esas direcciones de memoria contienen estas instrucciones ASM "mov ax,bx" , y no esto "HOLA"...

ah, y la ultima cosa, cuando se dice, un microprocesador de 32 bits, se refiere a q el micro tiene 32 buses de direccion, no de datos , vd??