Gigaflops :: Assembly
Make your own free website on Tripod.com

   Linguagens de Programação - Assembly

A linguagem Assembly

Introdução

O estudo da linguagem Assembly ainda tem grande importância num curso de ciência da computação. Uma das razões desta importância é que existem programas de baixo nível que são melhores escritos em Assembly, pois esta permite um acesso a certas capacidades da máquina que as linguagens de auto-nível não permitem, e o acesso a essas capacidades tornam os programas mais eficientes. Logo um versátil ciêntista da computação, ou programador, deve ser capaz de programar em linguagem Assembly, quando houver uma necessidade.

A outra e mais importante razão, é que a linguagem Assembly é apenas uma forma mais natural de se expressar a linguagem nativa de uma máquina (i.e. linguagem de máquina). Logo o estudo da linguagem Assembly é fundamentalmente um estudo da máquina. Isto nos leva a conhecer como as instruções são executadas, como são armazenados e acessados os dados na memória e também nos leva a conhecer o conjunto de instruções que a CPU é capaz de executar, além de compreender vários outros pontos a respeito da arquitetura de um computador. E de posse destes conhecimentos podemos utilizar melhor os recursos da máquina.

Aplicabilidade e Uso

Podemos ter o seguinte pensamento, se a linguagem Assembly é mais eficiente que as linguagens de auto-nível, porque não utilizar somente o Assembly? A resposta a esta pergunta é simples, a liguagem assembly, por estar mais ao nível do computador e não do homem, é de difícil entendimento além de ser muito detalhista, isto é, mesmo para programas simples o código em Assembly é muito extenso. Isso ocorre devido ao fato de que cada linha do código em Assembly representa uma instrução no código de máquina. Logo a construção de grandes programas em Assembly se torna inviável.

O que se faz na prática é, em sistemas grandes que sejam construídos em linguagens de alto-nível, implantar pedaços de códigos em Assembly para realizar pequenas operações, mas que tenham grande influência na eficiência do programa (ou porque o código será executado várias vezes, ou porque não há na linguagem de auto-nível uma estrutura capaz de realizar tal operação).

Desta forma o estudo da linguagem Assembly pode servir de ponte entre simples conhecimentos de cursos introdutórios em ciência da computação, e conhecimentos avançados cujos alunos terão contato ao longo do curso.

Vale citar, que não existe uma linguagem Assembly única, geral. Assembly é um tipo de linguagem que representa a forma direta das instruções básicas de uma arquitetura de um computador específico.

Tutorial Simples

Como dito anteriormente, não há uma linguagem assembly única, existe uma para cada tipo de máquina. Tendo isto em mente, neste breve tutorial apresentaremos uma linguagem Assembly para um computador virtual, demasiadamente simples, que se baseia na arquitetura de Von Neumann, que se caracteriza basicamente pelas instruções serem executadas sequencialmente a partir de uma posição específica de memória.

A arquitetura do computador virtual, na qual se baseia o programa seguinte, foi retirada de um exercício do livro Java Como Programar 4º Edição - Deitel e Deitel.

O código a seguir calcula o fatorial de um número digitado pelo usuário:


00 WSTR > "Digite um número inteiro 'n', para o cálculo de fatorial de n: "
01 READ > NUMERO
02 WRITE > NUMERO
03 WLN
04 LOAD > NUMERO
05 BRNEG > 23
06  LOAD > 1
07  STORE > FAT
08  LOAD > NUMERO
09  BRZERO > 18
10   LOAD > CONT
11   ADD > 1
12   STORE > CONT
13   MULT > FAT
14   STORE > FAT
15   LOAD > CONT
16   SUB > NUMERO
17   BRNEG > 10
18    WSTR > "Fatorial de "
19    WRITE > NUMERO
20    WSTR > " = "
21    WRITE > FAT
22    HALT
23 WSTR > "Não existe fatorial de número negativo"
24 HALT

Primeiramente, o número das linhas no código acima indica a posição de memória de cada instrução (lembrando que cada linha corresponde a uma instrução), para isso assumimos que a memória está limpa, e somente o nosso programa fará uso dela (o que obviamente não acontesse num computador real).

Como já dito, cada linha do código corresponde a uma instrução de máquina, e só pode haver uma instrução (ou comando) por linha no código. Entende-se por instrução, no nosso código, a expressão composta por nome da operação, seguida do operador '>' e depois pelo nome do operando. Em linguagem natural, esta expressão significa que será realizada uma operação (nome da operação) sobre uma área de memória (nome do operando).

Na nossa linguagem existem algumas operações especiais que não exigem um operando (i.e. elas não operam sobre uma área de memória). Tais operações vistas no código acima são WLN e HALT, que significam respectivamente imprimir um caractere de nova linha no vídeo, e encerrar a execução do programa.
Uma especificação importante do nosso computador virtual é que as operações aritméticas são realizadas unicamente no acumulador. O acumulador, a grosso modo, tem a função de guardar dados temporariamente. Logo para se somar dois números, precisamos primeiro carregar (LOAD) um dos valores no acumulador e depois utilizar uma operação que some um outro valor a este que está presente no acumulador, vale ressaltar que o resultado fica armazenado no próprio acumulador, e o valor que tinhamos nele antes da operação será perdido. Para armazenarmos o valor do acumulador em uma variável, utilizamos o comando (STORE).

Neste programa temos ainda outro tipo de instrução de grande importância, as instruções de mudança de fluxo. As instruções das linhas 5, 9 e 17 podem lhe parecer estranhas, já que a sua sintaxe (nome) não exprime muito bem a sua semâtica (significado). Mas agora você verá que essas instruções são bastante simples, aquela contida na linha 5, por exemplo, significa que se o valor contido no acumulador no instante em que o comando é executado for um número negativo o controle do programa passará a executar a instrução contida na linha 23, caso contrário, a execução do programa continua sequencialmente, executando a linha 6. A outra instrução deste tipo, situada na linha 9, desvia o fluxo para o número indicado se o valor do acumulador for igual a zero.

O link abaixo mostra uma página contendo um applet que simula o computador virtual descrito brevemente aqui. Nesta página temos mais informações sobre o computador virtual que o applet implementa. Sugerimos que o leitor cole o exemplo desta página no applet citado, para verificar o seu funcionamento.

Clique aqui para testar seus conhecimentos no computador virtual.
 
   Menu Assembly