Programa que eu fiz que explica esses dois comandos:;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;- Testando PUSH e POP -
;- Push -> Coloca um valor na pilha, seria como salvar algo na -
;- memória para ser usado depois. -
;- Pop -> Faz o contrário de push, tira um valor da pilha -
;- Ou seja, se salvarmos EBX com o valor de 1 e depois alterar--
;- mos o seu valor (sem salva-lo na pilha), e puxa-lo novamente-
;- com o POP, seu valor será 1 novamente. -
;- O que esse programa faz é isso, é lógico, que ele não irá -
;- apresentar a mensagem de erro por estar programa para que is-
;- so não aconteça (a não ser que você mude alguma coisa), mas -
;- é bem interessante e bem comentado. -
;- -
;- Obs: Para mudar a mensagem de sucesso remova toda a linha 33-
;- -
;- Conteúdo da linha 35: pop ebx -
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
format PE GUI 4.0 ;formato do programa
include 'include\win32ax.inc' ;blbiblioteca
start: ;inicio do código
invoke MessageBox,0,'ASM: Testando POP e PUSH','POP & PUSH',MB_OK ;mensagem
mov ebx,1 ;move para o registrador EBX o valor 1
push ebx ;salva (empurra) na pilha o valor de EBx (1)
invoke MessageBox,0,'O valor de EBX agora é 1','POP & PUSH',MB_OK ;mostra mensagem
mov ebx,2 ;move para o registrador EBX o valor de 2
cmp ebx,2 ;compara se EBX é igual a 2
JE e2 ;se EBX=2 vai para e2
JNE ne2 ;se EBX!2 vai para ne2
e2:
invoke MessageBox,0,'O valor de EBX agora é 2','POP & PUSH',MB_OK ;mensagem
invoke MessageBox,0,'Agora restauramos o valor de EBX...','POP &PUSH',MB_OK
pop ebx ;restaura da pilha o valor de EBX (1)
cmp ebx,1 ;compara para ver se EBX tem o valor de 1
JE e1 ;se tiver, vai para e1
JNE ne1 ;senão vai para ne1
ne2:
invoke MessageBox,0,'EBX é igual a 2',':[ - ERRO',MB_ICONERROR+MB_OK ;mensagem
ret ;retorna ao Windows
e1:
invoke MessageBox,0,'EBX é igual a 1',':] - SUCESSO',MB_ICONINFORMATION+MB_OK ;mensagem de sucesso (EBX=1)
ret ;retorna ao sistema
ne1:
invoke MessageBox,0,'EBX é igual a 2',':[ - ERRO!',MB_ICONERROR+MB_OK ;mensagem de erro (EBX=2)
ret ;retorna ao sistema
data import ;importação de comandos
library user32,'USER32.DLL' ;importa a DLL USER32.DLL
import user32,\
MessageBox,'MessageBoxA' ;importar de USER32.DLL o comando MenssageBox
end data ;fim da importação
Compile com o fasmw, que não tiver faça download do exe com o código-fonte. Link: http://rapidshare.de/files/33342552/POPePUSH.zip.html (//http://rapidshare.de/files/33342552/POPePUSH.zip.html)
Legal..
E também é bom lembrar que existe o pop e push no C..Estava olhando o C Completo e Total e vi explicando eles...achei meio complicadinho mais é legal..
e só lembrando que no C é pop e push pois é case sensitive
cara, esse treco de push e pop não entra na minha cabeça de high level programming. outro dia vi um push eax \ pop edi e o valor que tava em eax foi pro edi... como assim?! hahaha
e claro, outros pushs sem respectivos pops, vai pra onde? acaba com a memória do processador? *perdido*
ainda mais "absurdo" é fazer push eax \ mov eax, esp, daí que não me entra na cabeça mesmo! Pra mim esp era stack, como colocar tudo dentro de eax?! Já que estamos falando disso, poderiam me clarear as idéias?