Вы находитесь на странице: 1из 20

Programao em linguagem C ca EA870 - FEEC - Unicamp

Introduo ` linguagem C, para programao de microcontroladores HC11, ca a ca utilizando o compilador ICC11

Murillo Fernandes Bernardes bernarde@fee.unicamp.br http://www.fee.unicamp.br/bernarde/

Setembro de 2002

He who asks is a fool for ve minutes, but he who does not ask remains a fool forever Provrbio Chins e e

Sumrio a
1 Introduo ca 1.1 Histrico do C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 2 Compilador ICC11 2.1 Sintaxe da linha de comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Processo de compilao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca 2.3 C run-time (crt.s) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Viso Geral de um programa em C a 3.1 Funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . co 4 Tipos de Dados 4.1 Representao Hexadecimal, decimal, octal, ASCII e caracteres de Escape ca 4.2 Declarao de variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca a 4.2.1 Variveis Locais x Globais . . . . . . . . . . . . . . . . . . . . . . . a 4.3 Cast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 2 2 3 3 4 5 6 6 7 7 8 8 9 9 10 10 10 11 11 11 12 12 12 12 13 14 14 15 15 16 16 16 17 18 18

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

5 Expresses o 5.1 Expresses Aritmticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o e 5.2 Expresses Condicionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 5.3 Expresses de manipulao de bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o ca 6 Controle de Fluxo 6.1 IF . . . . . . . . . 6.2 Operador Ternrio a 6.3 Switch . . . . . . . 6.4 While . . . . . . . 6.5 Do - While . . . . 6.6 For . . . . . . . . . 6.7 Break . . . . . . . 6.8 Continue . . . . . . 6.9 Exemplos . . . . . 7 Vetores 8 Ponteiros 8.1 Declarao de ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ca 8.2 Referncia a ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e 8.3 Aritmtica de ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e 9 Funes pr-denidas no ICC11 co e 9.1 putchar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.2 printf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Assembly in-line 10.1 Utilizando variveis do C no assembly . . . . . . . . . . . . . . . . . . . . . . . . . . . a 11 Concluso a

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

Introduo ca

Estamos comeando uma nova fase do curso de EA870, a utilizao da linguagem C, c ca no lugar do uso do assembly. Alguns podem at reclamar que quando estavam se e acostumando muda tudo, tem que aprender uma linguagem nova, mas com certeza o uso do Cvai facilitar bastante o trabalho. Este tutorial tem o intuito de ser apenas um pontapinicial no aprendizado da e linguagem C, sendo que a maior parte do aprendizado ocorrer no dia-a-dia, nas dia culdades enfrentadas a cada programa, e com o costume de programar em C. A linguagem (vocabulrio) utilizada neste tutorial , na medida do poss a e vel, a mais simples, com a inteno de que todos entendam realmente como as coisas funcionam ca em C, e tambm com o intuito de tirar todos os medos que ainda possam existir. e Infelizmente vo haver alguns termos meio estranhos, mas que com o tempo se tornaro a a comuns a todos. Programar s isso, resolver problemas da vida real de forma entend e o velao computador. Mostrar-lhe como voc fez, em uma linguagem que ele entenda. e

1.1

Histrico do C o

Na dcada de 70, nos Laboratrios AT&T Bell (EUA), a linguagem C foi criada, tendo e o como principal motivao o desenvolvimento do sistema UNIX em uma linguagem de ca alto n vel. O Cse tornou ferramenta inseparvel/indispensvel em todos os sistemas a a UNIX, e com este foi sendo bastante difundida. Com o passar do tempo havia diversos compiladores C, mas com diversas incompatibilidades entre eles. Ento em 1983 o Insituto Norte Americano de Padronizao a ca (ANSI) criou um comit para a padronizao da linguagem C. O resultado desta e ca padronizao foi concluido em 1990 e hoje o padro internacional, chamado de C ca e a ANSI. Nesta padronizao foram denidas algumas funes bsicas de suporte, que ca co a deveriam ser fornecidas pelos compiladores, apesar delas no fazerem parte da lina guagem. Uma das grandes vantagens da linguagem C a unio harmoniosa entre diversas e a caracter sticas de linguagens de baixo n vel, e as caracteristicas das linguagens de alto n vel. Algumas linguagens antecessoras ao C tinham certas caracter sticas muito favorveis, mas no geral eram muito restritas ou muito complicadas. J o C conseguiu a a unir tanto simplicidade e quanto potencialidade em suas aplicaes. Com isso mesmo co tarefas muito complexas podem ser realizadas com uma relativa simplicidade.

Compilador ICC11

No curso de EA870 o compilador utilizado o ICC11, que apesar de no atender todos e a os quesitos do C ANSI, atende ao menos os quesitos bsicos. Por tanto qualquer livro a que trate do C ANSI pode (e deve) ser utilizado como referncia. e Ao longo deste tutorial mostraremos tanto denies do C padro, quanto denies co a co espec cas do ICC11 (onde houverem diferenas). c

2.1

Sintaxe da linha de comando

A sintaxe do comando para compilar um programa utilizando o ICC11 a seguinte: e icc11 [opes] nomedoarquivo.c co As opes so as seguintes: co a -v -o -l -E -S -s verbose, mostra na tela as aes que esto sendo executadas co a Nome do aqtuivo de saida, padro iccout.s19 a e Cria o arquivo contendo a listagem em assembly, com o nome arquivo de saida.lst Para a execuo aps o pre-processamento, gerando um arquivo .i ca o Compiles para assembly, mas no monta o programa (no gera arquivo objeto) a a Modo silencioso. No mostrar na tela as aes a a co

Assim para compilar o programa contido no arquivo prog1.c, gerando o arquivo objeto com o nome de prog1.s19, a listagem com prog1.lst, e visualizando as aes do co compilador utilizamos a seguinte linha de comando: icc11 -v -l -o prog1.s19 prog1.c

2.2

Processo de compilao ca

O processo de compilao de um programa no direto, so necessrios vrios passos ca a e a a a at que se chegue ao cdigo objeto (.s19). e o O primeiro passo a anlise do cdigo, pelo pr-processador C, em busca de erros, e a o e e executando diretivas do pr-processador, como include e dene. Ao nal deste passo e tem-se um novo arquivo, com extenso .i, que ser utilizado no prximo passo. a a o O segundo passo o processo de traduo para assembly, ir converter o cdigo em e ca a o C para um cdigo assembly, e unir o contedo do arquivo crt.s com o cdigo assembly o u o gerado, criando o arquivo .s. O terceiro passo o processo de montagem, que ir traduzir o cdigo assembly e a o gerado, para um arquivo objeto, num formato (s19) que j pode ser carregado no a HC11 atravs do BUFALLO. e 2

Ao nal do processo os arquivos .i e .s so apagados, por padro, mas h opes a a a co para que isso no acontea. a c

2.3

C run-time (crt.s)

No segundo passo foi citado o uso de um arquivo chamado crt.s, que um pequeno e arquivo contendo cdigo assembly, que contm as funes bsicas denidas no compio e co a lador (por exemplo: diviso, resto, multiplicao e putchar). O nome crt vem de C a ca run-time. Para um programa seja compilado, deve-se ter um arquivo crt.s no mesmo diretrio o do programa. E importante tambm estar atento a dois ORG que esto no in deste arquivo, e a cio e que denem onde comeam as reas de dados, e de programa. Na placa utilizada c a (PDHC11-FEEC) a regio de memria dispon a o vel para programas do usurio de a e $6000 at $7FFF, compreendendo 8Kbytes. Portanto estes dois ORGs devem estar e dentro desta regio. Qualquer problema veriquem no arquivo .lst se no h cdigo a a a o (ou variveis) gerado fora desta regio. a a Para a placa utilizada, um exemplo de como cariam os ORGs : e
* define starting addresses sect 0 * code org $6000 sect 1 * data org $7000

Viso Geral de um programa em C a

Para comearmos, vamos ao exemplo (C ANSI) que no pode faltar em nenhum tutoc a rial, e que simplesmente mostraria na tela a frase Hello World!:
/************************************************************/ /* Exemplo 1 - Tutorial C - EA870 */ /************************************************************/ #include <stdio.h> /* biblioteca padr~o de I/O */ a

/************************************************************/ void main () /* Comentarios */ { printf("Hello World!"); /* Dizendo ol mundo! */ a }

Com este simples programinha podemos mostrar a base mais bsicado C, que a e a funo main. Esta funo que ser executada ao se chamar o programa criado em ca ca e a C, portanto todo programa deve ter sua prpria funo main. o ca 3

Este programa tambm mostra a chamada a uma funo externa (printf) ao proe ca grama, mas que est denida numa das bibliotecas do C ANSI. Esta funo est sendo a ca a referenciada dentro do arquivo stdio.h, que est sendo inclu no programa atravs a do e da diretiva #include <stdio.h>. Outra coisa bsica e muito importante que podemos ver neste exemplo como a e se colocar um comentrio num programa em C. Utiliza-se sempre /*para in do a cio comentrio e */para indicar o m de um comentrio, assim pode-se ter comentrios a a a de vrias linhas. a Linhas que iniciam com #so geralmente diretivas ao pre-processador C. a

3.1

Funes co

Em C todo algor tmo deve ser escrito na forma de funes. E funes so simplesmente co co a conjuntos de comandos que podem incluir declaraes, chamadas a outras funes. A co co organizao bsica de uma funo em C a seguinte: ca a ca e
tipo funcao(parametros) { declara~es; co comandos; }

O tipo indica o tipo do valor de retorno da funo, e pode ser qualquer um dos ca tipos denidos em C. (Mostrados na prxima seo) o ca funcao o nome dado ` funo, e atualmente no se tem limitao quanto ao e a ca a ca tamanho do nome, mas recomenda-se utilizar nomes que lembrem o que a funo ir ca a executar. parametros correspondem na verdade ` denio do tipo do parmetro a ser passado a ca a para a funo, e o nome com o qual a funo referenciar o valor passado. ca ca a Em C necessrio se declarar todas as variveis antes que as utilize, assim a parte e a a de declaraes onde isso deve ser feito. co e Logo aps as declaraes pode-se colocar a chamada a todos os comandos a serem o co executados pela funo. ca Como exemplo iremos criar uma funo que escrever na tela a frase Eu fao ca a c EA870, e um programa principal que escreve Oi pessoal, e logo aps chama a o funo anteriormente criada: ca
#include <stdio.h> void escreve() { /* fun~o para escrever "Eu fao EA870"*/ ca c printf("Eu fao EA870"); c } void main() { /* fun~o principal */ ca printf("Oi pessoal"); /* imprime "Oi pessoal" */

escreve(); /* chama fun~o que escreve "Eu fao EA870" */ ca c }

Vale lembrar que o ICC11 no prov as bibliotecas de funes denidas pelo C a e co ANSI, assim para o ICC11 a diretiva #include <stdio.h> no pode ser utilizada. A a unica funo que o ICC11 fornece a printf (com algumas limitaes), que para ser ca e co utilizada o arquivo printf.c deve ser compilado juntamente com o programa. Utilizando o exemplo da linha de comando utilizado na seo anterior teriamos que ter agora esta ca linha de comando, para que o programa pudesse utilizar a funo printf (com o printf.c ca no mesmo diretrio do programa prog1.c): o icc11 -l -o prog1.s19 prog1.c printf.c

Tipos de Dados
Caractere (1 byte) Inteiro (em geral 32 bits) Nmero real u Nmero real preciso dupla u a Sem valor

O C padro dene os seguintes tipos de dados: a char int oat double void

Alm dos tipos, o C tambm dene alguns modicadores, que simplismente mudam e e a forma com que o nmero ser tratado ou armazenado. Alguns modicadores so: u a a unsigned, signed, short, long Na verdade h mais alguns tipos e modicadores que no iremos citar aqui, mas que a a podem ser encontrados em qualquer livro de C ANSI. Alm disso o C padro permite e a que novos tipos de dados sejam criados. J o ICC11 conta basicamente com os seguintes tipos: a char Caracter unitrio (1 byte) a int um inteiro (2 bytes) void sem valor E tambm com alguns modicadores, como o unsigned que ser muito utilizado e a durante o curso. Pode at parecer que so poucos tipos de dados, mas esta uma das mgicasdo C, e a e a fazer muito com pouco. Com apenas estes tipos de dados somos capazes de representar tudo que necessrio numa mquina como o HC11. Por exemplo: Como temos o tipo e a a char (caractere) podemos facilmente ter strings, j que estas so simplesmente vetores a a de caracteres. 5

4.1

Representao Hexadecimal, decimal, octal, ASCII e carca acteres de Escape

Em C nmeros em hexadecimal so representados sempre iniciados com 0x, ou seja, u a para representar o nmero $FF deve-se escrever 0xFF. u Nmeros decimais so representados normalmente (nunca com zeros ` esquerda), u a a quando negativos, com o sinal de menos (-) ` sua esquerda. a Nmeros na base octal devem ser iniciados com 0, assim o nmero 023 est na u u a base 8. Caracteres ASCII so representados entre aspas simples (), assim m o caractere a e ASCII m. Strings (vetores de caracteres) so representados entre aspas duplas , assim EA870 a e a representao da string EA870. ca

4.2

Declarao de variveis ca a

Agora que j conhecemos os tipos de dados poss a veis, podemos realmente comear a c fazer as declaraes de variveis num programa. co a A declarao das variveis da forma: ca a e tipo nome da varivel; a ou tipo nome var1, nome var2, nome var3; Por exemplo: int h, m, s; char a; Com estas duas linhas acima declaramos trs variveis do tipo inteiro, e uma do e a tipo char. Pode-se tambm inicializar as variveis no momento da declarao, da seguinte e a ca forma: int h=5; char a=j; Assim declaramos a varivel h como inteiro, e denimos seu valor inicial como 5. a J a varivel a foi denida como caractere, e inicializada com o caractere j. a a e

4.2.1

Variveis Locais x Globais a

Quando-se declara variveis dentro de uma funo (mesmo que seja a main), esta a ca varivel s ca acess a o vel de dentro daquela funo, temos ento uma varivel local. ca a a Pode-se declarar variveis fora de qualquer funo, o que faz com que a varivel seja a ca a global, ou seja acess apartir de qualquer funo do programa. Por exemplo: vel ca
char c; void main() { /* fun~o principal */ ca int a=5; c=m; }

No trecho de cdigo apresentado acima, temos a varivel c que global, e a varivel o a e a a que local (funo main). e ca

4.3

Cast

Cast ou coero simplesmente a converso de tipo de um determinado valor, ou ca e a varivel. Podemos falar que seria o modelamento daquele valor para que ele que a compat com o que se quer. vel No seguinte trecho de cdigo, um inteiro est recebendo o valor de um ponteiro pra o a inteiro (ponteiros sero detalhados mais a frente), ou seja, est recebendo o endereo, a a c mas estes dois tipos no so iguais, e portanto o compilador dever mostrar um aviso a a a do que est sendo feito. a
int a; int *p; a = p; /* declara um inteiro */ /* declara um ponteiro para inteiro */ /* o endereo apontado pelo p "jogado" em a, ou seja, c e a ser um inteiro que contm o valor do endereo */ a e c

Para mostrar ao compilador que realmente aquilo que se quer fazer, e tambm e e evitar poss veis erros, o melhor seria utilizar um cast, convertendo o tipo, de ponteiro para inteiro, para simplesmente inteiro, e isso seria feito da seguinte forma:
int a; int *p; /* declara um inteiro */ /* declara um ponteiro para inteiro */ /* o endereo apontado pelo p "jogado" em a, ou seja, c e a ser um inteiro que contm o valor do endereo */ a e c

a = (int) p;

O cast feito simplesmente colocando o tipo que se quer, entre parenteses antes do e valor, ou varivel. Assim poderia utilizar tambm: a e 7

int *p;

/* declara um ponteiro para inteiro */

p = (int *) 0x1000;

Neste exemplo, modica-se o tipo inteiro do valor 0x1000 para ponteiro para inteiro. Casts desta forma podem ser utilizados para qualquer tipo de dados suportado. Vale prestar ateno ao tamanho em bytes que cada tipo ocupa, para que no ocorra ca a truncamentos indesejados, ou coisas parecidas.

Expresses o

Como j dito anteriormente funes so simplesmente conjuntos de comandosvlidos, a co a a que sero executados de acordo com uma determinada lgica. a o Para que esta lgica possa ser expressa tem-se as expresses aritmticas, as exo o e presses condicionais, e as expresses de manipulao de bits. o o ca

5.1

Expresses Aritmticas o e

Atribuies em C so indicadas pelo simbolo =. Assim: co a

void main() { int a, b; a = 10; /* a recebe valor 10 */ b = a; /* b recebe o valor de a (10) */ }

Alm da atribuio as expresses aritmticas em C podem ser: soma(+), sube ca o e trao(-), multiplicao (*), diviso (/), mdulo (%), incremento(++), e decremento( ca ca a o ). Por exemplo:
void main() { /* fun~o principal */ ca int a=2, b, c, d, e; /* declara~o de variveis */ ca a b = 5*a; /* b recebe 10 c = a+b; /* c recebe 12 d = b/a; /* d recebe 5 e = b%3; /* e recebe 1 e++; /* incrementa e, e d--; /* decrementa d, d } */ */ */ */ fica com 2 */ fica com 4 */

Nmeros negativos so representados com o simbolo - a esquerda do nmero. u a u 8

5.2

Expresses Condicionais o

As expresses condicionais so das mais importantes no desenvolvimento de um proo a grama, pois nelas se baseiam todos os testes, e vericaes necessrias num programa. co a A linguagem C no suporta nativamente o tipo booleano, mas utiliza inteiros pra a representar verdadeiro ou falso. Quando o resultado de uma expresso condicional for a 0 (zero) interpretado como falso, e quando for diferente de 0 verdadeiro. Assim e e podemos utilizar qualquer expresso inteira como expresso condicional, ou seja, a a a sintaxe: if (a) printf(Verdadeiro); else print (Falso); perfeitamente e vlida, e mostrar na tela verdadeiro, caso a seja diferente de zero, e mostrar a a a Falsocaso a seja igual a zero. Para comparaes de valores, tem-se os operadores relacionais, que so: co a > >= < <= == != maior que maior que ou igual a menor que menor que ou igual a igual a diferente de

Alem destes operadores h tambm mais trs, que so operadores booleanos coa e e a muns: && AND, o resultado verdadeiro se ambas expresses envolvidas forem verdadeiras e o OR, o resultado verdadeiro se uma das expresses envolvidas for verdadeira. e o ! NOT, o resultado o inverso da expresso, se esta era verdadeira o resultado falso, i.e. e a e

5.3

Expresses de manipulao de bits o ca

Alm dos operadores j vistos, o C oferece tambm operadores para trabalhar diretae a e mente com bits das variveis de um programa, e podem ser utilizadas com qualquer a tipo de variveis. a & | << >> AND bit-a-bit OR bit-a-bit XOR bit-a-bit deslocamento de bits ` esquerda a deslocamento de bits ` direita a complemento de um (inverte cada bit)

Controle de Fluxo

Os programas consistem basicamente de um conjunto de comandos que so execua tados em sequncia, mas se consegue um poder muito maior controlando a ordem de e execuo de certos trechos do programa, atravs de algumas condies. Para isso temos ca e co comandos que nos permitem fazer testes e mudar rumo da execuo do programa, o ca dependendo do resultado destes testes. Estes comandos so: if, operador ternrio, switch, while, do while, for, break, e a a continue. Todos j conhecem a idia de cada um destes tipos de controle de uxo do a e programa, pois foram vistos em MC102, aqui simplesmente ser mostrado a sintaxe de a cada um deles, alguns exemplos no nal.

6.1

IF

O comando IF um dos mais bsicos e uteis comandos de qualquer linguagem de e a programao de alto n ca vel. No C ele tem a seguinte estrutura:
if (condi~o) { ca comandosIf; }

ou
if (condi~o) { ca comandosIf; } else { comandosElse; }

Por exemplo:

6.2

Operador Ternrio a

O operador ternrio simplesmente uma forma simplicada do IF..ELSE, e mais a e e eciente para testes simples. Sua estrutura : e
express~o1 ? express~o2 : express~o3 a a a

Que na verdade: e
if express~o1 then express~o2 else express~o3 a a a

10

6.3

Switch

O comando switch bastante semelhante ao comando case do Pascal. Este comando e permite a execuo de uma determinada ao para cada valor da expresso condicional, ca ca a sem que seja necessrio fazer um aninhamentode IFs. Sua estrutura : a e
switch (express~o) { a case item1: comandos1; break; case item2: comandos2; break; case itemn: comandosn; break; default: comandos; break; }

Antem-se ao fato de que para cada case h um break, e o break necessrio para que a e a os comandos dos outros cases no sejam executados. Por exemplo, se a expresso era a a igual a item1, os comandos representados por comandos1 sero executados, caso no a a houvesse o break, comandos2, at comandosn, e comandos seriam executados tambm. e e Com a presena do break o switch abandonadoapartir daquele ponto, no execuc e a tando nenhum comando de outro item.

6.4

While

A estrutura do while : e
while (express~o) { a comandos; }

6.5

Do - While

O do-while do C, praticamente igual ao repeat until do Pascal, pois sempre executa e uma vez a faz o teste. Sua estrutura : e
do comandos; while (express~o); a

11

6.6

For

Sua estrutura a seguinte: e


for(express~o1; express~o2; express~o3) { a a a comandos; }

Onde expresso1 onde se faz a atribuio do valor inicial do contador utilizado. a e ca expresso2 a condio (enquanto) de continuar no loop. expresso3 a forma com a e ca a e que o contador ser modicado a cada iterao. A expresso3 comumente algo como a ca a e contador++ou contador, mas pode ser qualquer operao. ca

6.7

Break

O C prov dois comandos de controle de como ser o loop, um deles o break e o outro e a e o continue. e O break simplesmente um comando de sa de um loop, ou switch. e da

6.8

Continue

O continue permite que uma determinada iterao (ou vrias delas) sejam puladas, e ca a o loop continue da pra frente.

6.9

Exemplos

if(x > 5) x = 0; else ++x; while(x < 5) { func(); ++x; } unsigned char ascii2dec(unsigned char letra){ unsigned char digito; switch (letra) { case A: case B: case C: case D: case E: case F: digito=letra+10-A; break;

12

case a: case b: case c: case d: case e: case f: digito=letra+10-a; break; default: digito=letra-0; } return digito; } for(J=100;J<1000;J++) { process(); }

I=100; do { process(); I--; } while (I>0);

Vetores

Os vetores so conjuntos de valores de um determinado tipo, que podem ser acessados a pelo nome do vetor, e pela especicao da posio dentro do vetor. ca ca Pode-se ter vetores de qualquer um dos tipos aceitos pela linguagem. Um vetor para inteiros, com capacidade para 10 nmeros denido da seguinte forma: u e
int vet[10];

A inicializao de um vetor pode ser feita da seguinte forma: ca


int vet[5] = {1, 2, 3, 4, 5};

E o acesso da forma: e
int a; int vet[5]; a = vet[2]; vet[4] = 3;

13

Assim pegamos o valor da posio 2 do vetor e colocamos na varivel a, e colocamos ca a o valor 3 na posio 4 do vetor. ca E importante destacar que os ndices do vetor vo de 0 at n-1, onde n o tamanho a e e do vetor. Portanto o vetor acima, que tem tamanho 5, tem seus ndices de 0 a 4, como ndice 0 representando a primeira posio, 1 a segunda,... e 4 a ultima posio do ca ca vetor.

Ponteiros

Uma das qualidades do C que ele prov meios de se trabalhar com a memria diree e o tamente. Isso permite que o programador realize muitas operaes como se estivesse co utilizando assembly, mas com a facilidade de uma linguagem de alto n vel. Infelizmente esse potencial pode ser tambm uma fonte de erros muito dif e ceis de ser detectados. Os ponteiros so variveis que contm endereos. Assim pode-se realizar operaes a a e c co tanto com o contedo das posies de memria apontadas por eles, quanto com os u co o prprios ponteiros. Como todas as outra variveis, os ponteros tm um tipo, que o a e indica ao compilador o numero de bytes que aquele ponteiro estar sendo realmente a apontado por aquele ponteiro. Por exemplo, no caso do ICC11, os inteiros tm 2 bytes, e assim quando se zer uma operao com o contedo da posio apontada por aquele ca u ca ponteiro, ser uma operao com 16 bits. a ca Em C pode-se obter o endereo de uma varivel facilmente, para isto basta colocar c a um & (e comercial) antes do nome da varivel, ou seja, se temos uma varivel var, a a &var o endereo de var (mas no um ponteiro). e c a O endereo de funes tambm so acess c co e a veis, e so dados simplesmente pelo nome a da funo, sem os parnteses logo aps. Portanto para pegar o endereo de uma funo ca e o c ca basta:
void myFun() { printf(N~o faz nada); a } void main() { int ender; ender = (int) myFun; }

8.1

Declarao de ponteiros ca

Para se declarar um ponteiro utiliza-se a seguinte sintaxe:


int *pt1; char *pt2; /* declara um ponteiro para um inteiro (16bits) */ /* declara um ponteiro para um caractere (8bits) */

14

unsigned char *pt3;

/* declara um ponteiro para um caractere, considerando-o de 0 a 255 (8bits)*/

Alm da declarao deseja-se que o ponteiro aponte para uma determinada posio e ca ca de memria, portanto preciso setar o seu valor. Para isso basta que se conhea o o e c endereo a ser apontado, e ento fazer um cast para o tipo de dado do ponteiro, da c a seguinte forma:
pt1 = (int *) 0x1000; pt3 = (unsigned char *) 0x100A;

Agora tem-se dois ponteiros inicializados, o primeiro, pt1, um apontador para inteiro, apontando para o endereo 0x1000. E o segundo um apontador para caracteres c (8 bits) sem sinal (0 a 255), apontando para o endereo 0x100A. c

8.2

Referncia a ponteiros e

Os ponteiros podem ser utilizados tanto para escrita, quanto leitura na memria. Essas o duas operaes so classicadas como referncia a ponteiros. co a e O uso dos ponteiros bastante semelhante ao uso de variveis comuns, execeto pelo e a asterisco (*) colocado antes do nome do ponteiro para indicar o contedo da posio u ca de memria apontada pelo ponteiro. Assim o uso seria: o
void main() { unsigned char *PORTE = (unsigned char *) 0x100A; char *disp = (char *) 0xBF01; unsigned char a; a = *PORTE; /* L^ da Porta E (DIP-SWITCH e Push-buttom) */ e *disp = 0xFF; /* Escreve $FF em $BF01, ou seja apaga displays */ }

8.3

Aritmtica de ponteiros e

O ICC11 trata ponteiros como se fossem vetores, assim caso se queira acessar a terceira posio de memria apartir de onde est o ponteiro, pode-se tanto utilizar *(pt+3), ca o a ou simplesmente pt[3].
void main() { int *pt = (int *) 0x7000; int i; for (i=0; i<10; ++i) *(pt + i) = 0; } /* pt: ponteiro para um inteiro */

15

Este programinha coloca 0 em 20 (inteiro ocupa 2 bytes) posies de memria co o consecutivas apartir da posio 0x7000. ca Este mesmo programa poderia ser feito utilizando a seguinte sintaxe:
void main() { int *pt = (int *) 0x7000; int i; for (i=0; i<10; ++i) pt[i] = 0; } /* pt: ponteiro para um inteiro */

Funes pr-denidas no ICC11 co e

O ICC11 um compilador C no completamente ANSI, e no oferece muitas das e a a funes padro denidas com a linguagem C. O ICC11 oferece duas funes bsicas de co a co a escrita, e que podem ser facilmente utilizadas nos programas que devero ser feitos. a Algumas outras funes o prprio BUFALLO oferece (por exemplo INPUT em co o $FFAC), e para utiliz-las basta fazer uma simples interface entre seu programa em C a e uma chamada ` sub-rotina assembly do BUFALLO. a

9.1

putchar

Uma das funes que o ICC11 oferece a putchar, que simplesmente ecoa na tela o co e caractere passado a ela como parmetro. Note que esta funo faz a mesma coisa que a ca a rotina OUTPUT do BUFALLO. Para imprimir o caractere M na tela basta:
putchar(M);

9.2

printf

A outra funo de sa que o ICC11 oferece o printf, e pode ser utilizada para ca da e imprimir somente uma string, da forma: printf("Meu texto");. Ou pode ser utilizada para
imprimir o valor de variveis formatando o valor de acordo com determinadas strings de controle, da a forma: int a=7, b=65; printf("Eu gosto do nmero %d",a); /* Imprime o nmero na forma decimal */ u u printf("Eu esqolhi o nmero %x tambm",b); /* Imprime o nmero 65 na forma hexadecimal 0x41 */ u e u A string de controle indicada pelo s e mbolo %, e no C ANSI pode ter os seguintes valores:

16

%c %s %d %u %o %x %f %e %g

ASCII(caractere) String decimal com sinal decimal sem sinal octal sem sinal hexadecimal sem sinal ponto utuante notao cient ca ca (exponencial) formato geral, escolhe a representao mais curta entre %f e %e ca

Note que o C ANSI trabalha com nmeros de ponto utuante, mas o ICC11 no, portanto os u a ultimos trs formatos no so aceitos. Em C padro h tambm algumas variaes das strings de e a a a a e co controle, podendo ser passado o nmero de d u gitos com o qual o nmero ser representado, nmero u a u de casas decimais, mas o ICC11 tambm no prov esta funcionalidade. e a e Alm dos caracteres normais do teclado, `s vezes necessrio imprimir na tela alguns caracteres e a e a no exatamente grcos, como mudana de linha, tabulaes, e alguns outros. Em C utiliza-se a a a c co barra invertida para indicar este tipo de sequncia. Os caracteres deste tipo mais usados so: e a sequncia e \n \t \b \a \r \" \\ \ nome newline, linefeed tab backspace Beep return ASCII quote ASCII back slash ASCII single quote valor $0A = 10 $09 = 9 $08 = 8 $07 = 7 $0D = 13 $22 = 34 $5C = 92 $27 = 39

E bom prestar ateno ao fato que aspas, e aspas simples so utilizadas como delimitador de ca a strings e caracteres respectivamente, assim quando se quer imprimir na tela uma aspas () no se a pode simplesmente colocar uma aspas pra ser impressa, preciso colocar a sequncia correspondente, e e que \". Para aspas simples e barra invertida ocorre da mesma forma. e No C padro h mais algumas destas sequncias, mas que no sero citadas aqui, ca a cargo de a a e a a quem tiver interesse, pegar um livro de C e dar uma olhada. Por exemplo:

10

Assembly in-line

A linguagem C bastante ex e vel, permite uma certa proximidade com a mquina, apesar de seruma a linguagem de alto n vel, mas `s vezes no poss fazer tudo somente com ela, a preciso recorrer a a e vel e novamente ao assembly, a vem a dvida: como integrar os dois? u Todos os compiladores permitem que cdigo assembly seja colocado diretamente dentro do proo grama, a cada compilador cria suas convees de como fazer isso. No ICC11 utiliza-se a funo asm(). co ca Assim para executar um LDAA $7000 dentro do seu programa basta: void main() { asm(" LDAA $7000"); }

17

E bom deixar bem claro, o espao entre a primeira aspa, e a instruo LDAA c ca e NECESSARIO. NUNCA se esqueam disso. c

10.1

Utilizando variveis do C no assembly a

O compilador ICC11 permite que variveis criadas no seu programa em C seja utilizadas a no assembly inline. Para isso basta colocar o s mbolo % antes do nome da varivel. a Como mostrado abaixo:
void main() { char a; asm(" STAA %a"); /* Salva valor do ACCA na varivel a */ a }

11

Concluso a

Durante o curso vocs vero que o uso do C realmente facilita a programao das e a ca tarefas propostas. Algumas delas bem trabalhosas, mas com um objetivo muito bom, conhecer o funcionamento do hardware, e control-lo atravs de um software. a e A grande proximidade com a mquina no termina agora, muito menos o uso dos a a manuais do HC11. Na verdade agora que comea realmente as interminveis leituras e c a de manuais, pois agora no s ver o que determinada instruo faz, mas sim ver como a e o ca funciona determinada interface de I/O, determinada porta, e coisas assim. O acesso direto ` memria tambm continua, agora no mais atravs de instrues a o e a e co como LDAA, mas com a utilizao dos ponteiros. ca No pensem que agora vai car fcil demais, mas tambm no pensem que vai car a a e a mais dif porque os programas sero mais complexos, simplesmente ser diferente, cil a a uma nova experincia na programao e conhecimento do funcionamento da mquina. e ca a Espero que todos se divirtam. Nem tanto, mas que todos possam aproveitar ao mximo esta oportunidade (que para muitos ser unica). a a

18

Вам также может понравиться