Diferencia entre estos dos codes (ASM)

Iniciado por Riki_89D, 24 Octubre 2009, 16:55 PM

0 Miembros y 1 Visitante están viendo este tema.

Riki_89D

Hola que tal estan?

buen veran hayer estuve repasando los ejemplos que trae el MASM,y vi uno llamado (minimum) i se trata de un Hola mundo de soloo 1K!! aqui os pongo el codigo que utilizaba antes:

.386
.model flat,stdcall
option casemap:none
include All.inc

.data
txt db 'Hola mundo',0
cab txt db 'Titulo',0

.code
bg:

invoke MessageBox,0,offset txt,offset cab,0
invoke ExitProcess,0

end bg


Bien,ese codigo me muestra el mensaje hola mundo pero el tamaño del exe es de 2,50 Ks

pero tambien hice el de 1k kqie es asin:

.386
.model flat,stdcall
option casemap:none
include All.inc


.code
bg:

JMP @F

txt db 'Hola mundo',0
cab db 'Titulo',0

@@:

push 0
push offset cab
push offset txt
push 0
call MessageBox

push 0
call ExitProcess

end bg


Por que este ocupa menos que el otro? y lo que no entiendo es lo de JMP @F JMP = Jump no? eso a donde salta a @@ ? I LA "F" que pinta hay?¿


salu2


PeterPunk77

#1
La diferencia de tamaño viene dada porque en el primer ejemplo los datos del título y texto van en una sección nueva (.data) que no existe en el segundo ejemplo, que lo incluye directamente en el código.
Eso quiere decir que si los desensamblas verás:

Código del primer ejemplo:
00401000 <>/$  6A 00                    PUSH 0                                  ; /Style = MB_OK|MB_APPLMODAL
00401002   |.  68 0B304000              PUSH 0040300B                           ; |Title = "Titulo"
00401007   |.  68 00304000              PUSH 00403000                           ; |Text = "Hola mundo"
0040100C   |.  6A 00                    PUSH 0                                  ; |hOwner = NULL
0040100E   |.  E8 07000000              CALL <JMP.&user32.MessageBoxA>          ; \MessageBoxA
00401013   |.  6A 00                    PUSH 0                                  ; /ExitCode = 0
00401015   \.  E8 06000000              CALL <JMP.&kernel32.ExitProcess>        ; \ExitProcess
0040101A    $- FF25 08204000            JMP [<&user32.MessageBoxA>]             ;  user32.MessageBoxA
00401020    .- FF25 00204000            JMP [<&kernel32.ExitProcess>]           ;  kernel32.ExitProcess

y sus secciones:
Memory map
Address    Size       Owner                          Section      Contains                    Type              Access         Initial   Mapped as
00400000   00001000   Normal   00400000 (itself)                  PE header                   Imag 01001002     R              RWE
00401000   00001000   Normal   00400000              .text        code                        Imag 01001002     R              RWE
00402000   00001000   Normal   00400000              .rdata       imports                     Imag 01001002     R              RWE
00403000   00001000   Normal   00400000              .data        data                        Imag 01001002     R              RWE


Código del segundo ejemplo (mínimo):
00401000 <>/$ /EB 12                    JMP SHORT 00401014
00401002   |. |48 6F 6C 61 20 6D 75 6E >ASCII "Hola mundo",0
0040100D   |. |54 69 74 75 6C 6F 00     ASCII "Titulo",0
00401014   |> \6A 00                    PUSH 0                                  ; /Style = MB_OK|MB_APPLMODAL
00401016   |.  68 0D104000              PUSH 0040100D                           ; |Title = "Titulo"
0040101B   |.  68 02104000              PUSH 00401002                           ; |Text = "Hola mundo"
00401020   |.  6A 00                    PUSH 0                                  ; |hOwner = NULL
00401022   |.  E8 07000000              CALL <JMP.&user32.MessageBoxA>          ; \MessageBoxA
00401027   |.  6A 00                    PUSH 0                                  ; /ExitCode = 0
00401029   \.  E8 06000000              CALL <JMP.&kernel32.ExitProcess>        ; \ExitProcess
0040102E    $- FF25 08204000            JMP [<&user32.MessageBoxA>]             ;  user32.MessageBoxA
00401034    .- FF25 00204000            JMP [<&kernel32.ExitProcess>]           ;  kernel32.ExitProcess

y sus secciones:
Memory map
Address    Size       Owner                          Section      Contains                    Type              Access         Initial   Mapped as
00400000   00001000   Minimo   00400000 (itself)                  PE header                   Imag 01001002     R              RWE
00401000   00001000   Minimo   00400000              .text        code                        Imag 01001002     R              RWE
00402000   00001000   Minimo   00400000              .rdata       data,imports                Imag 01001002     R              RWE


El tamaño de las secciones se puede definir en la compilación, pero para el MASM por defecto es de 1 kb por sección, y ese es el tamaño que ganas entre ambos códigos.

Con respecto al "@F" es una de las palabras reservadas del MASM que hace referencia a la siguiente etiqueta (para los saltos) y existe otra "@B" para saltar a la etiqueta anterior.

Riki_89D

Gracias por responder,y otra pregunta imaginate que tengo 2 elementos guardados en la pila,como puedo hacer que ESP apunte al primero (no que lo retire sino solo que apunte a ese elemento)



salu2

YST

Cita de: Riki_89D en 24 Octubre 2009, 18:57 PM
Gracias por responder,y otra pregunta imaginate que tengo 2 elementos guardados en la pila,como puedo hacer que ESP apunte al primero (no que lo retire sino solo que apunte a ese elemento)

Algo a si

Código (asm) [Seleccionar]

push 4
push 5
add esp,4


el
Código (asm) [Seleccionar]
dword[esp] te valdria 4 pero el 5 seguiria en la pila ;)


Yo le enseñe a Kayser a usar objetos en ASM