O que é e como usar um Label (rótulo) em Assembly

Agora que já vimos no artigo passado o escopo e organização de um programa em Assembly, vamos iniciar nossos estudos em programação mesmo, com exemplos reais de códigos ou trechos de código-fonte.

Neste tutorial de nosso curso Assembly Progressivo, vamos iniciar os nossos estudos das instruções em Assembly, explicando o que são os labels, labels internos (ou locais), dando exemplos de uso e mostrando para que servem.

O que são labels em Assembly e para quê servem

A tradução de label é 'rótulo', é uma nomenclatura que damos para dar nome a um trecho de código em Assembly.

Durante todo nosso curso de Assembly iremos traduzir algumas palavra dessa linguagem de programação, pois simplesmente entendendo o significado da palavra em inglês, saberemos a utilidade daquele comando.

O label, por exemplo, serve (como o nome diz) para rotular, nomear uma seção do código, para que possamos definir uma região do código através de um rótulo, de um nome que quisermos.

Para criar uma label, basta digitar o nome desse rótulo seguido de dois pontos, ' : '.
Em seguida, escrevemos nossas linhas de código em Assembly.

A sintaxe é a seguinte, então:

label:
 ;aqui vem o código
 ;que vai ser nomeado
 ;de 'label'






Imagine que você criou uma rotina de códigos que tem por objetivo passar um número para outro registrador, subtrair esse valor daquele e depois substituir o valor original (não importa o que sua rotina esteja fazendo). Enfim, suponha que você criou um trecho de código que vai repetir várias vezes durante seu programa em Assembly.

Ou seja, esse código se repete, você vai usar mais de uma vez.

Vamos então criar um label chamado 'rotinaBase'.

rotinaBase:
  ;código super
  ;hiper mega complexo
  ;que aprendi no
  ;Assembly Progressivo


O que o label faz é nomear essa porção de linhas de código.
Para executar elas, em vez de escrever todas elas de novo em outra parte, você apenas se refere a "rotinaBase", e o trecho de código que você usou abaixo da label 'rotinaBase' será executado.

Lembrando que a linguagem Assembly está em baixo nível, ela sempre trata tudo em relação aos endereços na memória.Os labels estão intrinsecamente ligados com endereços de memória.

Um label serve para representar o endereço de um determinado trecho no código (ou para inicializar variáveis e constantes que podem ter seus endereços realocados).
Assim, se usarmos esse trecho de código várias vezes, em vez de repeti-lo basta voltar ao ponto (endereço) na memória que tem esses códigos.

Porém, é complicado para os humanos tratarem os endereços de memórias como números (em binário, hexadecimal ou mesmo decimal), por isso damos um nome a esse endereço de memória, um rótulo, e passamos a chamar esse local da memória pelo seu label. Bem mais simples, não?

No nosso código do Hello World em Assembly, usamos o label '_start', que serve para definir para o NASM onde vai começar nosso programa.
Como outro exemplo do uso de label em nossos códigos Assembly, vamos supor que durante a execução de um programa seja necessário incrementar uma variável 'numero' várias vezes.

O código para incrementar é:

inc numero ;numero++


Onde 'inc' é um mnemônico, ou seja, representa a operação de incrementação (adicionar +1 à variável 'numero'). Vamos criar um label para definir esse trecho de código, a label: 'incrementa'.
Ela ficaria assim:

incrementa:
  inc numero ;incrementa 'numero' em uma unidade


Pronto, agora podemos incrementar a variável número apenas invocando o label.

Labels internas ou Labels locais


O uso de labels é altamente recomendável, visto que os programas em baixo nível sempre são enormes, com códigos 'obscuros', números hexadecimais e outras complicações visuais.

Em sistemas mais complexos, onde é necessário o uso de centenas ou milhares de linhas de código, será interessante usar labels internas.
Você usará labels que vão representar centenas de linhas de código, e pode ser necessário usar labels dentro destas labels, e provavelmente que tenham o mesmo nome.

O NASM, que é o Assembler que estamos usando em nosso Curso de Assembly, permite a definição de labels locais.
Para isso, basta colocar um ponto, ' . ', antes do nome da label.

labelNormal -> label normal, sem ponto
.labelInterna -> label local, com ponto, ela está dentro('pertence) a label 'labelNormal'

Por exemplo, uma representação de um código que duas labels internas, de mesmo nome, mas em locais diferentes, que fazem a mesma coisa (incrementar), mas incrementam variáveis diferentes:

trecho1:
 ;trecho 1 do código
.incrementa:
 inc numero1 
 
 ;continuação trecho 1
 
trecho2:
 ;trecho 2 do código
.incrementa:
 inc numero2
 
 ;continuação do trecho 2

Note que uma label local se refere a label 'geral', imediatamente superior.
Cuidado para não se confundir.

Nossos estudos sobre labels não param por aqui, mas você já aprendeu uma ótima noção sobre os rótulos, embora ainda falte coisas importantes, como o ret, que é uma instrução de retorno, que serve para definir onde termina um rótulo/label.

Ao decorrer de nossa apostila online de Assembly usaremos bastante labels, então você aprenderá mais sobre elas vendo exemplos reais de código.

Um comentário:

Darlan Simplicio disse...

Desculpa incomodar.. mas vc tem previsão para publicação dos proximos tutorias ? ansioso pra aprender.. e desde ja te agradeço. e parabéns pela cooperação .. estão de otimo entendimento.. aguardo