0 assembly todas as paginas

Upload: rogerio-lemos

Post on 21-Jul-2015

388 views

Category:

Documents


0 download

TRANSCRIPT

Assembly uma linguagem de baixo nvel, ou seja, uma linguagem prxima daquela que as mquinas "entendem". Para utiliz-la necessrio conhecer no s a prpria linguagem como tambm as caractersticas de funcionamento da mquina. Isto coisa de doido? Nem tanto. Vou fazer algumas comparaes e depois voc pode decidir se vale a pena assemblar.

Arquivos executveis de alta performanceSe voc tem uma rotina que acaba fritando a CPU de tanto processamento, ento pense no Assembly. Os executveis criados em Assembly apresentam duas grandes vantagens: velocidade de execuo e tamanho reduzido. Alm disto, como a linguagem no tem firulas e vai direto ao ponto (ou aos registradores ), a execuo exige muito menos recursos porque qualquer assembler supera a capacidade dos melhores compiladores de linguagens de alto nvel. O software de performance crtica um alvo natural para os programas em assembly puro.

Bibliotecas de link dinmico (DLLs)O MASM (da micro$oft), NASM (da equipe liderada por Simon Tatham e Julian Hall), o TASM da Borland, o A386 de Eric Isaacson ou o GoAsm de Jeremy Gordon, enfim, praticamente todos os assemblers mais conhecidos so capazes de construir bibliotecas de link dinmico de altssima performance que podem ser utilizadas pelos prprios programas assembladores, pelo Visual C/C++, Delphi, Visual Basic, e outras linguagens capazes de chamar uma DLL. Usar um assembler significa obter arquivos de tamanho mnimo e alto rendimento que podem ser interfaceados com qualquer linguagem apta a chamar uma DLL. Algoritmos que, por exigirem processamento pesado, no podem ser implementados em linguagens de alto nvel, tornam-se viveis quando escritos em Assembly.

Mdulos de biblioteca para programas Visual C/C++O MASM produz um formato de mdulo objeto idntico aos compiladores do Visual C/C++. Isto permite construir mdulos ou bibliotecas em MASM e link-los diretamente a programas C/C++. Com isto, programadores C/C++ podem manipular reas de cdigo crticas de forma muito eficiente, ou seja, podem otimizar a manipulao de grficos, dados de alta velocidade, criptografia, compresso de dados e qualquer outra forma de manipulao de informao que exija muito processamento.

Software gratuitoAssembladores so softwares gratuitos, no podem ser comprados, vendidos ou includos em qualquer tipo de software comercial. J que o MASM uma das poucas coisas que a Microsoft disponibiliza sem cobrar um caminho de US$... este mais um motivo para comear a assemblar.

Para mim, estes quatro argumentos so mais do que suficientes. Alis, sempre que posso e quando o peso do processamento muito grande, opto pelo Assembly. claro que no vou criar um aplicativo inteiro nesta linguagem, mesmo porque para ganhar tempo na produo que existem os RAD da vida, mas enxertar cdigo Assembly no Delphi ou no C++ so dois palitos. E o resultado altamente compensador! Na srie de tutoriais desta seo vou tratar apenas de Assembly puro (nada de mistura com outras linguagens) porque se eu misturar assuntos o resultado acaba sendo uma salada. Uma vez dominado o arroz com feijo da linguagem, criar estas entidades hbridas no nenhum bicho de sete cabeas. E a, est afim de me acompanhar? Ento vamos l... siga a vov.

Links interessantesIczelion's Win32 Assembly Homepage: Um dos melhores sites que encontrei (um clssico da Internet) o do Iczelion. O menino curte Assembly e, at o momento, j produziu cerca de 60 timos tutoriais em ingls baseados no MASM. Voc pode fazer o download de tutoriais, software e exemplos de cdigo fonte. O site est meio velhinho e no foi mais atualizado, mas o material de primeira! hutch's home page: Steve Hutchesson, de Sidnei (Austrlia), um nome que voc vai encontrar com frequncia no mundo assembly. Disponibiliza o pacote do MASM32, tools, snippets de cdigos e o autor de diversos softwares (freeware e cdigo aberto) que so a salvao dos iniciantes e uma mo na roda para os experts.

ndice do Artigo Por onde comear Comentrios Todas as pginas

Assemble vem do Ingls e significa construir, juntar partes; da que vem o nome de uma linguagem de programao, o ASSEMBLY. Assembler significa construtor e o nome que se d a programas que "juntam partes", que "constroem" executveis. por isto que no possvel escrever um programa em assembler (como se costuma ver por a): o programa escrito em Assembly e depois pode ser transformado num executvel por um assembler Por onde comear aquela parte inicial, chata pra caramba, mas que no adianta ignorar porque vai fazer falta mais tarde. Neste texto voc vai ter a oportunidade de conhecer um pouco do MASM e da estrutura de um programa.

Para se comunicar com um assembler so utilizadas algumas convenes que o programa exige para poder executar as tarefas desejadas. Cada assembler tem suas prprias convenes. Nestes tutoriais vamos utilizar o MASM32 como assembler, mas voc pode usar qualquer outro da sua escolha. As diferenas so pequenas e fcil adaptar o cdigo.

O assemblerAntes de mais nada, faa o download do macroassembler da Microsoft, o MASM 32 verso 9, na seo de downloads da Aldeia. Procure na categoria Informtica|Compiladores/Decompiladores. Descompacte o arquivo zipado num diretrio (quem "fala" Assembly no usa pastas, usa diretrios!) da sua escolha e clique em /seuDiretrio/QEDITOR.EXE. Esta a interface de edio de programao - no cheia de nove horas porque programadores assembly esto acostumados a escovar bits e a fazer a maior parte do trabalho na unha sem muita frescura. Muito bem. O editor est disposio e a vem a pergunta: o que fazer agora? t afim de comear! Hehehe... lembra da parte inicial, chata pra caramba? Pois esta aqui. Tenha um pouco de pacincia e, por enquanto, feche o editor e leia o resto do texto. Depois a gente conversa.

A sequncia do trabalhoQuando se escreve um programa, na realidade se escreve um texto que contm um roteiro que precisa ser transformado num programa. Esta transformao feita em duas etapas. Primeiro, o texto precisa ser transformado num novo roteiro que contenha instrues para a CPU. Esta primeira traduo produz os assim chamados arquivos objeto. O programa que produz arquivos objeto chamado de assembler ou compilador. Os arquivos objeto, por sua vez, servem de fonte para outro tipo de programa: o linker. Os linkers adicionam referncias de endereos aos arquivos objeto e os transformam em arquivos executveis, a verso final do seu programa. Resumindo as etapas, tem-se o seguinte:Arquivo Texto (.ASM) Executvel (.EXE) Editor de Texto Linker ---> Arquivo Objeto (.OBJ) Assembler (compilador) ---> Arquivo

O MASM um aplicativo que pode coordenar o seu trabalho: possui um editor de texto, um compilador e um linker. Atravs da janela do MASM possvel gerenciar todo o processo de produo de um programa. Voc pode escrever seu texto (ou script) em qualquer editor de texto, at com o bloco de notas do Windows. Como usaremos o MASM, podemos usar o editor de texto do prprio. Se escrevermos uma receita de bolo no editor de texto e pedirmos para o MASM (compilador+linker) transform-lo num programa... hmmmm... o MASM vai ficar perdidinho da silva. preciso criar um texto que o MASM entenda e, o que mais importante, obedecendo uma determinada estrutura.

A estrutura de um programaA primeira informao que o MASM precisa para poder trabalhar o tipo de CPU para a qual o programa se destina. Isto necessrio para que o compilador possa escolher o conjunto de instrues compatveis com a CPU. Como pretendemos produzir programas de 32 bits, indicamos o conjunto de instrues como sendo do tipo 80386 em diante (80386, 80486, Pentium, etc). Trabalhar com o conjunto de instrues do 386 costuma ser mais do que suficiente. Como que passamos essa informao para o compilador? Usando uma diretiva apropriada:.386 ---> para processadores do tipo 80386 .486 ---> para processadores do tipo 80486

Puxa vida, por enquanto, nada de programa. Ainda precisamos indicar qual o modelo de memria que deve ser usado. Um executvel carregado na memria de acordo com o modelo de memria definido durante a compilao. Na poca dos computadores de 16 bits, o programa era carregado na memria em segmentos de tamanho predefinido. Era uma complicao danada gerenciar a execuo do programa: para cada endereo era necessrio indicar o segmento correspondente e saltar de um segmento para outro parecia soluo e "comia" um monte de processamento. Com o advento dos 32 bits, os executveis passaram a ser carregados na memria em endereos contguos. Imagine um segmento nico de memria contendo o executvel, uma tripa enorme com a sequncia de instrues. Este modelo de memria foi denominado FLAT, ou seja, modelo plano ou contnuo. Ento, l vai mais uma diretiva:.MODEL FLAT

Qualquer programa, com toda certeza (tem tanta certeza assim?) vai realizar algum trabalho, ou seja, vai ter funes. As funes geralmente precisam de dados para executar uma tarefa. Estes dados podem ser gerados dentro da prpria funo ou serem enviados para elas. Dados enviados a uma funo so chamados de parmetros. A forma de mandar estes parmetros tambm precisa ser definida previamente: se houver mais de um parmetro, podemos envi-los de frente para trs ou de trs para frente, ou seja, da esquerda para a direita ou da direita para a esquerda. Veja um exemplo: suponha que uma funo espere receber dois parmetros (param1 e param2). Podemos envi-los na sequncia param1, param2 ou na sequncia param2, param1. A primeira conveno de passagem de parmetros conhecida como PASCAL e a segunda como conveno C. Os parmetros recebidos so guardados temporariamente num registrador da CPU chamado de pilha (stack). Imagine a pilha como uma pilha de caixas de sabo em p no supermercado. medida que voc colocar novas caixas na pilha, a pilha vai crescendo; medida que tira, a pilha vai encolhendo; se voc tirar uma caixa do meio da pilha, as caixas vo cair. Como o contedo da pilha alterado quando uma funo chamada ou quando a prpria funo alter-lo, preciso fazer um ajuste de pilha em cada retorno de funo... seno a pilha "cai" e o programa d pau. Na conveno de passagem de parmetros do tipo Pascal, a funo chamada a responsvel pelo ajuste da pilha antes do retorno. Na conveno C, a rotina chamadora a responsvel. Existe uma terceira conveno de passagem de parmetros

denominada STDCALL (abreviao de STanDard CALL - chamada padro). Usando esta conveno, os parmetros so enviados da direita para a esquerda (como na conveno C) mas a funo chamada a responsvel pelo ajuste da pilha. A STDCALL um hbrido das convenes Pascal e C. Os sistemas win32 utilizam exclusivamente a conveno de passagem de parmetros STDCALL. Podemos e devemos completar a diretiva acima com:.MODEL FLAT, STDCALL

Na maioria das vezes, um programa precisa de dados inicializados (com valores definidos) para poder comear a funcionar. So coisas do tipo nome do aplicativo, ttulo da janela principal, etc. Para indicar ao MASM que vamos listar nomes de variveis e seus respectivos valores, usamos a diretiva .DATA. Tudo que o compilador encontrar nas linhas subsequentes, at encontrar outra diretiva, ele vai considerar como variveis (dados) inicializados. Tambm podemos preparar variveis no inicializadas, ou seja, fazemos com que o assembler ponha determinados nomes de variveis na lista de variveis, mas sem valores definidos. Estes dados no inicializados podem ser usados posteriormente pelo cdigo. A diretiva .DATA? faz a indicao. Variveis, como o prprio nome indica, podem ter seus valores alterados. Num determinado projeto pode ser que sejam necessrios dados de valores fixos, as assim chamadas constantes. Neste caso, utilizamos a diretiva.CONST. Todos estes dados, indicados antes do programa propriamente dito, podem ser usados em qualquer ponto do cdigo. Tanto faz se estamos no mdulo principal ou em alguma subrotina (funo) - estes dados esto sempre disponveis e acessveis. So os chamados dados globais (variveis e constantes). Enquanto o programa estiver sendo executado, estes dados ficam preservados. S so destrudos quando o programa termina. Ufa! Finalmente chegamos no miolo do programa. onde deve ficar o cdigo que indica como nosso programa deve se comportar e o que deve realizar. A diretiva usada no poderia ser outra: .CODE indica o incio do nosso cdigo. S que esta a ltima diretiva da estrutura e o assembler no tem como saber onde ela termina. Estabelecemos ento o limite com um rtulo seguido por dois pontos. O d um nome rea de cdigo e indicamos o fim da rea com um "end ". Voc pode escolher o nome que quiser, por exemplo:.CODE ---> Incio do cdigo inicio: ---> Rtulo indicando o incio da rea de cdigo ... (seu cdigo) ---> Fim da rea de cdigo

end inicio

Resumindo, a estrutura que o MASM entende e aceita para assemblar e linkar a seguinte:.386

.MODEL FLAT, STDCALL .DATA ... (aqui vo os dados inicializados) .DATA? ... (aqui vo os dados no inicializados) .CONST ... (aqui ficam as constantes) .CODE inicio: ... (aqui est todo o cdigo do programa) end inicio

Palpites da vPor enquanto, s. Depois que voc estiver familiarizado com o Assembly, vai usar esta estrutura de diretivas automaticamente, sem problema algum - mas sempre bom revisar o que realmente significam e como devem ser utilizadas. Para voc que est comeando, ento isto tudo novidade. D mais uma lida no texto e fixe bem os conceitos para evitar futuras dores de cabea com programas "mal comportados".

Veja quais so os os arquivos envolvidos na rotina de criao de um programa. Para criar um programa escrito em Assembly e que rode no ambiente Windows e *nix, vrias etapas precisam ser cumpridas. Inicialmente escreve-se o chamado cdigo fonte ou script do programa e, se necessrio, um arquivo de recursos. Estes arquivos, em texto ASCII puro, sero transformados em arquivos objeto os quais, por sua vez, sero utilizados para compor o executvel. Observe que so trs etapas distintas: elaborao do cdigo fonte, compilao e linkedio.

As etapasElaborao .asm .rc Compilao .obj .res Linkedio

Arquivos fonte Arquivos objeto Executvel .exe ou .dll

Os arquivos de recursos (.rc) s so necessrios quando se quer utilizar recursos adicionais, como menus e bitmaps. Isto significa que podem ou no estar presentes no seu projeto. Vamos explorar cada uma das fases.

O cdigo fonteOs arquivos que contm o cdigo fonte deve ser gravados em texto ASCII puro, ou seja, no devem conter caracteres especiais de formatao. Podem ser produzidos em

qualquer editor de texto que oferea a possibilidade de salvar arquivos neste formato (geralmente chamado simplesmente de formato texto). O bloco de notas do Windows um bom editor para este trabalho, mas voc pode usar o editor que mais lhe convier, inclusive o editor oficial da Aldeia, o SilicioPad, que nada mais do que o bloco de notas modificado para mostrar o nmero das linha no rodap da janela (como fazer esta mandrakaria ser tema de um tutorial avanado). Se quiser experimentar, faa o download do SilicioPad em Downloads/Informtica/Editores. hbito dos programadores indicar a linguagem usada na extenso do arquivo fonte. Por exemplo, .asm para cdigo fonte em Assembly, .c para a linguagem C, .cpp para a C++ ou .pas para Pascal (Delphi). O programa assembler (ou compilador) aceita qualquer extenso, contanto que o cdigo fonte seja o que ele espera. Um arquivo .asm contm as instrues para o processador na forma de palavras e nmeros. Estas instrues sero executadas pelo processador quando o programa rodar. Acontece que o processador no entende o cdigo fonte: ele precisa ser transformado em "linguagem de mquina" e estar "arrumado" de acordo com um padro que o sistema operacional consiga identificar. Esta transformao feita em duas etapas: o compilador prepara o cdigo fonte guardando o cdigo fornecido no formato COFF (Common Object File Format) num arquivo objeto (.obj) e este, por sua vez, transformado pelo linkeditor num arquivo executvel (.exe) no formato PE (Portable Executable).

O arquivo objetoUm arquivo objeto criado pelo compilador ou assembler a partir de um arquivo .asm. O compilador pega as instrues do arquivo .asm, que esto em palavras e nmeros, e as transforma no formato objeto COFF, que o formato que o linker espera. O compilador concatena todo o cdigo e os dados de instruo presentes no cdigo fonte e os coloca em sees de cdigo e de dados no arquivo .obj. A seo de cdigo contm as instrues, os chamados cdigos operacionais (opcodes) que o processador executa quando o programa rodado. A seo de dados contm informaes que sero mantidas na memria enquanto o programa estiver sendo executado. No possvel rodar um arquivo .obj como um programa, por que no tem a forma final de um executvel. O formato de um executvel esperado pelo Windows o formato PE. Algumas vezes o arquivo .obj chamado de arquivo "binrio" ou simplesmente "bin", o que se justifica porque ele no contm mais os mnemnicos, apenas nmeros.

O cdigo fonte dos recursosComo todo cdigo fonte, este tambm um arquivo texto produzido com um editor de texto. Deve conter palavras e nmeros que o sistema operacional usa para montar os recursos do programa que ser executado os quais, geralmente, so menus, dilogos e tabelas de strings. Tambm serve de fonte de referncia para outros arquivos como cones, bitmaps e cursores. Maiores detalhes em como criar um arquivo de recursos voc encontra nos tutoriais.

O arquivo objeto dos recursosO arquivo de recursos compilado como se fosse um "arquivo objeto" dos recursos. Normalmente no se usa este termo, mas a comparao perfeitamente vlida. Este arquivo produzido por um compilador de recursos, o qual formata as instrues contidas num arquivo .rc (palavras e nmeros), convertendo-o num arquivo .res pronto para ser inserido na seo de recursos de um executvel final por um linker.

O executvelO arquivo executvel o arquivo final que pode ser executado pelo sistema operacional. Geralmente est no formato PE, reconhecido pelo Unix, Linux, Windows, etc. O programa produzido por um linker, o qual usa um ou mais arquivos .obj e .res e os combina num executvel final. O formato PE tambm exige que o executvel tenha um cabealho com informaes a respeito do arquivo .exe. O linker fornece estas informaes.

Arquivos DLLEste tipo de arquivo contm funes e dados que outros executveis podem utilizar quando estiverem rodando. So teis quando contm funes que sero chamadas repetidas vezes por vrios executveis. Ao invs de repetir estas funes em cada um dos executveis, estes utilizam uma fonte comum: as DLLs. O acrnimo DLL originase de Dinamic Link Library - Biblioteca de Vnculo Dinmico.

Se voc j leu os tutoriais "Porque Assembly" e "Por onde comear", j um bom comeo. A idia esta mesmo: ir seguindo os tutoriais na sequncia em que so listados. Posso imaginar que os iniciantes estejam doidinhos para por a mo na massa, mas sinto dizer, ainda falta mais uma coisinha: no adianta querer comear a programar sem saber o que so cdigos operacionais e mnemnicos, o que este tutorial curtinho vai explicar.

A "linguagem" binriaEm nvel de hardware s existe um "idioma": o binrio. Isto significa que o processador (e todos os outros componentes de um computador) s entendem "binars", ou seja, bits ligados ou desligados. Digamos que eu queira enviar o valor 1.453.785.342 para um registrador da CPU. Para que o computador "entenda" o que estou querendo dizer, este valor precisa chegar no formato binrio. Considerando que bits ligados sejam iguais a 1 e bits desligados sejam

iguais a 0, a seguinte "tripa" de bits precisa ser enviada:1010110101001110000000011111110 ESP ;move o valor do ponteiro da pilha para o registrador EBP SUB ESP,30h ;move o ponteiro da pilha para abrir uma rea de armazenamento para dados locais MOV D[EBP-20h],500h ;insere o valor 500 hexa na rea de dados locais

Instrues de execuo

Estas instrues desviam o processador para que execute cdigo a partir de um ponto que no seja a prxima linha de execuo. So exemplos:CALL MAKEWINDOW CALL EAX depois retorna RET JZ 4 marcador 4: JC >.fim JMP MAKEWINDOW LOOP 2 ;executa o cdigo do procedimento e depois retorna ;executa o cdigo a partir do endereo presente em EAX e ;termina este procedimento retornando ao chamador ;se o resultado for zero, continua a execuo a partir do ;se a flag estiver ativa, continua a execuo a partir de .fim ;continua a execuo a partir do procedimento nominado ;decrementa ECX e salta para o marcador 2: a no ser que ECX=0

Instrues de memriaEstas instrues lem ou escrevem em reas de memria que no sejam da pilha. Normalmente estas reas esto na seo de dados do prprio executvel ou podem ser alocadas pelo sistema operacional em tempo de execuo. So exemplos:ADD EAX,[ESI] ;adiciona a EAX o contedo de memria cujo ponteiro de endereo est no registrador ESI MOV EAX,[MEUSDADOS] ;move para EAX o contedo de memria cujo marcador MEUSDADOS SUB D[MEUSDADOS+64],10h ;subtrai 10h do dword em MEUSDADOS mais 64 bytes CMP B[MEUSDADOS+EDX*4],2 ;compara um byte com 2 numa parte do array MEUSDADOS LODSB ;carrega o byte na memria apontada por ESI em al STOSD ;carrega o contedo de EAX na memria apontada por EDI

Instrues de flagAs principais flags usadas so a Z (flag zero), C (flag carry), S (flag de sinal) e D (flag de direo). A maioria das instrues alteram as flags automaticamente para mostrarem o resultado da instruo. Existem determinadas instrues que podem ser usadas para alterar o valor das flags manualmente:STC CLC STD CLD ;ativa ;limpa ;ativa ;limpa a a a a flag flag flag flag de de de de carry carry direo para LODS, STOS, CMPS, SCAS, MOVS direo

Declaraes de memriaO sistema operacional reserva memria para o executvel quando ele executado. Declaraes so feitas para reservar memria na seo de dados ou na seo de constantes se os dados devem ser inicializados, isto , devem receber um valor. Se

forem dados no inicializados, a rea de dados pode ficar reservada na seo de dados no inicializados. Isto no toma espao algum no arquivo executvel, por que um espao de memria alocado para este tipo de dado quando o executvel iniciado pela primeira vez. Seguem exemplos de como a memria declarada, o que pode variar de acordo com o assembler utilizado:DB 4 ;declara um byte e lhe atribui o valor inicial 4 MEUDADO DB 4 ;um byte de valor inicial 4 com o marcador MEUDADO MYSTRUCT DD 16 DUP 0 ;16 dwords, todos com valor zero, chamados MYSTRUCT BUFFER DB 1024 DUP ? ;1024 bytes chamados BUFFER como dados no definidos

Diretivas para o assemblerSo instrues que orientam onde o Assembler deve colocar o cdigo fonte que as segue. O Assembler marca a seo de cdigo como apenas para leitura e executvel; as sees de dados definidos e indefinidos como leitura/escrita. Veja alguns exemplos (que podem variar de acordo com o assembler):CODE SECTION DATA SECTION CONST SECTION ;tudo o que se segue deve ser colocado numa seo ;marcada para apenas leitura e executvel (cdigo) ;tudo o que se segue deve ser colocado numa seo ;com atributos de leitura e escrita mas no de cdigo ;tudo o que se segue deve ser colocado numa seo ;com atributo de apenas leitura

ComentriosAps ponto e vrgula, o texto ignorado at a prxima quebra de linha. Desta forma possvel associar descries e explicaes ao cdigo fonte, as quais sero ignoradas pelo assembler.

Instrues para o sistema operacionalProporcionam ao programador o acesso a uma grande variedade de funes. No caso do sistema operacional Windows, proporcionam acesso API. Veja os exemplos abaixo:PUSH 12h CALL GetKeyState TEST EAX,80000000h ligado) JZ >L22 PUSH 24h PUSH ESI,EDI PUSH [hWnd] ;pe valor hexa 12 na pilha para a chamada API ;pede ao Windows para por o estado da tecla Alt em EAX ;testa se a tecla Alt est sendo pressionada (bit 31 ;no, saltar para L22 ;valor hexa 24 = ponto de interrogao, botes yes e no ;endereo do ttulo, endereo da mensagem ;manipulador da janela proprietria

CALL MessageBoxA CMP AL,7 JNZ >L40 PUSH 0 PUSH ADDR FILE_DONE resultado PUSH ECX,EDX PUSH ESI CALL WriteFile PUSH 808h,5h PUSH EBX,EDX CALL DrawEdge PUSH 4h,3000h,ESI,0 CALL VirtualAlloc leitura/escrita PUSH 0,[hInst],0,0 PUSH 208,130,30,300 PUSH 80C80000h PUSH EAX PUSH 'LISTBOX' PUSH 0 CALL CreateWindowExA

;mostra a caixa de mensagem Windows pedindo yes/no ;checa se "no" foi clicado pelo usurio ;no, saltar para L40 ;d endereo do arquivo FILE_DONE para receber o ;ECX = bytes que devem ser escritos, EDX=fonte de dados ;ESI = manipulador do arquivo ;escrever ECX bytes de EDX para ESI ;808 = em baixo e meio preenchido, 5 = elevado ;ebx = RECT, EDX = contexto do dispositivo ;desenhar retngulo especial com bordas na tela ;4h = fazer memria leitura/escrita, 3000h = reservar ;reservar e consignar ESI bytes de memria ;param, manipulador do mdulo, menu e proprietrio ;altura, largura, y, x ;estilo (POPUP+CAPTION+SYSMENU) ;EAX = endereo da string terminada em zero com o ttulo ;por ponteiro para 'LISTBOX' na pilha ;estilo extended (nenhum) ;criar a janela listbox

...... ou, se preferir, usar INVOKE .. INVOKE CreateWindowExA, 0,'LISTBOX',EAX,80C80000h,300,30,130,208,0,0,[hInst],0 ............. INVOKE ShowWindow, [hWnd], 1

Bit e Binrio, veja o que possvel fazer com um simples bit. Um bit um elemento eltrico dentro do computador que pode estar "ligado" ou "desligado". Em termos fsicos, um semi-condutor capaz de conduzir pequenas quantidades de eletricidade quando est "ligado", coisa que no consegue quando est "desligado". Quando est "ligado" pode ser considerado como tendo o valor 1 (um). Em linguagem de computador diz-se que o bit est "setado" (do ingls - set). Quando est "desligado", pode ser considerado como tendo o valor zero. Em linguagem de computador o bit est "zerado". Bits s podem estar setados ou zerados - no possuem qualquer outro estado. Portanto, um bit s pode ter um valor binrio de 0 ou 1. Dois ou mais bits podem ser associados para criar nmeros maiores. Quando bits so associados, o bit da direita chamado de menos significativo e, se estiver setado, representa o valor um. O prximo bit, esquerda, chamado de mais significativo e possui o fator dois. Quando este bit estiver setado, ele representa o valor dois. Agora imagine um nmero formado por dois bits. O nmero em binrio pode ser 00 ou 01 ou 10 ou 11 e seus equivalentes no sistema decimal so 0, 1, 2 e 3.

Byte, word e dword

Bytes, words e dwords so blocos de dados bsicos usados em programao. O processador ir trabalhar com o tamanho de dados adequados para executar corretamente as instrues que receber. Um byte possui 8 bits, um word possui 16 bits. Partindo desta premissa, um word possui 2 bytes (16 bits) e um duplo word (dword) possui 4 bytes ou 32 bits. Um byte pode representar valores decimais de 0 a 255. O valor decimal 255 o total dos valores de todos os 8 bits de um byte, ou seja, decimal 128, 64, 32, 16, 8, 4, 2 e 1. Some estes valores e voc vai chegar no valor 255. Isto quer dizer que, quando todos os oito bits do byte esto setados, o valor do byte 255. Um word pode representar os valores decimais de 0 a 65.535 (o que o mesmo que dizer 64 Kilobytes). 64 Kb o total dos valores de todos os 16 bits setados, assim como na explicao anterior. Um dword (literalmente um "double word" ou "palavra dupla") pode representar os valores decimais de 0 a 4.294.967.295 (4 Gigabytes). 4 Gb ou 4 giga o total dos valores de todos os 32 bits. Existem blocos de dados maiores que o processador consegue manipular - um qword (literalmente "quad word" ou "palavra qudrupla") so 64 bits de dados (4 words ou 8 bytes), um tword possui 80 bits de dados (10 bytes) e algumas instrues podem usar at 128 bits (16 bytes). D para perceber que estes nmeros so bastante grandes. Agora vamos para valores menores. Um nibble a metade de um byte, ou seja, possui quatro bits de dados. Num byte existem dois nibbles e cada um deles s consegue representar valores decimais de 0 a 128. Este valor pode ser representado como um nico nmero hexadecimal. Tome o nmero hexadecimal 148C como exemplo. Ele constitudo por dois bytes. O primeiro byte contm o valor 14h e o segundo 8Ch. Neste caso, os nibbles contm os valores 1, 4, 8 e C (em hexadecimal).

Sistemas de notaoSe voc quiser conhecer bit e binrio em maiores detalhes, ento leia Sistemas de Notao.

Os programadores representam valores na forma hexadecimal por vrios motivos. Um motivo porque conveniente visualizar o nmero em forma de dados. Isto no s ajuda a lidar com nmeros muito grandes, mas tambm permite saber quais bits esto "setados" e quais esto "zerados", algo muito til quando bits individuais precisam ser testados. Outra razo que, usando nmeros hexadecimais, a aplicao de instrues lgicas (por exemplo OR, AND, TEST e BT) torna-se mais fcil e menos sujeita a erros. Nmeros hexadecimais possuem base 16. A denominao hexa tambm usada

(hexa=6 e deci=10 indica a base 16). Cada nmero hexa pode ter um valor de 0 a 9 e de A a F. Cada nmero hexa representa quatro bits de dados binrios. Na tabela abaixo encontram-se os valores que podem ser criados com quatro bits e seus respectivos valores hexa e decimal: Binrio Hexa Decimal 0000 0 0 0001 1 1 0010 2 2 0011 3 3 0100 4 4 0101 5 5 0110 6 6 0111 7 7 1000 8 8 1001 9 9 1010 A 10 1011 B 11 1100 C 12 1101 D 13 1110 E 14 1111 F 15 Um byte formado por 8 bits e pode ser representado por dois dgitos hexa; um word tem 16 bits e pode ser representado por quatro dgitos hexa; um dword (duplo word) tem 32 bits e pode ser representado por oito dgitos hexa. Voc percebe a verdadeira vantagem de usar nmeros hexadecimais medida que os nmeros vo se tornando maiores. Observe a tabela abaixo: Binrio 1000 0000 1000 0000 0000 0001 1111 1111 1111 1111 Hexa 80 80 01 FF FF Decimal 128 32 769 65 535 Tipo byte word word

1000 0000 0000 0000 0000 0000 0000 0001 80 00 00 01 2 147 483 649 dword 1111 1111 1111 1111 1111 1111 1111 1111 80 00 00 01 4 294 967 295 dword Para programar em assembly, voc precisa ter o sistema hexadecimal na ponta da lngua. Se quiser mais informaes, leia Sistemas de Notao.

Fora do mundo dos computadores considera-se que os nmeros so

infinitos. Sempre possvel somar mais um ou adicionar alguns zeros fazendo com que o nmero no pare de crescer. Para um computador os nmeros so essencialmente diferentes por que o tamanho dos blocos de dados utilizados FINITO. Por exemplo, um byte no consegue guardar um nmero maior do que 255. Se, numa instruo de byte, for adicionado 1 a 255, a soma retorna zero. Na prtica, ocorrendo esta situao, a instruo faz com que a flag de carry (ou flag de transposio) seja setada para 1 para mostrar que o novo nmero grande demais para o tamanho de dados que foi utilizado. Flag significa bandeira e as bandeiras so "levantadas" quando recebem o valor 1 para dar algum tipo de aviso. Fica mais fcil entender quando se observa os bits: Flag de Carry Binrio Decimal 1111 1111 255 0000 00001 1 1 0000 0000 0

Nmeros com sinalComo o tamanho dos dados finito, pode-se considerar os dados como tendo dois valores simultneos, um positivo e outro negativo. Explico. Quando somamos dois nmeros decimais, frequentemente colocamos um "vaium" na prxima coluna, assim:11 95 + 58 ----153

A soma de dois nmeros hexadecimais no muito diferente. Somar 3 com F nos d 2, com um "vai-um" para a prxima coluna:Soma decimal 3 + 15 ----18 Soma hexadecimal 1 3 + F ---12

Agora veja o que acontece quando somamos 5 com FF:Soma decimal 1 5 + 255 ----260 Soma hexadecimal 11 05 + FF ----104 Soma binria 1 1111 111 0000 0101 + 1111 1111 -----------1 0000 0100

Os "carries" (vai-um) sucessivos se movem para as posies esquerda. Se ignorarmos o ltimo 1, porque "estourou" o tamanho do byte, obtemos a resposta 4. Isto significa que FF (255 decimal) se comportou como -1 (5-1=4), portanto, como um nmero com sinal. Se considerarmos FF como um nmero sem sinal, o resultado um erro de overflow porque o byte no consegue guardar o valor hexa 104. O resultado s poderia ser guardado se estivssemos trabalhando com um bloco de dados word, de 16 bits, ou maior. Se o nmero ou no negativo depende do bit mais significativo do bloco de dados (o bit mais esquerda), que conhecido como o "bit de sinal". Se os dados estiverem com o bit de sinal setado, ento o nmero um nmero negativo com sinal. Se o bit de sinal estiver zerado, ento um nmero positivo com sinal. Portanto, fcil reconhecer um nmero com sinal. Se trabalharmos com words de 16 bits podemos obter valores com nmeros sem sinal que vo de 0 a 65535 (ou de 0000 a FFFF em hexa). Se trabalharmos com nmeros com sinal, metade dos valores sero positivos e a outra metade sero valores negativos. Observe o bit de sinal dos blocos: Hexa Binrio

0000 0000 0000 0000 0000 Positivos ... ...

7FFF 0111 1111 1111 1111 8000 1000 0000 0000 0000 Negativos ... ...

FFFF 1111 1111 1111 1111 Em todas as formas binrias dos nmeros positivos de 16 bits, o bit de sinal (bit 15) sempre zero. Para todos os nmeros negativos o bit de sinal sempre 1. O mesmo raciocnio serve para valores armazenados em blocos de 32 bits, onde o bit de sinal o 31. Se estiver setado, o valor negativo; se estiver zerado, o valor positivo. Se considerarmos apenas os inteiros positivos sem sinal o valor varia de 0 a 4.294.967.295.

Complemento de doisOs nmeros negativos acima descritos so conhecidos como Complemento de Dois dos nmeros positivos. Diz-se "de dois" porque a converso feita em dois passos. O primeiro deles achar o complemento. O segundo adicionar 1 ao complemento encontrado. Para obter o complemento de um nmero, tomamos sua forma binria e invertemos todos os bits. Por exemplo: Decimal Hexa 240 F0 Binrio 1111 0000 Complemento Hexa Decimal 0000 1111 0F 15

76

4C

0100 1100

1011 0011

B3

179

O segundo passo adicionar 1 ao resultado do complemento:Complemento de dois de F0 0000 1111 (0F) + 1 (01) ----------0001 0000 (10) Complemento de dois de 4C 1011 0011 (B3) + 1 (01) ----------1011 0100 (B4)

Fundiu a cabea? No se procupe, com o tempo a coisa fica bem mais fcil. No se deixe intimidar por to pouco! Voc sempre pode voltar e dar uma revisada

Da mesma forma que possvel considerar o computador como sendo constitudo por elementosfsicos, como o teclado, o monitor e as unidades de disco, o PC pode ser descrito em termos de blocos de elementosfuncionais. A parte do computador que faz a "computao", por exemplo, chamada de microprocessador. Este ligado a diversos componentes que formam o que conhecemos como o computador completo. Generalizando, o PC formado por um microprocessador, memria e dispositivos diversos.

Na programao assembly essencial conhecer os elementos funcionais do computador. Afinal de contas, se assembly linguagem de mquina, precisamos conhecer a mquina O diagrama ao lado (clique para ampliar) mostra de forma simplificada o sistema do computador. Observe que o computador pode coordenar e executar uma grande variedade de funes devido aos seus circuitos integrados de apoio, todos eles ligados ao microprocessador por uma srie de buses. Cada um destes itens funcionais, seja a memria ou um dispositivo como o teclado ou o monitor, fica ligado pelos buses de controle, de endereos e de dados.

O bus de controle, por exemplo, tem sinais que indicam quando os dados esto disponveis para leitura. Os buses de endereos e de dados so usados para o acesso aos dispositivos e memria. Cada item ligado ao bus de endereos pode reconhecer uma combinao exclusiva de sinais eletrnicos, conhecida como seu endereo. O microprocessador fornece os sinais e depois utiliza o bus de dados para a transferncia dos dados. Quando ele quer ler dados da memria, sinaliza o local da memria desejado no bus de endereos e l os dados vindos pelo bus de dados. A exata sincronizao da sinalizao de endereos e leitura de dados dada pelo bus de controle. O microprocessador sinaliza para o circuito de controle o endereo de memria que ele quer ler e o circuito de controle de memria avisa quando os dados estiverem disponveis. Um sistema central de sincronizao, conhecido como clock do sistema, fornece um pulso regular e sncrono para o microprocessador e todos os outros componentes do computador. Este clock gerado por um dispositivo eletrnico conhecido como gerador de clock, que ligado a um cristal. Quando passa uma voltagem por este cristal, ele produz um sinal numa determinada frequncia. A medida de tempo para o clock do sistema a velocidade do clock, que considerada a velocidade do computador. Um computador de 733 MHz, por exemplo, tem um sinal de clock que oscila 733 milhes de vezes por segundo. O software do computador uma srie de instrues e dados que o microprocessador processa. Cada instruo demora um nmero especfico de pulsos do clock do sistema. Durante um ciclo de clock, o microprocessador l a prxima localizao na memria e executa a instruo encontrada. Entretanto, nem todos os itens de um PC podem funcionar usando este pulso regular. Itens que podem funcionar com pulsos so chamados de sncronos, aqueles que no podem so considerados assncronos. Por exemplo, quando uma tecla digitada, no possvel sincronizar a digitao com o clock do sistema porque no possvel prever quando a tecla ser acionada. Os eventos assncronos so tratados pelo controlador de interrupo. Este serve como interface entre o microprocessador e dispositivos como o teclado, um drive de disco ou o monitor. Se um sinal de interrupo foi alterado desde a ltima vez que o controlador de interrupo verificou, o controlador identifica o dispositivo assncrono, o microprocessador detecta este sinal e literalmente interrompe seu processamento para atend-lo.

A Unidade Central de Processamento (CPU - Central Processing Unit), tambm chamada simplesmente de Processador ou Microprocessador, o "crebro" do computador. Sua misso consiste em controlar e coordenar todas as operaes do sistema. Extrai todas as instrues dos programas residentes na memria do computador (memria RAM), uma de cada vez, as analisa e emite as ordens necessrias para serem realizadas. Para entender como funciona um microprocessador, primeiro necessrio ter uma idia muito clara das partes ou blocos que o compem. Sem conhecer a arquitetura bsica de um processador praticamente impossvel entender seu funcionamento. De forma geral, podemos considerar que os processadores possuem dois grandes blocos ou

unidades: a de controle, com duas unidades responsveis pela decodificao e execuo, e a unidade aritmtico-lgica (ALU - aritmethic logic unit).| Decodificao UNIDADE DE CONTROLE --------------| | Execuo ALU - UNIDADE ARITMTICO-LGICA

A unidade de decodificao, uma das principais unidades da unidade de controle, identifica a instruo que est para ser executada. Quando o processador l uma instruo que est na memria, o cdigo desta instruo enviado para esta unidade. A unidade ento interpreta este cdigo, verifica se vlido e determina o tipo da instruo que deve ser executada (por exemplo uma soma), a trasnferncia de dados para a memria e o que mais for necessrio. Uma vez identificada a instruo, a unidade de decodificao comunica a unidade de execuo. A unidade de execuo, ao ser informada da instruo que deve ser executada, aciona de forma coordenada as diversas partes do processador para que ocorra a execuo da instruo recebida. A ALU, ou unidade aritmtico-lgica, o bloco encarregado de realizar todas as operaes aritmticas. As operaes que esta unidade realiza so soma, subtrao, multiplicao, diviso e as operaes lgicas, como AND, OR, NOT, XOR.Buscar instruo na RAM -----> Decodificar a instruo -----> Buscar os operandos | V Armazenar o resultado