antiblock
Rodnia | Alpha & Omega

V¡®u§

Membro Plus
  • Content Count

    1,215
  • Joined

  • Last visited

  • Days Won

    34

Reputation Activity

  1. Upvote
  2. Upvote
    V¡®u§ got a reaction from Origin. in Como Rastrear Um Ip E Saber Tudo Sobre Ele?   
    Usando esta ferramenta você pode rastrear qualquer IP e obter informações sobre todos e cada um sem procurar em torno em qualquer outro lugar, inclusive País, Cidade, Fuso Horário, região, Capital etc moedas, então vamos ver como ele funciona.

    1. Primeiro de tudo baixar a aplicação [Final do topico] , e extrair o aplicativo e clique 2x nele ' Team Leak - IP Locate.exe'

    2. Agora digite o IP (que pretende buscar informações) no "Past IP here" e clique em " Search " e aguarde alguns segundos, agora você vai ver todas as informações sobre esse IP como mostrado abaixo:





    http://www.2shared.c...ber-Gamers.html
    http://cf1zap.1fichier.com/
    http://www.4shared.c...ber-Gamers.html
    http://depositfiles....files/2a5x4qztz
    http://www.digzip.co...er-Gamers_.html
    http://www.mediafire...e42li4o375cp0k3
    http://www.mirrorcre...mers_.rar_links
    http://rapidshare.co...r-Gamers%5D.rar
    http://www.sendspace.com/file/r7ux0v
    http://www.ziddu.com...Gamers.rar.html
    http://www4.zippysha...76673/file.html


    https://www.virustotal.com/pt/file/99a7783a72f05f08d92d31f690d5e5bb65eff1d6e46aa46c73fbbc47eb34a0c4/analysis/1365049969/
  3. Upvote
  4. Upvote
    V¡®u§ got a reaction from Vitor Pinho ☮ in Como Fazer Seu Keylogger [100% Fud]- 2013   
    Ja fiz um topico sobre deixar um server FUD, mas ágora a maioria dos Crypters São desatualizadas. entao, Hoje Vou mostrar um Crypter FUD 2013 (indetectável Pelos anti-vírus)
    Primeiro baixar Crypter [Final do Topico]


    Aqui você pode Juntar (Combinar) com qualquer outro arquivo ex: Exe, Text com seu arquivo Crypt



    Burlar o a extensão do arquivo Keylog de vírus...




    Características:
    FUD Crypter de 0/35
    Arquivo FUD 0/35
    Extensão Spoofer
    Icon Changer

    Relatório do Scann:





    http://www.2shared.c...ber-Gamers.html
    http://p57klv.1fichier.com/
    http://www.4shared.c...ber-Gamers.html
    http://depositfiles....files/r4opxqvfq
    http://www.digzip.co...er-Gamers_.html
    http://www.mediafire...u18j9brpal4gekd
    http://www.mirrorcre...mers_.rar_links
    http://www.sendspace.com/file/8i4sd9
    http://rapidshare.co...r-Gamers%5D.rar
    http://www.ziddu.com...Gamers.rar.html
    http://www22.zippysh...48228/file.html


    https://www.virustotal.com/pt/file/76f03972f2f8cabecfb3a7059c3f6da5e099293e04c59c79eefc54c48148d89a/analysis/1365038371/
  5. Upvote
    V¡®u§ got a reaction from Alexandre Rodrigues in Como Fazer Seu Keylogger 100% Fud   
    Neste Topico eu estou indo dar breve descrição de deixar indetectavel um KL(dedico ao -JσασGσмєs'), pois agora e mais difícil obter um crypter FUD free e na maioria das crypter não são free, edição Então Hex é a única maneira de fazer o nosso arquivo de keylogger totalmente undectable (FUD ).


    O que é Hexing?

    Hexing é o processo de modificação de arquivos de aplicativos usando editores Hex (softwares usados ​​para editar arquivos em formato hexadecimal).

    Como Antivirus funciona?

    Antivirus funciona de forma bastante complexa. Para resumir seu trabalho, antivírus tem as definições de vírus (também chamado de assinaturas) armazenados em seu banco de dados. Ao digitalizar um arquivo, pesquisas de antivírus para estas definições de vírus ou assinaturas em um arquivo e, se encontrar estas assinaturas em um arquivo, ele sinaliza esses arquivos como vírus.

    Como tornar o vírus indetectável?

    Quando você criou o arquivo de vírus, basta abrir o arquivo trojan vírus no editor Hex e busca de assinatura que Antivirus tem sinalizado como de definição de vírus. Temos de mudar essa assinatura de tal forma que isso não afetará o funcionamento da nossa vírus trojan. Depois de ter alterado com êxito esta assinatura, o antivírus não vai detectar o vírus, tornando ele FUD .
    Coisas que são necessários para Hexing
    File Splitter : http://www.dekabyte....r/download.html
    Hex Editing Software : http://www.hhdsoftwa...free-hex-editor
    Keylogger (A sua preferencia)
    Agora siga os seguintes passos para fazer ele indetectavel para antivírus

    Primeiro faça servidor de arquivos (file Keylog) usando keylogger depois que servidor servidor em uma pasta. Aqui eu criei pasta "A" e colocar esse servidor (Meu nome é servidor test.exe).
    Ok, agora depois de ter colocado o servidor na pasta permite digitalizá-lo.

    Aqui meu arquivo test.exe está infectado.


    Agora, abra o File Splitter para dividir o arquivo.


    No divisor de arquivo, navegue até o arquivo test.exe que você quer dividir e escolher a opção de tamanho personalizado.
    Agora File Splitter me diz que este é exatamente test.exe 53.495 bytes e eu quero dividi-lo em 4 pedaços. Então eu dividi 53.495 por 4, agora colocar o número que você tem depois de dividi-la e colocá-lo na caixa de tamanho divisor de costume que tenho no fundo. Agora clique em Split.

    Agora você vai obter os arquivos subdivididas no mesmo diretório como eu fiz abaixo que está na pasta "A".


    Agora escanear cada um deles para descobrir qual arquivo está infectado e depois que nós temos que dividir esse arquivo infectado novamente. Agora, depois de ter descoberto que o arquivo infectado, faça uma nova pasta na mesma pasta. Aqui eu tenho test.exe.3 arquivo infectado, então eu vou fazer uma nova pasta com o nome de "3".


    Agora, novamente dividir essa infectado arquivo test.exe.3 arquivo em 4 pedaços e mudar a pasta de saída a 3 como eu tenho na imagem abaixo.

    Agora você vai ficar dividido arquivos dentro da pasta chamada "3".

    Agora verificar todos os arquivos para descobrir qual arquivo está infectado e depois que nós temos que dividir esse arquivo infectado novamente.


    Agora, depois de ter descoberto que o arquivo infectado, faça uma nova pasta na mesma pasta. Aqui eu tenho test.exe.3.3 arquivo infectado, então eu vou fazer uma nova pasta com o nome de "3" de novo na pasta "3". Uma vez que você fez nova pasta chamada "3", mais uma vez abrir divisor de arquivo e navegue até o arquivo que tem detectado, o meu era test.exe.3.3 e selecione o diretório de saída para a pasta que acabou de fazer o que era a pasta chamada "3" que está na pasta chamada "3".


    Agora abra essa nova pasta, que é "3" e digitalizar todos os arquivos. Agora, depois de ter descoberto que o arquivo infectado, faça uma nova pasta na mesma pasta. Aqui eu tenho test.exe.3.3.4 arquivo infectado, então eu vou fazer uma nova pasta e nomeie-o "4".


    Agora em arquivo divisor escolher o arquivo que foi detectado que era test.exe.3.3.4 para mim e para escolher a nova pasta que fizemos com o nome "4".

    Agora vamos verificar todos os arquivos novos e ver qual foi detectado. Uma vez que encontramos o arquivo infectado, abra o arquivo infectado com o editor hexadecimal e ver se a sua ainda grande demais para descobrir o que precisamos mudar....

    Ok, então aqui é test.3.3.4.1 que precisamos editar,abri-lo com o editor hexadecimal,


    Agora, a assinatura de vírus é aqui no editor hexadecimal e não é muito difícil agora para encontrá-lo para fora. Eu dedo para fora procurando por algo que se destaca ou guesssing. Depois que você tem que fazer é mudar uma letra do capital para o menor caso. aqui no meu exemplo eu mudei a palavra D para uma minúscula do DLLHOOKSTRUCT .


    Agora salve e saia e digitalizá-lo. Deve estar indetectável.


    Finalmente FUD .. Agora você precisa fazer compilá-lo e digitalizá-lo mais uma vez e executá-lo para testar.

    Como Complile: Aqui eu vou mostrar-lhe um exemplo e depois que você pode descobrir o resto por conta própria.

    Agora você verá o ícone de divisão dentro da sua pasta, aqui no meu exemplo é create_test.exe.3.3, clique sobre ele e ele irá recompilar o arquivo, e criar um arquivo mais. Aqui no meu exemplo, criar o arquivo "test.exe.3.3.4"


    Agora copie o arquivo recém-criado, que é "test.exe.3.3.4" e voltar um diretório e passado, então ele irá pedir para substituí-lo clique em sim e continue fazendo isso até você voltar ao primeiro diretório.
    Depois de verificar que mais uma vez para verificar se o seu FUD ou não.


    Update: Se você quer hackear senhas de contas do Gmail, Orkut e outros e-mail, por favor use os melhores Softwares Hacking, espero que agora você pode facilmente fazer seu arquivo keylog (servidor) totalmente indetectavel usando esta técnica Hexing sem usar qualquer keylogger PAGO!.
  6. Upvote
    V¡®u§ got a reaction from Origin. in Como Hackear conta de Facebook [ATUALIZADO]   
    Nota: Esta é apenas para fins educacionais.
    Requisitos:
    1. FacebookPhisher atualizado.

    http://epamtf.1fichier.com/
    http://www.4shared.c...ber-Gamers.html
    http://www.badongo.com/file/27827648
    http://depositfiles....files/iv7z9wovs
    http://www.digzip.co...ber-Gamers.html
    http://bayfiles.com/...yber-Gamers.rar
    http://www.mirrorcre...amers.rar_links
    http://www.mediafire...ez8n7djhbd11bsq
    http://rapidshare.co...yber-Gamers.rar
    http://www.sendspace.com/file/znhhk5
    http://ul.to/sv7lje65
    http://www.ziddu.com...Gamers.rar.html
    http://www10.zippysh...53839/file.html
    2. Free Web servidor de hospedagem para carregar as páginas Phish.
    3. URL Spoofing utilizando o Host técnica de mapeamento de nome.

    Vou ensinar a vocês hoje. Sei que a maioria de vocês já sabem de phishing, mas para iniciantes, deixe-me explicar um pouco. Páginas Phish significa páginas falsas(fake) que se parece absolutamente semelhante às páginas originais ea técnica de usar essas páginas falsas para hack usuário e senha é chamada de phishing. E a técnica que usamos para enviar essas páginas falsas de vítima e levá-lo a acreditar que eles são reais é chamado de Engenharia Social. Mas eu acho que isso nós já sabemos, o que há de novo que vamos discutir hoje.
    O que a de novo??

    Nós todos sabemos que páginas falsas só pode ser detectada usando duas técnicas:
    1. Verificando a URL na barra de endereços, se a sua página falsa então URL deve ser diferente do original.
    2. O uso de qualquer barra de ferramentas de segurança web que avisa os usuários para páginas falsas, como AVG barra de ferramentas, barra de ferramentas Norton Online etc segurança.
    Mas e se você abrir www.facebook.com manualmente no seu navegador web e abre a página falsa e URL no navegador permanece www.facebook.com. Isso significa primeira técnica para detectar a página falsa. Agora, para segunda técnica, todas as ferramentas de segurança online web detectar páginas falsas, comparando a entrada pelo usuário na barra de endereço URL da URL da página original. Se os dois, em seguida, a sua não uma página falsa mais a sua página de um malware.

    Passos para hackear conta no Facebook ou Senha:

    1. Download Phisher Facebook.
    2. Extraia os arquivos, você vera esses 4 arquivos abaixo:

    index.php
    facebook1.php
    senha.html
    Obrigado.php

    3. Agora vá para qualquer servidor gratuito web hosting para fazer upload destas páginas falsas.
    Observe tudo deve ser carregado na raiz não significa em qualquer pasta. Apenas no diretório de primeiro nível.

    4. Agora você precisa encontrar o endereço IP correto da conta que você criou no servidor de hospedagem.

    5. Quando você começa o seu endereço IP página falsa, agora o que precisamos fazer é que temos de adicionar a entrada do endereço IP contra o www.facebook.com no arquivo vítima host localizado abaixo do local.
    C:WindowsSystem32driversetc
    6. Existem várias maneiras de fazer isso, eu escrevi meu próprio scripts PHP para fazer o mesmo, mas eu não posso compartilhar isso com vocês porque há chances de fazer mau uso dela. Então eu explicar-lhe a lógica eo resto você precisa descobrir como vai editar vítimas em arquivo host e adicione seu endereço de IP Falso Página contra www.facebook.com.

    7. Agora depois de fazer os passos 5 e 6, sempre que o usuário abrir a www.facebook.com , sua página no Facebook falso pode abrir e vítima nunca será capaz de visitar o Facebook original, então ele não pode sequer ser capaz de alterar sua senha ... <img src="http://cyber-gamers.org/public/style_emoticons/default/tongue.png" class="bbc_emoticon" alt=":tongue:">

    8. Eu adicionei uma lógica extra para os meus scripts, sempre vítima digitar a senha e apertar ENTER, eu estou removendo a entrada de endereço IP Falso contra www.facebook.com do arquivo host, tornando-os espaços. Por isso, será para ele uma única vez que soa mais falso. Sua apenas um código de linha única, mas eu não posso dizer a vocês, porque ele vai fazer este artigo completamente anti-ético.

    Eu vou ensinar técnicas, mas eu não vou dar de mala em cuia, porque se você quer se tornar hacker bom, então você precisa usar o seu cérebro também. Gosto de ser chamado destrutivo, mas eu faço obras construtivas .. <img src="http://cyber-gamers.org/public/style_emoticons/default/ph34r.png" class="bbc_emoticon" alt=":ph34r:">

    9. Tudo além disso é semelhante à técnica de phishing normal ..
    Eu usei esse host http://www.my3gb.com/ você pode usar outro em que você carregou seus arquivos.
    Além disso, você deve saber é o endereço IP 127.0.0.1 localhost. Para você caso seu webhosting será o endereço IP que será usado para mapear contra facebook.
    Demonstração:




    https://www.virustot...sis/1342370458/
    Nota: Esta é apenas para fins educacionais.Qualquer que você fizer to nen ai nen ti conheço
  7. Upvote
    V¡®u§ got a reaction from Origin. in Onehit 13.5 [Cf]   
    Compatibilidade:

    Windows XP : Sim
    Windowns 7 : Sim
    Windowns Vista : Sim
    Funcional : AL/NA/PH/FG/RU/EU/VN/FG/TW

    1° Extraíar o Cheat
    2° Abra o arquivo OneHitCF 11.9 (se usar Windows Vista ou 7 execute como administrador)
    3° Clique em Ok Na imagem que irá aparecer
    5° Espere 25 segundos
    4° Abra o jogo normalmente






    http://www.2shared.c...ber-Gamers.html
    http://uw3h0r.1fichier.com/
    http://www.4shared.c...ber-Gamers.html
    http://bayfiles.com/...r-Gamers%5D.rar
    http://depositfiles....files/p3r99xarp
    http://www.digzip.co...0FECCGSB/Onehit 25.03.13 - _Cyber-Gamers_.html
    http://www.mediafire...8m3dv5ed444iq21
    http://www.mirrorcre...mers_.rar_links
    http://rapidshare.co...r-Gamers%5D.rar
    http://www.sendspace.com/file/qyn4ma
    http://www68.zippysh...64715/file.html
    http://www.ziddu.com...Gamers.rar.html


    https://www.virustot...sis/1364246354/

    Creditos: OneHitCF
  8. Upvote
    V¡®u§ got a reaction from Origin. in Onehit 13.5 [Cf]   
    Compatibilidade:

    Windows XP : Sim
    Windowns 7 : Sim
    Windowns Vista : Sim
    Funcional : AL/NA/PH/FG/RU/EU/VN/FG/TW

    1° Extraíar o Cheat
    2° Abra o arquivo OneHitCF 11.9 (se usar Windows Vista ou 7 execute como administrador)
    3° Clique em Ok Na imagem que irá aparecer
    5° Espere 25 segundos
    4° Abra o jogo normalmente






    http://www.2shared.c...ber-Gamers.html
    http://uw3h0r.1fichier.com/
    http://www.4shared.c...ber-Gamers.html
    http://bayfiles.com/...r-Gamers%5D.rar
    http://depositfiles....files/p3r99xarp
    http://www.digzip.co...0FECCGSB/Onehit 25.03.13 - _Cyber-Gamers_.html
    http://www.mediafire...8m3dv5ed444iq21
    http://www.mirrorcre...mers_.rar_links
    http://rapidshare.co...r-Gamers%5D.rar
    http://www.sendspace.com/file/qyn4ma
    http://www68.zippysh...64715/file.html
    http://www.ziddu.com...Gamers.rar.html


    https://www.virustot...sis/1364246354/

    Creditos: OneHitCF
  9. Upvote
    V¡®u§ got a reaction from Origin. in Onehit 13.5 [Cf]   
    Compatibilidade:

    Windows XP : Sim
    Windowns 7 : Sim
    Windowns Vista : Sim
    Funcional : AL/NA/PH/FG/RU/EU/VN/FG/TW

    1° Extraíar o Cheat
    2° Abra o arquivo OneHitCF 11.9 (se usar Windows Vista ou 7 execute como administrador)
    3° Clique em Ok Na imagem que irá aparecer
    5° Espere 25 segundos
    4° Abra o jogo normalmente






    http://www.2shared.c...ber-Gamers.html
    http://uw3h0r.1fichier.com/
    http://www.4shared.c...ber-Gamers.html
    http://bayfiles.com/...r-Gamers%5D.rar
    http://depositfiles....files/p3r99xarp
    http://www.digzip.co...0FECCGSB/Onehit 25.03.13 - _Cyber-Gamers_.html
    http://www.mediafire...8m3dv5ed444iq21
    http://www.mirrorcre...mers_.rar_links
    http://rapidshare.co...r-Gamers%5D.rar
    http://www.sendspace.com/file/qyn4ma
    http://www68.zippysh...64715/file.html
    http://www.ziddu.com...Gamers.rar.html


    https://www.virustot...sis/1364246354/

    Creditos: OneHitCF
  10. Upvote
    V¡®u§ got a reaction from Origin. in Onehit 13.5 [Cf]   
    Compatibilidade:

    Windows XP : Sim
    Windowns 7 : Sim
    Windowns Vista : Sim
    Funcional : AL/NA/PH/FG/RU/EU/VN/FG/TW

    1° Extraíar o Cheat
    2° Abra o arquivo OneHitCF 11.9 (se usar Windows Vista ou 7 execute como administrador)
    3° Clique em Ok Na imagem que irá aparecer
    5° Espere 25 segundos
    4° Abra o jogo normalmente






    http://www.2shared.c...ber-Gamers.html
    http://uw3h0r.1fichier.com/
    http://www.4shared.c...ber-Gamers.html
    http://bayfiles.com/...r-Gamers%5D.rar
    http://depositfiles....files/p3r99xarp
    http://www.digzip.co...0FECCGSB/Onehit 25.03.13 - _Cyber-Gamers_.html
    http://www.mediafire...8m3dv5ed444iq21
    http://www.mirrorcre...mers_.rar_links
    http://rapidshare.co...r-Gamers%5D.rar
    http://www.sendspace.com/file/qyn4ma
    http://www68.zippysh...64715/file.html
    http://www.ziddu.com...Gamers.rar.html


    https://www.virustot...sis/1364246354/

    Creditos: OneHitCF
  11. Upvote
    V¡®u§ got a reaction from quenii in Gravação Mostra Policial Abordando O Ranger Preto   
    http-~~-//youtu.be/Ysj5e8DcKaQ
  12. Upvote
    V¡®u§ got a reaction from quenii in Gravação Mostra Policial Abordando O Ranger Preto   
    http-~~-//youtu.be/Ysj5e8DcKaQ
  13. Upvote
    V¡®u§ got a reaction from quenii in Gravação Mostra Policial Abordando O Ranger Preto   
    http-~~-//youtu.be/Ysj5e8DcKaQ
  14. Upvote
    V¡®u§ got a reaction from quenii in Gravação Mostra Policial Abordando O Ranger Preto   
    http-~~-//youtu.be/Ysj5e8DcKaQ
  15. Upvote
    V¡®u§ got a reaction from quenii in Gravação Mostra Policial Abordando O Ranger Preto   
    http-~~-//youtu.be/Ysj5e8DcKaQ
  16. Upvote
    V¡®u§ got a reaction from quenii in Gravação Mostra Policial Abordando O Ranger Preto   
    http-~~-//youtu.be/Ysj5e8DcKaQ
  17. Upvote
    V¡®u§ got a reaction from Nestle in Mudar O Ip Em 10 Segundos   
    Esse e o modo mais facil e rapido que eu achei para mudar o IP.
    Bom para quem termina de fazer um Download, e quer fazer outro com o mesmo servidor e uma boa. Não precisa reiniciar o modem e nen esperar os minutos de espera do servidor de download.
    1. Vá no seu [iNICIAR]
    2. Clique no [EXECUTAR] e digite [CMD]
    3. Ai vai aprir o [PROMPT] digite as linhas abaixo uma por uma [Copie e Cole no PROMPT]

    ipconfig
    ipconfig /flushdns
    ipconfig /release
    ipconfig /renew
    ipconfig

    4. Pronto IP trocado.
  18. Upvote
    V¡®u§ got a reaction from iReapZz in Onehitcf 12.0 [13/03/2013]   
    Compatibilidade:

    Windows XP : Sim
    Windowns 7 : Sim
    Windowns Vista : Sim
    Funcional : AL/NA/PH/FG/RU/EU/VN/FG/TW

    1° Extraíar o Cheat
    2° Abra o arquivo OneHitCF 11.9 (se usar Windows Vista ou 7 execute como administrador)
    3° Clique em Ok Na imagem que irá aparecer
    5° Espere 25 segundos
    4° Abra o jogo normalmente





    http://www.2shared.c...013Cyber-G.html
    http://www.4shared.c...013Cyber-G.html
    http://ftx96f.1fichier.com/
    http://depositfiles....files/adthxi9db
    http://bayfiles.com/...r-Gamers%5D.rar
    http://www.digzip.co...MDCCKD/OneHitCF 12.0 13-03-2013_Cyber-Gamers_.html
    http://www.mirrorcre...mers_.rar_links
    http://rapidshare.co...r-Gamers%5D.rar
    http://www.sendspace.com/file/la4680
    http://www.ziddu.com...Gamers.rar.html
    http://www2.zippysha...54588/file.html


    https://www.virustotal.com/pt/file/3594a919cee6d1e4ea8d0de9cdcab366b0c34385a36041339fcc0e6bb219f758/analysis/1363199873/

    Creditos: OneHitCF
  19. Upvote
    V¡®u§ got a reaction from ɓʀuɳѳ' ИИ#92 in Onehitcf 13.0 [Cf]   
    Compatibilidade:

    Windows XP : Sim
    Windowns 7 : Sim
    Windowns Vista : Sim
    Funcional : AL/NA/PH/FG/RU/EU/VN/FG/TW

    1° Extraíar o Cheat
    2° Abra o arquivo OneHitCF 11.9 (se usar Windows Vista ou 7 execute como administrador)
    3° Clique em Ok Na imagem que irá aparecer
    5° Espere 25 segundos
    4° Abra o jogo normalmente






    http://www.2shared.c...ber-Gamers.html
    http://riyavc.1fichier.com/
    http://www.4shared.c...ber-Gamers.html
    http://bayfiles.com/...r-Gamers%5D.rar
    http://depositfiles....files/g0nsa4psa
    http://www.digzip.co...CM4MBQ/OneHitCF 13.0_Cyber-Gamers_.html
    http://www.mediafire...7f98gfk66cd263c
    http://www.mirrorcre...mers_.rar_links
    http://www.sendspace.com/file/00vyil
    http://www.ziddu.com...Gamers.rar.html
    http://rapidshare.co...r-Gamers%5D.rar
    http://www2.zippysha...24968/file.html


    https://www.virustot...sis/1363910808/

    Creditos: OneHitCF
  20. Upvote
    V¡®u§ got a reaction from NewWars in Mr Catra - É Gillette Let Let Let   
    http://youtu.be/rPHqi46Tgfo
    Para ti Bruno *-*
  21. Upvote
    V¡®u§ got a reaction from NewWars in Mr Catra - É Gillette Let Let Let   
    http://youtu.be/rPHqi46Tgfo
    Para ti Bruno *-*
  22. Upvote
    V¡®u§ got a reaction from NewWars in Mr Catra - É Gillette Let Let Let   
    http://youtu.be/rPHqi46Tgfo
    Para ti Bruno *-*
  23. Upvote
    V¡®u§ got a reaction from NewWars in Mr Catra - É Gillette Let Let Let   
    http://youtu.be/rPHqi46Tgfo
    Para ti Bruno *-*
  24. Upvote
    V¡®u§ got a reaction from ɓʀuɳѳ' ИИ#92 in Delphi com assembly (Parte 1)   
    Este artigo irá introduzir os conceitos de assembler em linha (inline
    assembler) no Delphi. O artigo dará uma noção básica do assunto mas não
    pretende oferecer, em hipótese alguma, detalhes da programação assembler
    que, por si só, precisariam de um livro inteiro ou mais...


    Por que e Quando
    ================

    Se você der uma olhada no código fonte da RTL e da VCL, você encontrará
    declarações assembler inline em vários pontos. Por que a Borland optou
    por escrever partes do código da RTL e da VCL em assembler? A resposta
    é bem simples: para alcançar velocidade na execução. Nós sabemos que o
    compilador produz código rápido mas um compilador jamais será tão bom
    quanto um programador assembler profissional.

    Agora, se o assembler é tão bom, por que não foi utilizado em toda a RTL
    e VCL? A resposta é igualmente simples: porque na programação de mais
    alto nível, é mais fácil codificar, depurar, ler e manter o código, de
    modo que o sacrifício em velocidade fica compensado pelas conveniências
    decorrentes. Isso ajuda a explicar quando o assembler deve ser
    utilizado. Para ser curto, além do acesso ao sistema em baixo nível, o
    assembler inline deve ser utilizado quando a diferença na velocidade de
    execução justifica o trabalho adicional da codificação em assembler. Por
    exemplo, na unidade Math.pas, há muito assembler, basicamente para
    chamadas de sistema em baixo nível (para acesso às funções do
    coprocessador); em System.pas, SysUtils.pas e Classes.pas há também
    diversos blocos em assembler, desta vez para priorizar velocidade; no
    é estranho já que essas podem ser consideradas as unidades centrais da
    RTL e VCL.

    Em geral, procedimentos e funções que tendem a ser chamadas de forma
    repetida por um programa devem ser altamente otimizadas, mas codificação
    em assembler deve ser evitada tanto quanto possível. Se desejamos ganhos
    em velocidade, antes de optar por assembler devemos otimizar o algoritmo
    propriamente dito; depois, otimizamos o código Pascal. Se optarmos por
    assembler, o código Pascal otimizado pode servir como documentação e
    pode ser utilizado como "código de contigência" no caso de problemas com
    a manutenção do código assembler.


    Os Registradores da CPU
    =======================

    Os registradores da CPU são como variáveis predefinidas residindo na CPU
    e, por vezes, têm tarefas especiais. Eles não têm tipo e podem ser
    vistos como inteiros de 32 bits com ou sem sinal ou como ponteiros,
    dependendo da situação.

    Como estão na própria CPU, é muito mais rápido acessar valores contidos
    nos registradores do que na memória, fazendo dos registros ideais para
    fazer cache de valores.

    Como variáveis, os registradores também possuem nomes. Os nomes daqueles
    que usaremos são EAX, EBX, ECX, EDX, ESI, EDI, EBP e ESP. Cada
    registrador tem uma particularidade que o distingue dos demais:

    - Para algumas instruções, a CPU foi otimizada para utilizar o
    registrador EAX (também conhecido como acumulador) ou ao menos os
    opcodes são menores. EAX é usado nas multiplicações e as divisões,
    intructions de string, instruções de I/O, instruções de ajuste ASCII
    e decimal, e em algumas instruções especiais (como CDQ, LAHF, SAHF e
    XLAT).
    - EBX é um registrador de uso geral, e é usado implicitamente por XLAT.
    - ECX (também conhecido como contador) tem emprego especial nas
    instruções LOOP, de rotação e deslocamento de bits e de manipulação
    de literais.
    - EDX é utilizado para armazenar os 32 bits mais altos do resultado de
    uma multiplicação ou os os 32 bits mais altos do dividendo e do resto
    de uma divisão.
    - ESI e EDI (conhecidos como índice de origem (source index) e índice
    de destino ("destination index") respectivamente) são como ponteiros
    utilizados em instruções envolvendo strings.
    - EBP (conhecido como ponteiro base) é normalmente usado para endereçar
    valores na pilha (parâmetros e variáveis locais).
    - ESP (conhecido como ponteiro da pilha) é utilizado para controlar a
    pilha. é alterado automaticamente por instruções como PUSH, POP, CALL
    e RET.

    Os registradores EBX, ESI, EDI, EBP e ESP devem ser preservados, o que
    significa que antes de usá-los, devemos salvar seus valores em algum
    lugar (normalmente na pilha ou outro registradores) e, quando
    terminarmos de usá-los, devemos restaurar seus valores originais (essas
    operações implicam no uso de instruções e perda de algum tempo) de modo
    que o uso desses registradores será feito somente quando justificável ou
    quando houver uma necessidade inevitável.

    Provavelmente você percebeu que os nomes dos registradores iniciam com
    a letra "E". O "E" representa "Extended", estendido. Nos tempos do Intel
    80286, os registradores tinham 16 bits e eram chamados AX, BX, CX, etc.
    Esses registradores ainda existem e são exatamente os 16 bits menos
    significativos dos registradores EAX, EBX, ECX, etc., respectivamente. A
    propósito disso, os registradores AX, BX, CX e DX são divididos em dois
    registradores de 8 bits. AL, BL, CL e DL são os bytes menos
    significativos de AX, BX, CX e DX respectivamente, enquanto AH, BH, CH e
    DH são os bytes mais significativos de AX, BX, CX e DX respectivamente.
    Por exemplo, se o valor de EAX é $7AFD503C, então o valor de AX é $503C,
    o valor de AH é $50 e o valor de AL é $3C:

    7A FD 50 3C
    AH AL
    /----/
    AX
    /------------/
    EAX

    Se, na situação acima, armazenarmos o valor $99 em AH, então EAX
    passaria a ter o valor $7AFD993C.

    Existe um registrador especial, o registrador de indicadores (flags),
    que armazena indicadores binários alterados por instruções matemáticas
    e lógicas ou explicitamente por código, e que são normalmente usados
    em instruções de desvio condicional. O indicador carry também é usado
    em algumas instruções de rotação e o indicador de direção é utilizado
    em instruções envolvendo literais.

    Esse registrador não é acessível por nome como os demais registradores;
    mas pode ser copiado e restaurado através da pilha, utilizando PUSHF e
    POPF respectivamente, e pode também ser copiado e restaurado
    parcialmente através do registrador AH, utilizando LAHF e SAHF
    respectivamente.


    Instruções Assembler
    ====================

    Instruções assembler são dispostas em blocos asm..end blocks e têm a
    seguinte forma:

    [identificador:] [prefixo] opcode [operando1 [, operando2 [, ...]]]

    Onde opcode é o nome da instrução como MOV, ADD, PUSH, etc.

    Instruções podem ser separadas por ponto e vírgula, quebras de linhas
    ou comentários. A propósito, comentários são no formato do Object
    Pascal, isto é, o ponto e vírgula não é considerado o início de um
    comentário até o final da linha, como no assembler tradicional.

    A seguir, um exemplo de bloco asm..end com vários dos possíveis tipos de
    instruções e separadores de comentários:

    asm
    xchg ebx, edx; add eax, [ebx]; {ponto e vírgula separa declaração}
    // quebra de linha separa declaração
    mov ebx, p
    sub eax, [ebx] (*comentário separa declaração*) mov ebx, edx
    end;

    A convenção é utilizar quebras d elinhas para separação:

    asm
    xchg ebx, edx
    add eax, [ebx]
    mov ebx, p
    sub eax, [ebx]
    mov ebx, edx
    end;

    No código da VCL, você verá que os opcodes e nomes de registradores são
    escritos em maiúsculas e que instruções são indentadas em uma tabulação
    (normalmente equivalente a oito caracteres), mas utilizaremos outra
    convenção neste artigo.

    Blocos asm..end podem ocorrer em qualquer ponto do código fonte onde uma
    declaração Pascal ordinária puder aparecer; além disso, é possível
    termos rotinas 100% assembler se, ao invés de "begin", utilizarmos
    "asm":

    procedure teste;
    asm
    // declarações assembler
    end;

    Note que as duas implementações abaixo não são equivalentes:

    function f(parâmetros): tipo;
    begin
    asm
    // declarações assembler
    end;
    end;

    function f(parâmetros): tipo;
    asm
    // declarações assembler
    end;

    A razão disso é que o compilador realiza certas otimizações quando
    implementamos rotinas inteiramente em assembler, sem utilizar um bloco
    begin..end.

    As etiquetas devem ser declaradas em uma seção Label, como em qualquer
    código Object Pascal, a menos que foram prefixadas por "@@":

    function ENumeroMagico(x: integer): boolean;
    asm
    cmp eax, NumeroMagico
    je @@Bingo
    xor eax, eax
    ret
    @@Bingo:
    mov eax, 1
    end;

    As etiquetas prefixadas por "@@" são locais ao bloco asm..end em que são
    usadas. Isto gerará um erro da compilaçao:

    begin
    ....
    asm
    ....
    @@destino:
    ....
    end;
    ....
    asm
    ....
    jnz @@destino // Error
    ....
    end;
    ....
    end;

    Para corrigi-lo, necessitamos usar uma etiqueta convencional, local ao
    procedimento ou à função:

    label
    destino;
    begin
    ....
    asm
    ....
    destino:
    ....
    end;
    ....
    asm
    ....
    jnz destino // Correto
    ....
    end;
    ....
    end;


    Operandos
    =========

    Certas vezes, um ou mais operandos são implícitos. Por exemplo, a
    instrução CDQ (Converta Dword para Qword) parece não utilizar operando
    algum; entretanto, essa instrução utiliza EDX e EAX: o bit mais alto
    de EAX, o bit de sinal, é copiado para EDX de forma que, EDX:EAX passa
    a representar o inteiro em EAX convertido para Int64, onde EAX carrega
    os 32 bits menos significativos e EDX os 32 bits mais significativos.

    Para a maioria das instruções, os operandos são registradores. Por
    exemplo:

    mov eax, ecx

    copia o valor de ECX para EAX.

    Operandos podem conter valores imediatos:

    mov eax, 5
    mov eax, 2 + 3 // expressão constante, resolvida na compilação
    mov al, 'A' // o código ASCII de 'A' é $41 (65)
    mov eax, 'ABC' // equivalente a MOV EAX, $00414243

    Operandos também podem conter referências de memória:

    mov [ebx], eax // EBX^ := EAX;

    Referências de memória aparecem de várias formas:

    mov eax, [$000FFFC] // Endereço absoluto
    mov eax, [ebx] // Registrador
    mov eax, [ebp-12] // Registrador mais/menos deslocamento
    // constante
    mov eax, [ebp+ebx] // Registrador mais deslocamento em registro
    mov eax, [ebp+ebx+8] // Registrador mais deslocamento em registro
    // mais/menos deslocamento constante
    mov eax, [ebp+ebx*4] // Registrador mais deslocamento em registro
    // multiplicado por constante
    mov eax, [ebp+ebx*4+8] // Registrador mais deslocamento em registro
    // multiplicado por constante, mais/menos
    // deslocamento constante

    Os identificadores usuais do Pascal são traduzidos para uma das formas:

    mov eax, parâmetro // mov eax, [ebp + deslocamento_constante]
    mov eax, varlocal // mov eax, [ebp - deslocamento_constante]
    mov eax, varglobal // mov eax, [endereço_absoulto]
    call procname // chama endereço absoluto


    Primeiro Exemplo
    ================

    Agora que estamos prontos para aprender alguns opcodes, vamos aos
    exemplos. Podemos começar com uma função simples:

    function f(x: integer; y: integer): integer;
    // f(x,y) = (-x-y+5)*7
    {
    begin
    Result := (-x - y + 5) * 7;
    end;
    }
    asm
    // os parâmetros são passados em EAX (x) e EDX (y);
    neg eax // EAX := -EAX; // EAX = -x
    sub eax, edx // EAX := EAX - EDX; // EAX = -x-y
    add eax, 5 // EAX := EAX + 5; // EAX = -x-y+5
    imul 7 // EAX := EAX * 7; // EAX = (-x-y+5)*7
    end;

    Os três primeiros parâmetros (da esquerda para a direita) são passados
    em EAX, EDX e ECX. Para métodos, o primeiro parâmetro é Self (passado
    em EAX) e o primeiro parâmetro explicitamente declarado é, de fato, o
    segundo parâmetro (passado em EDX) e o segundo parâmetro explícito é
    de fato o terceiro parâmetro (passado em ECX).

    O valor de retorno deve ser armazenado em EAX para valores ordinais de
    32 bits (AX e AL devem ser utilizados para retornar valores de 16 e 8
    bits respectivamente).

    Os comentários explicam os opcodes de forma clara mas, para IMUL, temos
    que acrescentar duas explicações:

    * IMUL considera os operandos (EAX e 7 no exemplo) como inteiros com
    sinal (devemos utilizar MUL quando os operandos não possuírem sinal).

    * O resultado da multiplicação é um inteiro de 64 bits sendo que os 32
    bits mais significativos do resultado são armazenados em EDX.

    Multiplicações são relativamente caras em termos de tempo de CPU e, por
    vezes, é mais fácil substitui-las por deslocamentos de bits (quando a
    multiplicação ou divisão operarem com potências de dois), somas e
    subtrações. Por exemplo:

    a * 7 = a * (8 - 1)
    = a * 8 - a
    = a * 2^3 - a
    a * 7 = a shl 3 - a

    Ao invés de IMUL 7, podemos fazer o seguinte:

    mov ecx, eax // ECX := EAX; // ECX = -x-y+5
    shl eax, 3 // EAX := EAX shl 3; // EAX = (-x-y+5)*8
    sub eax, ecx // EAX := EAX - ECX; // EAX = (-x-y+5)*8 - (-x-y+5)
    // EAX = (-x-y+5)*7

    Vejamos outro exemplo:

    function resto(x: integer; y: integer): integer;
    // Retorna o resto de x dividido por y
    {
    begin
    Result := x mod y;
    end;
    }
    asm
    // os parâmetros são passados em EAX (x) e EDX (y);
    mov ecx, edx // ECX := EDX; // EDX = y
    cdq // EDX:EAX := Int64(EAX); // EAX = x
    idiv ecx // divisão inteira com sinal em 32 bits:
    // EAX := Int64(EDX:EAX) div integer(ECX);
    // EDX := Int64(EDX:EAX) mod integer(ECX);
    mov eax, edx // Result := EDX; // resto
    end;


    A Pilha
    =======

    Quando um programa é carregado, ele receve uma pilha, que é uma região
    de memória utilizada como uma estrutura LIFO, "Last In, First Out"
    (último a chegar, primeiro a sair), controlada pelo registrador ESP
    que aponta para o topo dessa pilha. ESP inicia apontando para o final
    da região de modo que, cada vez que empilhamos um novo valor de 32 bits,
    o registrador ESP é decrementado em 4 (bytes) e o valor é armazenado no
    local apontado por ESP.

    | |
    +-----------+
    | |
    +-----------+
    | $01234567 | <- ESP
    +-----------+
    | |

    PUSH $89ABCDEF // SUB ESP,4; MOV [ESP],$89ABCDEF

    | |
    +-----------+
    | $89ABCDEF | <- ESP
    +-----------+
    | $01234567 |
    +-----------+
    | |

    De forma análoga, quando retiramos um valor de 32 bits da pilha, o valor
    é recuperado do local apontado por ESP e ESP é incrementado em 4 (bytes).

    POP EAX // MOV EAX,[ESP]; ADD ESP,4

    | |
    +-----------+ +-----------+
    | $89ABCDEF | EAX | $89ABCDEF |
    +-----------+ +-----------+
    | $01234567 | <- ESP
    +-----------+
    | |

    A pilha é utilizada para armazenar endereços de retorno de rotinas,
    parâmetros, variáveis locais e resultados intermediários. No exemplo
    a seguir, utilizamos a pilha para salvar o valor de um registrador
    para uso posterior:

    function IntDiv(x: integer; y: integer; r: pinteger = NIL): integer;
    // Retorna o quociente inteiro x / y e o resto em r
    {
    begin
    Result := x div y;
    if r <> NIL then r^ := x mod y;
    end;
    }
    asm
    // os parâmetros são passados em EAX (x), EDX (y) e ECX ®
    push ecx // Salve ECX ® para uso posterior
    mov ecx, edx // ECX := EDX; // ECX = y
    cdq // EDX:EAX := Int64(EAX); // EAX = x
    idiv ecx // divisão inteira com sinal em 32 bits:
    // EAX := Int64(EDX:EAX) div integer(ECX);
    // EDX := Int64(EDX:EAX) mod integer(ECX);
    pop ecx // Restaura ECX (ECX := r)
    cmp ecx, 0 // if ECX = NIL then
    jz @@end // goto @@end;
    mov [ecx], edx // ECX^ := EDX; // resto
    @@end: // identificador local (precedido por "@@")
    end;

    Note que, para cada PUSH que executamos, temos que executar um POP
    correspondente de modo que ESP fique inalterado (ESP é um dos
    registradores que temos que preservar).

    A instrução CMP subtrai o segundo operador do primeiro (ECX-0 nesse
    caso), como a instrução SUB, mas o resultado não é armazenado em lugar
    algum, ainda que o indicador de Zero (Zero flag) seja marcado (ligado)
    ou limpo (desligado) dependendo do resultado ser zero ou não, como em
    qualquer instrução lógica ou matemática (com a exceção de certos casos).
    Podemos então tirar vantagem desse fato e, ao invés de escrevermos

    cmp ecx, 0

    podemos escrever

    or ecx, ecx // ECX := ECX or ECX;

    O resultado de ECX Or ECX é o próprio ECX; portanto, o valor armazenado
    em ECX é o mesmo de antes, e como dissemos anteriormente o indicador de
    Zero será marcado se o resultado for zero (isto é, se ECX era zero).

    A instrução JZ, "Jump if Zero" (Desvie se Zero), desvia (salta) para o
    identificador indicado como operando se o valor do indicador de Zero
    estiver marcado (ligado) ou continua normalmente com o fluxo de execução
    se o indicador de Zero estiver desmarcado (desligado).


    Passando Parâmetros para a Pilha
    --------------------------------

    Voltemos para a pilha. Dissemos que os três primeiros parâmetros de
    uma rotina são passados em EAX, EDX e ECX; mas, o que acontece quando
    temos mais de três parâmetros? Parâmetros adicionais são passados na
    pilha, da esquerda para a direita, de forma que o último parâmetro será
    sempre o primeiro da pilha.

    Suponha que temos a seguinte função

    function Soma(a, b, c, d, e: integer): integer;
    begin
    Result := a + b + c + d + e;
    end;

    e queremos fazer a chamada

    Sum(1,2,3,4,5);


    Em assembler, faríamos da seguinte forma:

    mov eax, 1
    mov edx, 2
    mov ecx, 3
    push 4
    push 5
    call Sum

    A instrução CALL empilha o endereço de retorno na pilha e salta para
    (inicia a execução) da função. A instrução RET (RETorna) gerada pelo
    compilador quando o final de uma função é alcançado desempilha esse
    endereço da pilha e salta para ele para continuar a execução a partir
    desse ponto.

    Note que quando empilhamos parâmetros na pilha mas não os desempilhamos.
    Isso acontece pois limpar a pilha é responsabilidade da função chamada e
    não da função que chama (exceto na convenção de chamada CDECL). Para
    limpar os parâmetros, a instrução RET é utilizada com um operando que
    indica o número de bytes que ESP deve ser incrementado (8 nesse caso já
    que ESP foi decrementado em 4 bytes para cada parâmetro empilhado). O
    compilador fica encarregado dessa tarefa portanto não temos com que nos
    preocupar; mas, se você utilizar a janela de depuração da CPU e
    encontrar uma instrução RET $08, agora você já sabe do que se trata.

    Na entrada para Soma, a pilha estaria, em teoria, da seguinte forma:

    | |
    +-----------+
    | Ret_Addr | <- ESP
    +-----------+
    | $00000005 | (parâmetro e)
    +-----------+
    | $00000004 | (parâmetro d)
    +-----------+
    | |

    Quando uma função tem parâmetros na pilha (ou variáveis locais), o
    compilador gera algumas instruções chamadas de "stack frame", quadro
    da pilha. Na entrada da função (em "asm"), EBP é empilhado de modo a
    ser preservado e ESP é atribuído a ele; e, antes de deixar a função,
    (em "end"), o valor original de EBP é desempilhado:

    function Soma(a, b, c, d, e: integer): integer;
    asm // push ebp; mov ebp, esp;
    ....
    end; // pop ebp; ret 8;

    Assim, quando entramos em Soma, a pilha estaria de fato da seguinte
    forma:

    | |
    +-----------+
    | Orig. EBP | <- EBP, ESP
    +-----------+
    | Ret_Addr |
    +-----------+
    | $00000005 | <- EBP+8 (parâmetro e)
    +-----------+
    | $00000004 | <- EBP+12 (parâmetro d)
    +-----------+
    | |

    Em [EBP] encontramos o valor original de EBP que foi empilhado para
    ser preservado quando da construção do quadro de pilha; em [EBP+4]
    encontramos o endereço de retorno da rotina; em [EBP+8] encontramos
    o último parâmetro (o último parâmetro é empilhado por último e, por
    isso, é o primeiro da pilha). O parâmetro seguinte (da direita para
    a esquerda) fica em [EBP+12], e assim por diante se houvesse outros
    parâmetros.

    Agora vamos escrever a rotina Soma em assembler:

    function Soma(a, b, c, d, e: integer): integer;
    {
    begin
    Result := a + b + c + d + e;
    end;
    }
    asm
    add eax, b
    add eax, c
    add eax, d
    add eax, e
    end;

    Note que no bloco asm..end nós utilizamos "b", "c", "d" e "e" ao invés
    de "EDX", "ECX", "[EBP+12]" e "[EBP+8]" respectivamente. Nós podemos
    fazer assim já que o compilador fará as substituições adequadas.


    Variáveis Locais na Pilha
    -------------------------

    Se nossa função assembler inline tiver variáveis locais, o compilador
    criará espaço para essas variáveis na pilha, movendo o ponteiro da pilha
    de modo que o quadro da pilha para uma função com duas variáveis locais
    inteiras seria:

    push ebp
    mov ebp, esp
    sub esp, 8 // Desloca ESP como se empilhássemos 8 bytes

    ...

    add esp, 8 // Desloca ESP como se desempilhássemos 8 bytes
    pop ebp

    Para o propósito do exemplo, aqui vai uma variação da rotina Soma acima,
    utilizando duas variáveis locais:

    function SomaL(a, b, c, d, e: integer): integer;
    var
    f, g: integer;
    {
    begin
    f := b + c;
    g := d + e;
    Result := a + f + g;
    end;
    }
    asm // push ebp; mov ebp, esp; sub esp, 8;
    add edx, ecx
    mov f, edx // b + c
    mov edx, d
    add edx, e
    mov g, edx // d + e
    add eax, f
    add eax, g
    end; // add esp, 8; pop ebp; ret 8

    Nessa função, a pilha teria o seguinte aspecto:

    | |
    +-----------+
    | var. g | <- EBP-8, ESP
    +-----------+
    | var. f | <- EBP-4
    +-----------+
    | Orig. EBP | <- EBP
    +-----------+
    | Ret_Addr |
    +-----------+
    | Param e | <- EBP+8
    +-----------+
    | Param d | <- EBP+12
    +-----------+
    | |


    O Que Vem Agora?
    ================

    Na continuação deste artigo, aprenderemos mais instruções e veremos
    como passar e retornar outros tipos de parâmetros, como trabalhar com
    arrays, como acessar campos de registros e objetos, como chamar métodos
    e mais.


    Nesse capítulo iremos aprender algumas novas instruções assembler e o
    básico da manipulação de strings ANSI, também chamadas de strings longas.


    Novos opcodes
    =============

    Abaixo os opcodes introduzidos neste atrigo:

    * JL (Jump if Lower, desvie se menor): A descrição mais adequada levaria
    muito tempo para ser explicada, então vamos dizer que JL salta (desvia)
    para o label especificado desde que na operação CMP (ou SUB) anterior
    o primeiro operando seja menor que o segundo numa comparação com sinal:

    // if signed(op1) < signed(op2) then goto @@label;
    cmp op1, op2
    jl @@label

    JG (Jump if Greater, desvie se maior), JLE (Jump if Lower or Equal,
    desvie se menor ou igual) e JGE (Jump if Greater or Equal, desvie se
    maior ou igual) completa a família de desvios condicionais para
    comparações com sinal.

    * JA (Jump if Above, desvie se maior): salta (desvia) para o label
    especificado desde que na operação CMP (ou SUB) anterior o primeiro
    operando seja maior que o segundo numa comparação sem sinal:

    // if unsigned(op1) > unsigned(op2) then goto @@label;
    cmp op1, op2
    ja @@label

    JB (Jump if Below, desvie se menor), JBE (Jump if Below or Equal,
    desvie se menor ou igual) e JAE (Jump if Above or Equal, desvie se
    maior ou igual) completam a família de desvios condicionais para
    comparações sem sinais.

    * LOOP: Decrementa ECX e, se não for zero, desvia para o label indicado.
    LOOP @@label é o equivalente mais curto e rápido de:

    dec ecx // ECX := ECX - 1;
    jnz @@label // if ECX <> 0 then goto @@label

    Examplo:

    xor eax, eax // EAX := EAX xor EAX; // EAX := 0;
    mov ecx, 5 // ECX := 5;
    @@label:
    add eax, ecx // EAX := EAX + ECX; // Executado 5 vezes
    loop @@label // Dec(ECX); if ECX <> 0 then goto @@label;

    // EAX seria 15 (5+4+3+2+1)


    Trabalhando com strings ANSI
    ============================

    Uma variável string é representada por um ponteiro de 32 bits. Se a
    string é vazia (''), então o ponteiro é nil (zero), caso contrário,
    esse ponteiro aponta para o primeiro caractere dessa string. O tamanho
    da string e a contagem de referência são dois inteiros em deslocamentos
    negativos a partir do primeiro byte da string:

    +-----------+
    | s: string |-------------------+
    +-----------+ |
    V
    --+-----------+-----------+-----------+---+---+---+---+---+---+---+--
    | allocSiz | refCnt | length | H | e | l | l | o | ! | #0|
    --+-----------+-----------+-----------+---+---+---+---+---+---+---+--
    (longint) (longint) (longint)

    \-----------------v-----------------/
    StrRec record
    const skew = sizeof(StrRec); // 12

    Quando passamos uma string como um parâmetro para uma função, o que de
    fato é passado é o ponteiro de 32 bits. Os valores string são um pouco
    mais complicados de explicar. A rotina que chamou a rotina que retorna
    a string deve passar- como último e invisível parâmetro da chamada, um
    tipo PString-o endereço de uma variável string que receberá o resultado
    da função.

    d := Uppercase(s); // Internamente convertido para: Uppercase(s, @d);

    Se o resultado da função é usado em uma expressão ao invés de ser
    atribuído diretamente à variável, a rotina que chama deve utilizar uma
    variável temporária incializada com nil (string vazia). O compilador faz
    tudo isso automaticamente no nosso código Object Pascal mas, se temos
    que fazer isso por conta própria se optarmos por escrever código
    assembler que chame rotinas que retornam strings.

    Para algumas tarefas, não podemos chamar as clássicas funções de string
    diretamente. Por exemplo, a função Length não é o nome de uma função de
    verdade,. é uma construção interna do próprio compilador e o compilador
    gera o código para a função apropriada, dependendo do parâmetro ser uma
    string ou um array dinâmico. Em assembler, ao invés de Lenght, teríamos
    que usar a função LStrLen (declarada na unidade System) para obter o
    tamanho da string.

    Existem mais coisas que deveríamos saber a respeito das strings mas o
    que temos já é suficiente para um primeiro exemplo.


    Versão Assembler de Uppercase
    =============================

    Eis a declaração da função:

    function AsmUpperCase(const s: string): string;

    O parâmetro "s" será passado em EAX e o endereço de "Result" será
    passado como o segundo parâmetro, ou seja, em EDX.

    Basicamente a função deve fazer:

    1) Obter o comprimento da string a converter
    2) Alocar memória para a string convertida
    3) Copiar os caracteres um a um, convertidos para maiúsculas


    1) Obter o comprimento da string a converter
    --------------------------------------------

    Faremos isso através de uma chamada a System.@LStrLen. A função espera
    a string em EAX (ela já está lá) e o resultado será colocado em EAX;
    então, temos que salvar o valor de EAX (o parâmetro "s") em algum lugar
    antes de chamar a função de modo que "s" não seja perdido. Podemos salvar
    numa variável local "src". Já que funções são livres para utilizar os
    registradores EAX, ECX e EDX, presumimos que o valor em EDX ("@Result")
    poderia também ser destruído após uma chamada a System.@LStrLen, de modo
    que é útil salvar esse valor numa variável local, por exemplo, "psrc".
    O resultado da chamada a System.@LStrLen, deixado em EAX, servirá como
    parâmetro da chamada a System.@LStrSetLength (para alocar memória para
    o conteúdo da string de resultado), como contador dos bytes a copiar, de
    modo que esse valor também deve ser salvo, por exemplo, na variável "n":

    var
    pdst: Pointer; // Endereço da string resultado
    src: PChar; // String de origem
    n: Integer; // Comprimento da string de origem
    asm
    // O endereço da string de resultado é passado em EDX.
    // Salvamos esse valor na variável pdst:
    mov pdst, edx // pdst := EDX;

    // Salvamos EAX (s) na variável local (src)
    mov src, eax // src := EAX;

    // n := Length(s);
    call System.@LStrLen // EAX := LStrLen(EAX);
    mov n, eax // n := EAX;


    2) Alocar memória para a string convertida
    ------------------------------------------

    A alocação é realizada através de uma chamada a System.@LStrSetLength.
    O procedimento espera dois parâmetros: o endereço da string (que
    salvamos em "pdst") e o comprimento da string (que está em EAX).

    // SetLength(pdst^, n); // Alocar a string de resultado
    mov edx, eax // EDX := n; // Segundo parâmetro p/LStrSetLength
    mov eax, pdst // EAX := pdst; // Primeiro parâmetro p/LStrSetLength
    call System.@LStrSetLength // LStrSetLength(EAX, EDX);


    3) Copiar os caracteres um a um, convertidos para maiúsculas
    ------------------------------------------------------------

    Se o comprimento da string era zero, já terminamos:

    // if n = 0 then exit;
    mov ecx, n // ECX := n;
    test ecx, ecx // Fazer and de ECX com ECX para definir flags
    // (ECX inalterado)
    jz @@end // Ir para @@end se o flag zero está marcado (ECX=0)

    Não sendo esse o caso, devemos copiar os caracteres de uma string para
    a outra, convertendo-os para maiúsculas conforme necessário. Nós vamos
    utilizar ESI e EDX para apontar para os caracteres da string de origem
    e destino respectivamente, AL para carregar os caracteres da string de
    origem e realizar a mudança antes de armazená-los na string de destino e
    ECX para controlar a instrução de LOOP que contará os caracteres. Já que
    ESI é um registro que tem que ser preservado, devemos salvar seu valor
    para restaurá-lo mais tarde. Decidi salvar ESI colocando-o na pilha.

    push esi // Salve ESI na pilha

    // Inicializar ESI e EDX
    mov eax, pdst // EAX := pdst; // Endereço da string de resultado
    mov esi, src // ESI := src; // String de origem
    mov edx, [eax] // EDX := pdst^; // String de resultado

    @@cycle:
    mov al, [esi] // AL := ESI^;
    // if Shortint(AL) < Shortint(Ord('a')) then goto @@nochange
    cmp al, 'a'
    jl @@nochange
    // AL in ['a'..#127]
    // if Byte(AL) > Byte(Ord('a')) then goto @@nochange
    cmp al, 'z'
    ja @@nochange
    // AL in ['a'..'z']
    sub al, 'a'-'A' // Dec(AL, Ord('a')-Ord('A'));
    @@nochange:
    mov [edx], al // EDX^ := AL;
    inc esi // Inc(ESI);
    inc edx // Inc(EDX);
    loop @@cycle // Dec(ECX); if ECX <> 0 then goto cycle

    pop esi // Restaurar ESI da pilha

    @@end:
    end;
  25. Upvote
    V¡®u§ got a reaction from Mastema in Hud Red Skin Pack   
    Transforme o Windows 7 a HUD-Vermelho
    Nota: instalador Pacotes de pele tem opção de instalação fácil e segura, por favor, desinstale a versão antiga ou outro de pacotes de pele antes de instalar a nova versão.Antes de instalar fechar todo o programa runnig, depois de terminar reinicie o sistema.
    Suporte:
    Windows 7, Windows 7 SP1 - [X86_X64] - [Language All] - [Versão Tudo]




    Baixe o instalador Offline:
    X64: http://bitshare.com/...amers-.exe.html
    http://filevice.com/pkxx7bho1b6c

    X86: http://bitshare.com/...amers-.exe.html
    http://filevice.com/17h3uy26ewxq

    Baixe instalador Online:
    X64: http://bitshare.com/...amers-.exe.html
    http://filevice.com/iqkw0grkdokn

    X86: http://bitshare.com/...amers-.exe.html
    http://filevice.com/4xhottwktx5l