quarta-feira, 29 de junho de 2016

Como usar a IDE SASM para fazer programas assembly.


Este é um rápido tutorial de como baixar e usar o SASM.

O que é o SASM?

É uma IDE multiplataforma, utilizada para escrever programas em assembly NASM, MASM, entre outros.

Como baixo?

Disponibilizei o download no drive nas versões x64_86 e i386. Se preferir vc pode baixar direto do site dos desenvolvedores (apenas utilizo, não desenvolvi nem ajudei no projeto).

Como instalo?

Depois que baixar o programa no ubuntu, abra com o instalador de aplicativos do sistema.

Como uso?

É bem simples e intuitivo. Para criar um novo programa basta criar um novo projeto, escrever o código desejado e clicar na seta verde (build and run). A saída padrão aparecerá na janela OUTPUT, assim como a entrada na INPUT.

Estrutura básica de um programa assembly NASM (ubuntu)


Neste tópico irei abordar alguns conceitos básicos da linguagem Assembly utilizada pelo compilador NASM. Expliquei como compilar programas assembly no ubuntu neste post.

Vantagens da linguagem Assembly

  1. Interfaceia os programas diretamente com o hardware, sistema operacional e BIOS.
  2. O fato da linguagem ser de baixo nível, permite que programa rode geralmente mais rápido e consumindo menos memória.
  3. Devido sua facilidade em acessar hardware, é uma boa alternativa na hora de construir drivers e afins.

Desvantagens da linguagem Assembly

  1. Em muitos casos é pouco produtiva em termos de tempo.
  2. Pode exigir bem mais conhecimentos do que uma linguagem de nivel alto.
  3. Em muitas situações, especialmente em processadores de arquitetura RISC (acrônimo de Reduced Instruction Set Computer; em português, "Computador com um conjunto reduzido de instruções") você terá de construir as rotinas manualmente.

Endereçando dados na memória em assembly

O processo de execução ou ciclo de execução se divide em três partes principais: buscar , decodificar e executar as instruções.

Em determinados grupos de dados o processador terá que "quebrar" a informação que está no registrador para armazenar na memória. 

Por exemplo, um valor 1012h poderá ser dividido em dois grupos de 1 byte, o primeiro armazenando 10h e o segundo com 12h. 

Os dados são armazenados na memória de forma reversa, ou seja, na posição da memória "x" será armazenado o valor 12h já na posição x+1, o valor 10h. Quando retirado da memória para os registradores, ocorre novamente uma troca pelo qual ele volta a ficar na posição original.

Existem dois tipos de enderaçamento de memoria: endereçamento por valor"absoluto" e por "segmentação". No endereçamento direto ou absoluto, faz-se referenciamento ao endereço diretamente; já no endereçamento por segmentação é usado um sistema de offset, no qual é usado um endereço inicial mais um valor chamado "offset".

Sintaxe básica de um programa assembly

Um programa em assembly é comumente dividido em trẽs seções:
  • section .data -  seção utilizada para guardar constantes e dados inicializados (aqueles que já são declarados junto com a sua inicialização).
  • section .bss -  seção que guarda as variáveis de seu programa.
  • section .text - este é o local que irá armazenar as instruções , ou seja, o código. Esta seção deve conter o ponto de entrada do sistema que é representada pela declaração global main.
Exemplo:
section .text        ;seção onde o código é escrito
    global main   
main:                  ;ponto de entrada do linker
    mov edx,len   
    mov ecx,msg  
    mov ebx,1      
    mov eax,4      
    int 0x80         
 
    mov eax,1      
    int 0x80

section .data       ;dados inicializados e constantes
msg db 'Ola mundo!', 0xa   ;string

len equ $ - msg                    ;tamanho da string
section .bss

Comentários

São representados pelo ";" seguidos do comentário.
Exemplo:

add ah,bh ;isto é um comentário 

Declarações da linguagem Assembly

São basicamente três tipos de delclarações: instruções, diretivas e macros.

  • Instruções são códigos voltados à máquina, o que gera a execução de uma ação e dizem efetivamente o que o processador deve fazer. Essas instruções geram um código de máquina.
  • Diretivas são voltadas ao compilador e não a máquina. Dizem ao compilador (assembler) como será o processo de assemblagem (compilação).
  • Macros funcionam como simples substituição de texto. 
A partir de agora iremos fazer nossos primeiros programas nessa maravilhosa linguagem. Para isso recomendo instalar o SASM, que é uma IDE que utilizo para construir meus programas e é bem compativel com o NASM.


Neste post aprendemos a montar o esqueleto básico em assembly. No próximo, começarei a explicar os tópicos principais desta linguagem.

terça-feira, 28 de junho de 2016

Como compilar um programa em C com o CodeBlocks



No último tutorial sobre C, ensinei сomo compilar um programa diretamente pelo terminal. Desta vez irei ensinar como instalar e compilar um programa em C usando o CodeBlocks.

Instalando o CodeBlocks

Para instalar basta conectar-se a internet, abrir o terminal e digitar o seguinte comando:

sudo apt-get install codeblocks

 
Se tudo ocorrer corretamente você poderá ir no "ubuntu software" ou no "pesquisar no seu computador" e digitar "codeblocks". Com isso deve aparecer o ícone do programa e poderá iniciar o mesmo por lá.
Outra forma de executar o programa é via terminal digitando:

codeblocks & 

Vale ressaltar que após uma reinicialização, o ícone irá aparecer na barra de lançamento.

Feito isso, o CodeBlocks vai mostrar sua tela inicial:


Para criar um novo projeto, na tela inicial clique em: Creat new Project >> Console aplication >> Next >> clique em C e depois em Next >> dê um nome para o projeto e denovo Next >> e depois em Finish.

Feito isso irá aparecer essa tela:



Rodando o programa

Na aba "projects" do lado esquerdo,  dê um duplo-clique em sources >> main.c.

Vai aparecer seu hello world pronto para ser executado . Para compilar e rodar o programa basta apertar "F9".



Cabe relembrar que, para aqueles que escrevem rotinas em windows, que algumas bibliotecas não são compatíveis com o linux, um belo exemplo é a famosa e útil "conio.h" ou "console input/output" muito usada para formatar a saída pro terminal. Tem uma alternativa para a conio.h  chamada unistd.h mas não espere encontrar os mesmo comandos.

Esse compilador será utilizado em nossos próximos tutoriais em linguagem C por ser de fácil manuseio em ubuntu. Por usar o compilador nativo do ubuntu ele é bem compatível.

quinta-feira, 23 de junho de 2016

Compilando programas em assembly no ubuntu com o NASM


Instalando o NASM


Na última postagem mostrei como compilar programas em C utilizando o compilador nativo GCC. Hoje irei explicar um procedimento similar com a linguagem Assembly.

Nessa postagem irei me abster a compilação, até para as pessoas que já tem experiência em outros compiladores e plataformas poderem aproveitar da melhor forma possível.

Em primeiro lugar é necessário saber se o NASM está instalado da seguinte forma: Abra o terminal e digite "nasm -h" , se aparecer algo parecido com a imagem abaixo o nasm não está no seu PC. Caso não esteja basta apenas digitar "sudo apt install nasm" quando estiver com conexão na internet.

 Segue o exemplo abaixo:




Como segunda alternativa, você pode baixar o NASM direto do site.

Como instalar pelo arquivo do site?

1 - Baixe a versão que desejar
2 - Extraia o arquivo
3 - Abra o terminal na pasta que extraiu o arquivo
4 - Digite "./configure"
5 - Digite "make"
6 - Digite "make install"

 

Compilando um programa "Olá mundo!".

Agora sim vamos ao que interessa, para gerar um programa que diga "Olá mundo!" no terminal, primeiro deve-se baixar este arquivo ou escrever o seguinte programa:


section .text
    global main    ;precisa ser declarado pro linker
main:                  ;ponto de entrada do linker
    mov edx,len    ;tamanho da mensagem
    mov ecx,msg   ; mensagem a ser gravada
    mov ebx,1       ;saida em stdout
    mov eax,4       ;numero da chamada do sistema
    int 0x80          ; chamada do kernel
 
    mov eax,1       ;chamada sys_exit
    int 0x80

section .data
msg db 'Ola mundo!', 0xa   ;string

len equ $ - msg                      ;tamanho da string

Salve o arquivo com o nome de "ola.asm", e abra o terminal onde salvou o arquivo. Feito isso abra o terminal na pasta (explique isso no post de como compilar programas em c no ubuntu) e digite "nasm -f elf ola.asm", isso vai gerar um arquivo objeto "ola.o".



Agora digite "ld -m elf_i386 -s -o ola ola.o", irá aparecer um aviso mostrando que o ponto de entrada não foi definido, mas não se procupe. Este passo deve gerar um executável.

Finalmente para executar basta digitar no terminal "./ola". Deverá aparecer um Ola mundo no terminal.


 No próximo post irei explicar a estrutura de um programa da linguagem assembly NASM para ubuntu. 

Até breve!




terça-feira, 14 de junho de 2016

Compilando programas em c no ubuntu.




Para quem está iniciando na programação em C, surgem muitas dúvidas de como gerar códigos executáveis.

Hoje vou ensinar como compilar na linha de comando do ubuntu. com um compilador nativo deste chamado de GCC.

Vamos escrever um programa simples chamado hello.c que imprime (ou seja faz aparecer na tela) uma mensagem, a famosa "hello world".

Vamos, inicialmente criar um novo documento, clicando com o botão direito do mouse depois em novo documento>>documento vazio. Vamos chamar esse documento de "hello.c"




Agora vamos abrir o programa em digitar o seguinte texto:

#include<stdio.h>

void main(){

    printf("Hello world");

}

Agora salve o programa,  navegue até a pasta que salvou o programa, e clique com o botão direito em um lugar da pasta que esteja sem nenhum arquivo,  depois clique em "abrir no terminal".




 


Vamos compilar nosso programa digitando "gcc hello.c -o hello" . Para executar nosso programa basta digitar "./hello" .

Isto produzirá na tela o hello world!




Em outra publicação explico como fazer um programa em C com o CodeBlocks.
Até a próxima.

Gradiente descendente em python para problemas em 1° grau

O seguinte código utiliza o recurso gradiente descendente para descobrir dois parâmetros, theta e theta1, que irão descrever uma equação d...