filip_e Posted June 27, 2005 at 10:06 AM Report #1422 Posted June 27, 2005 at 10:06 AM A linguagem Assembly Assembly é uma linguagem de programação e uma linguagem de programação serve para fazer... programas. Os programas são escritos em forma de texto: usando um editor de texto criamos o chamado código fonte. Este código fonte é transformado pelo compilador e pelo linker num programa executável. Muitas vezes ouvimos "linguagem assembler". É um erro muito difundido. Na realidade, Assembly é o nome da linguagem e assembler é um programa capaz de compilar código fonte em arquivos objeto. A linguagem Assembly é considerada de baixo nível. Isto não significa que seja menos importante ou eficiente que uma linguagem chamada de alto nível: são apenas modos diferentes de se programar e níveis diferentes de atuação. O que posso dizer é que, com uma linguagem de baixo nível como a Assembly, você pilota diretamente a CPU do seu computador - nada de intermediários. Uma das características da Assembly é que cada linha do código fonte possui apenas uma instrução para o processador (CPU). Por exemplo, MOV EAX,EDX irá MOVer o conteúdo do registrador EDX para o registrador EAX. Neste caso, a instrução "MOV" é chamada de mneumônico. Os mneumônicos são os "apelidos" das instruções, mais fáceis de guardar na memória do que seu valor hexadecimal exigido pelo processador. De mneumônico em mneumônico podemos escrever nosso código fonte e fazer com que o processador faça exatamente o que queremos sem firulas ou perda de tempo. O resultado é um programa enxuto, rápido e altamente eficiente. Tome coragem! Experimente programar em Assembly! Os componentes da linguagem Assembly Os componentes da linguagem Assembly são basicamente as instruções para o processador. Ignorando as instruções que não podem ser utilizadas pelo sistema operacional Windows, assembly condicional, macros, ponto flutuante, MMX e instruções de 64 bits, os componentes da linguagem Assembly podem ser divididos nas seguintes categorias: * Instruções de registradores * Instruções de pilha * Instruções de execução * Instruções de memória * Instruções de flag * Declarações de memória * Diretivas para o assembler * Comentários * Instruções para o sistema operacional (Windows) Instruções de registradores Estas instruções transferem dados ou realizam cálculos utilizando os registradores de 32 bits da CPU. Existem seis registradores de uso geral chamados de EAX, EBX, ECX, EDX, ESI e EDI. Exemplos deste tipo de instrução são: MOV ESI,EBX ;move o conteúdo do registrador EBX para o registrador ESI ADD EAX,EDI ;soma o conteúdo do registrador EDI com o do registrador EAX BT ECX,0 ;testa o bit 0 do registrador ECX CMP EDX,450 ;compara o conteúdo de EDX com 450 DIV ECX ;divide EDX:EAX (inteiro longo) por ECX MUL ECX ;multiplica EAX por ECX e põe o resultado em EDX:EAX SHL EDX,4 ;desloca os bits de EDX para a esquerda em 4 bits (multiplica por 16) TEST EAX,8 ;testa o bit 3 do registrador EAX Instruções de pilha A pilha é uma área de memória reservada pelo sistema operacional para cada programa que estiver rodando usar como área de arquivamento temporário. São exemplos deste tipo de instrução: PUSH EAX ;põe o conteúdo do registrador EAX na pilha POP EDX ;retira o último valor colocado na pilha e põe em EDX PUSH 1000h ;põe o valor hexadecimal 1000 na pilha MOV EBP,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 para a área de dados locais Instruções de execução Estas instruções desviam o processador para que execute código a partir de um ponto que não seja a próxima linha de execução. São exemplos: CALL MAKEWINDOW ;executa o código do procedimento e depois retorna CALL EAX ;executa o código a partir do endereço presente em EAX e depois retorna RET ;termina este procedimento retornando ao chamador JZ 4 ;se o resultado for zero, continua a execução a partir do marcador 4: JC >.fim ;se a flag estiver ativa, continua a execução a partir de .fim JMP MAKEWINDOW ;continua a execução a partir do procedimento nominado LOOP 2 ;decrementa ECX e salta para o marcador 2: a não ser que ECX=0 Instruções de memória Estas instruções lêem ou escrevem em áreas de memória que não sejam da pilha. Normalmente estas áreas estão na seção de dados do próprio executável ou podem ser alocadas pelo sistema operacional em tempo de execução. São exemplos: ADD EAX,[ESI] ;adiciona a EAX o conteúdo de memória cujo ponteiro de endereço está no registrador ESI MOV EAX,[MEUSDADOS] ;move para EAX o conteúdo de memória cujo marcador é MEUSDADOS SUB D[MYDATA+64],10h ;subtrai 10h do dword em MEUSDADOS mais 64 bytes CMP B[MYDATA+EDX*4],2 ;compara um byte com 2 numa parte do array MEUSDADOS LODSB ;carrega o byte na memória apontada por ESI em al STOSD ;carrega o conteúdo de EAX na memória apontada por EDI Instruções de flag As principais flags usadas são a Z (flag zero), C (flag carry), S (flag de sinal) e D (flag de direção). A maioria das instruções alteram as flags automaticamente para dar o resultado da instrução. Existem determinadas instruções que podem ser usadas para alterar o valor das flags manualmente: STC ;ativa a flag de carry CLC ;limpa a flag de carry STD ;ativa a flag de direção para LODS, STOS, CMPS, SCAS, MOVS CLD ;limpa a flag de direção Declarações de memória O sistema operacional reserva memória para o executável quando ele é executado. Declarações são feitas para reservar memória na seção de dados ou na seção de constantes se os dados devem ser inicializados, isto é, devem receber um valor. Se forem dados não inicializados, a área de dados pode ficar reservada na seção de dados não inicializados. Isto não toma espaço algum no arquivo executável porque um espaço de memória é alocado para este tipo de dado quando o executável é iniciado pela primeira vez. Seguem exemplos de como a memória é 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 não definidos Diretivas para o assembler São instruções que orientam onde o Assembler deve colocar o código fonte que as segue. O Assembler marca a seção de código como apenas para leitura e executável; as seções de dados definidos e indefinidos como leitura/escrita. Veja alguns exemplos (que podem variar de acordo com o assembler): CODE SECTION ;tudo o que se segue deve ser colocado numa seção ;marcada para apenas leitura e executável (código) DATA SECTION ;tudo o que se segue deve ser colocado numa seção ;com atributos de leitura e escrita mas não de código CONST SECTION ;tudo o que se segue deve ser colocado numa seção ;com atributo de apenas leitura Comentários Após ponto e vírgula, o texto é ignorado até a próxima quebra de linha. Desta forma é possível associar descrições e explicações ao código fonte, as quais serão ignoradas pelo assembler. Instruções para o sistema operacional Proporcionam ao programador o acesso a uma grande variedade de funções. No caso do sistema operacional Windows, proporcionam acesso API (Applications Programming Interface). Veja os exemplos abaixo: PUSH 12h ;põe valor hexa 12 na pilha para a chamada API CALL GetKeyState ;pede ao Windows para por o estado da tecla Alt em EAX TEST EAX,80000000h ;testa se a tecla Alt está sendo pressionada (bit 31 ligado) JZ >L22 ;não, saltar para L22 PUSH 24h ;valor hexa 24 = ponto de interrogação, botões yes e no PUSH ESI,EDI ;endereço do título, endereço da mensagem PUSH [hWnd] ;manipulador da janela proprietária CALL MessageBoxA ;mostra a caixa de mensagem Windows pedindo yes/no CMP AL,7 ;checa se "no" foi clicado pelo usuário JNZ >L40 ;não, saltar para L40 PUSH 0 PUSH ADDR FILE_DONE ;dá endereço do arquivo FILE_DONE para receber o resultado PUSH ECX,EDX ;ECX = bytes que devem ser escritos, EDX=fonte de dados, PUSH ESI ;ESI = manipulador do arquivo CALL WriteFile ;escrever ECX bytes de EDX para ESI PUSH 808h,5h ;808 = em baixo e meio preenchido, 5 = elevado PUSH EBX,EDX ;ebx = RECT, EDX = contexto do dispositivo CALL DrawEdge ;desenhar retângulo especial com bordas na tela PUSH 4h,3000h,ESI,0 ;4h = fazer memória leitura/escrita, 3000h = reservar CALL VirtualAlloc ;reservar e consignar ESI bytes de memória leitura/escrita PUSH 0,[hInst],0,0 ;param, manipulador do módulo, menu e proprietário PUSH 208,130,30,300 ;altura, largura, y, x PUSH 80C80000h ;estilo (POPUP+CAPTION+SYSMENU) PUSH EAX ;EAX = endereço da string terminada em zero com o título PUSH 'LISTBOX' ;por ponteiro para 'LISTBOX' na pilha PUSH 0 ;estilo extended (nenhum) CALL CreateWindowExA ;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
deathseeker25 Posted June 27, 2005 at 06:08 PM Report #1426 Posted June 27, 2005 at 06:08 PM filip_e again com os seus textos e/ou tutoriais.... 😛 É sempre bom ter uma referencia aqui da linguagem Assembly visto que é uma linguagem de alto nível e bastante complexa.... Cumps
Ricardo Posted June 27, 2005 at 07:02 PM Report #1427 Posted June 27, 2005 at 07:02 PM uma linguagem de alto nível e bastante complexa.... Penso que quererias dizer baixo nível...😛 Outra coisa...olhem lá os plágios. Eu sei que a net é muito grande e geralmente 'ninguem dá por nada', mas os textos têm autores e têm de ser respeitados... Acho que é compreensivel para qualquer um... Abraços!!
melSpeedl.ine Posted June 27, 2005 at 08:49 PM Report #1429 Posted June 27, 2005 at 08:49 PM xlente filip_e!
deathseeker25 Posted June 27, 2005 at 09:29 PM Report #1430 Posted June 27, 2005 at 09:29 PM Citação Penso que quererias dizer baixo nível...😛 Outra coisa...olhem lá os plágios. Eu sei que a net é muito grande e geralmente 'ninguem dá por nada', mas os textos têm autores e têm de ser respeitados... Acho que é compreensivel para qualquer um... Abraços!! Boas, Podes então explicar-me porque é que é de baixo nivel? é que eu pensei que por se uma das linguagens mãe, das mais complexas, com uma estrutura muito própria é que era de alto nivel mas plos vistos enganeime... Cumps
David Pintassilgo Posted June 27, 2005 at 09:39 PM Report #1431 Posted June 27, 2005 at 09:39 PM é pá,....se não estou em erro, a designação de "baixo nivel" refere-se ao facto de actuar directamente na maquina, (nas camadas mais baixas por assim dizer,... :? ) ps: +- isso, não sei se me fiz entender...... cool stuffs to check. http://blog.zxcoders.com//
Ricardo Posted June 27, 2005 at 09:41 PM Report #1432 Posted June 27, 2005 at 09:41 PM Podes então explicar-me porque é que é de baixo nivel? é que eu pensei que por se uma das linguagens mãe, das mais complexas, com uma estrutura muito própria é que era de alto nivel mas plos vistos enganeime... Vou tentar... A classificação de nível de uma linguagem relaciona-se com a proximidade que esta tem com o utilizador Seguindo este critério as linguagens podem ser de alto nível, nível intermediário ou baixo nível. Alto: É uma linguagem que se aproxima mais da linguagem utilizada pelo ser humano. Exemplos típicos são Pascal, COBOL, C e SQL. Intermédio: São códigos chamados de mnemônicos, mais conhecidos como assembly. Exemplos típicos são o assembly do processador 8085, do Pentium, do AMD K6 e do Motorola. Baixo: Linguagem de baixo nível é o código que o computador executa diretamente, chamada de micro-programação. É composta de 0´s e 1´s e conhecida como linguagem binária. “bviamente diz-se que o assembly é de baixo nível, pois nenhum programador pensa sequer em praticar a micro-programação no seu dia-a-dia. Existem outros tipos de classificações para as linguagens de programação. Deixo aki o link com algumas informações, e de onde retirei estes excertos. Espero ter ajudado 😛 Abraços!!
deathseeker25 Posted June 27, 2005 at 09:43 PM Report #1433 Posted June 27, 2005 at 09:43 PM é pá,....se não estou em erro, a designação de "baixo nivel" refere-se ao facto de actuar directamente na maquina, (nas camadas mais baixas por assim dizer,... :? ) ps: +- isso, não sei se me fiz entender...... :oops: Hmmm....é mesmo só isso?
Sutcha Posted July 4, 2005 at 07:51 PM Report #1664 Posted July 4, 2005 at 07:51 PM Fui eu k tive a iniciativa para fazermos uma cena so para o assembly mas nestes dias tive com o pc pifado :oops: Não fikei mt a par sorry Mss a introduçao ta louca www.sutchamos.blogspot.com
untouchables Posted May 3, 2006 at 05:09 PM Report #25500 Posted May 3, 2006 at 05:09 PM é tal como o ricardo disse... é muito mais fácil programar em C ou Visual Basic porque é fácil perceber... agora assembly?? bem... experimentem fazer um programa 🙂 falo com relativa experiência... nas minhas aulas tenho de analisar código assembly gerado por códigos em C, e é muito complicado... existem várias coisas que nos passam completamente ao lado. uma pequena função em C com umas 5 linhas ocupa umas 50 em assembly, uma instrução por linha... o que talvez muita gente não sabe é que a maioria das linguagens foram feitas em assembly. quando fazemos um programa em C, por exemplo, ao compilar, o compilador passa tudo para assembly 🙂 sim, C foi criado em assembly. para quem quiser dar uma olhadela nos assembly's, é possível com o linux. peguem num programa compilado, vão à consola, na pasta onde têm o programa, e escrevam "objdump -d nomedoficheiro", e ser-vos-á mostrado o código do programa 🙂
Narchotyck_Killer Posted June 2, 2006 at 09:43 PM Report #30762 Posted June 2, 2006 at 09:43 PM Assembly é uma linguagem (se é k assim se pode chamar) bastante interessante. Acima de tudo, código em assembly é código em que se podem escrever 1000 linhas de código, onde não há um único erro de sintaxe, de tamanho de dados, enfim, de assemblamento. Mas onde os erros estão apenas na execução (Run time), com problemas de arquitectura dos sistemas, contas com o stack, etc.. Para mim o assembly é importante, porque para fazer o mínimo, é preciso conhecer a arquitectura onde se está a trabalhar, quer seja fazer brincadeiras com o boot, como programas p windows/linux/etc, etc, etc... enfim, tudo. Mas nao nos podemos esquecer que é muitíssimo mais trabalhoso.Deve ser utilizado apenas quando não houver outra opção.Por exemplo, para passar argumentos a uma função, somos nós que tratamos disso. há diversas formas, mas a mais comum e eficiente (utilizada um casos gerais knd n é possivel optimizar) é a utilizada pelos compiladores de C chamada C-type call ou C.decl, linguagem essa muito próxima do assembly, uma vez que o controlo que se tem é praticamente o mesmo. (alguns compiladores de C permitem até incluir assembly no código) Por exemplo, para chamar a função strlen(char * string) utilizando o método C push string ; Lista de argumentos. os últimos em primeiro lugar(de cima para baixo) call strlen ;funcao call. Coloca o eip (endereco do codigo actual) no topo do stack e salta para strlen ....... strlen: push ebp ;guarda o ebp (base pointer (32bits) no stack mov ebp,esp ; e atribui-lhe o endereco do stack actual mov esi,[ebp+8] xor eax,eax push ecx cont: mov cl,[esi] jz fim_strlen inc eax inc esi jmp cont fim_strlen: pop ecx pop ebp ret 4 no final, o eax contem sempre o valor devolvido. Se é um endereço ou um valor imediato depende apenas do programa o ret 4 corresponde ao ajuste a fazer depois do ret ao stack. Corresponde ao número (em bytes) dos argumentos Pushados O assembly continua a ser temido por muitos como um bixo, mas acaba por ser bastante intuitiva. É apenas necessário duas coisas p fazer um programa: trabalho/vontade, e muitos, muitos comentários,pk ao fim de algumas centenas de linhas, o código começa a parecer todo igual! 😄 Passem Bem 😉
Rui Carlos Posted June 3, 2006 at 09:30 AM Report #30813 Posted June 3, 2006 at 09:30 AM Convém não esquecer que o assembly tem uma grande desvantagem: não é portável Ou seja, enquanto que quando nós fazemos um programa em C o podemos compilar para uma série de máquinas diferentes, o assembly só vai funcionar numa arquitectura e SO. E se aprender assembly para um tipo de arquitectura já não é fácil, então imagine-se aprender para várias aruitecturas... Rui Carlos Gonçalves
TheDark Posted July 15, 2006 at 05:15 AM Report #38331 Posted July 15, 2006 at 05:15 AM ou seja, enquanto que quando nós fazemos um programa em C o podemos compilar para uma série de máquinas diferentes, o assembly só vai funcionar numa arquitectura e SO. Erm... desculpa lá, mas no que se refere a sistemas operativos, C é tão portável quanto Assembly. Se não utilizares código específico do sistema operativo, tanto compilas um programa (Assembly ou C) em Windows, como em Linux, como em Unix. Agora se usares por exemplo APIs do Windows num programa C, já não te safas no resto dos SOs. (E em Assembly acontece o mesmo 😄 ) Para não ficarem dúvidas, concordo plenamente com a parte das arquitecturas. Não tentem compilar um programa em Assembly do ARM com um compilador para IA32... 😄 Desaparecido.
Rui Carlos Posted July 15, 2006 at 10:35 AM Report #38339 Posted July 15, 2006 at 10:35 AM Erm... desculpa lá, mas no que se refere a sistemas operativos, C é tão portável quanto Assembly. Se não utilizares código específico do sistema operativo, tanto compilas um programa (Assembly ou C) em Windows, como em Linux, como em Unix. Acho que não é bem assim, porque os SO's funcionam de maneira diferente e interacção entre o programa e o SO é diferente. nunca fiz o teste, mas acho um programa compiladdo em Linux não funciona em Windows (mesma que a arquitectura não mude). mas não tenho a certeza quanto a isto. Rui Carlos Gonçalves
TheDark Posted July 15, 2006 at 04:17 PM Report #38405 Posted July 15, 2006 at 04:17 PM (...)mas acho um programa compiladdo em Linux não funciona em Windows (mesma que a arquitectura não mude) Isso é certo... mas a portabilidade é conseguires compilar o mesmo código em sistemas diferentes... e não utilizar o código já compilado em sistemas diferentes. Se pensares no que disseste sobre o C vês que é isso 🙂 Desaparecido.
_elf Posted September 4, 2006 at 11:46 PM Report #48314 Posted September 4, 2006 at 11:46 PM eu no semestre passado na disciplina de arquitectura de computadores tive que aprender assembly e inclusive fazer um projecto. nao gostei muito da linguagem pk, apesar das poucas instrucoes que tem, é de dificil programacao devido ao facto de ser exactamente uma linguagem de baixo nivel e dai o raciocinio de programacao que normalmente utilizamos tem de ser mudado. mas convem spr aprender para essencialmente perceber como funciona um programa, ou seja como e ke e feito a passagem de codigo percetivel para codigo makina. cada instrucao em assembly tem um opcode, e essa passagem é feita pelos compiladores de assembly. é necessário também ter cuidado quando se pergunta em assembly à arquitectura para a qual se programa, pois cada prossador tem diferentes opcodes e possiveis instrucoes. dai tb que alguns so terem versoes diferentes para diferentes arquitecturas se quiserem ter alguma informacao sobre assembly e essencialmente sobre o processamento do computador visitem o site da cadeira de arquitectura de computadores lecionada no segundo semestre do ano lectivo de 2005/2006 no IST-TP: http://ac.tagus.ist.utl.pt cumps
TheDark Posted September 8, 2006 at 07:41 PM Report #49169 Posted September 8, 2006 at 07:41 PM in Wikipedia: In computer science, a low-level programming language is a language that provides little or no abstraction from a computer's microprocessor. Desaparecido.
Procrastinator Posted February 17, 2007 at 07:30 PM Report #83604 Posted February 17, 2007 at 07:30 PM Pessoal e que tal darem dicas para quem queira começar em asm? Tipo onde ir buscar as ferramentas pa começar a fazer algo em assembly!! Eu tive uma cadeira em q fiz umas coisas em asm mas muito poucas mas nos usamos um emulador. Se alguem souber onde posso ir buscar algo pa começar a fazer coisas simples e depois passar pa algo mais complicado q me diga 😛 )
bin Posted February 25, 2007 at 07:47 PM Report #85052 Posted February 25, 2007 at 07:47 PM gostava de saber kais programas ke posso sustar para começar sei de um : fasm mas este não descompila 😛 sabem um lê descompila Citação A ironia é o primeiro indício de que a consciência se tornou consciente.
toomuch Posted February 26, 2007 at 02:21 PM Report #85154 Posted February 26, 2007 at 02:21 PM Boas, há uns anos atrás tive que fazer um trabalho final de uma cadeira em assembly. Era sobre o euro2004 e era uma cena para gerir equipas. fiz 2 versões, uma com mouse e outra com teclado. Deixo-o aqui, pode ser que sirva para algum de voces... Fiquem bem
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now