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
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.
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
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
push 4
push 5
add esp,4
el
dword[esp]
te valdria 4 pero el 5 seguiria en la pila ;)