Ir para conteúdo
Faça parte da equipe! (2024) ×

Um Pouco de Assembly


Zaphey
 Compartilhar

Posts Recomendados

Assembly

Assembly ou linguagem de montagem é uma notação legível por humanos para o código de máquina que uma arquitetura de computador específica usa. A linguagem de máquina, que é um mero padrão de bits, torna-se legível pela substituição dos valores em bruto por símbolos chamados mnemónicos.

Por exemplo, enquanto um computador sabe o que a instrução-máquina IA-21 (10110000 01100001) faz, para os programadores é mais fácil recordar a representação equivalente em instruções mnemónicas MOV AL, 61h. Tal instrução ordena que o valor hexadecimal 61 (97, em decimal) seja movido para o registrador 'AL'.

 

Arquitetura

Ao contrário do que acontece nas linguagens de alto nível, existe (até certo ponto) uma correspondência de 1 para 1 entre a linguagem de montagem simples e a linguagem de máquina. Por isso a tradução do código de montagem em código de máquina não é chamada compilação, mas montagem. Consegue-se transformar a linguagem de montagem em linguagem de máquina recorrendo a um montador (também chamado assembler, originado do termo em inglês), e a transformação inversa faz-se recorrendo a um desmontador (também chamado disassembler, originado do termo em inglês).

Cada arquitetura de computador tem a sua própria linguagem de máquina e, portanto, a sua própria linguagem de montagem. Essas linguagens de montagem diferem no número e tipo de operações que suportam. Também têm diferentes tamanhos e números de registos, e diferentes representações dos tipos de dados armazenados. Enquanto todos os computadores de utilização genérica são capazes de desempenhar essencialmente as mesmas funções, o modo como o fazem é diferente.

Além disso, podem existir conjuntos múltiplos de mnemónicas, ou sintaxes de linguagem de montagem, para um único conjunto de instruções. Nestes casos, o conjunto mais popular é aquele que é utilizado pelo fabricante na sua documentação.

A maioria dos processadores só consegue manipular os dados que estão em registradores e a linguagem de montagem facilita o trabalho direto com os registradores.

No mercado de PCs, dominado por processadores Intel e AMD, atualmente existem duas arquiteturas. Primeiro a IA32 (genericamente chamada de i386, x86 ou x86-32), criada pela Intel em 1985 e primeiramente utilizada pelo processadores i386 e segundo a IA32-EM64T (ou IA32-AMD64 ) criada em 2002 pela AMD (Mas também utilizada pela Intel hoje). O IA32 utiliza o grupo de instruções chamado x86, e o IA32-EM64T utiliza o grupo chamado x86-64. As duas arquiteturas usam números diferentes de registradores gerais e tamanho. Enquanto os registradores do x86 são 32 bits os da x86-64 são 64 bits.

 

Os registradores de uso geral da arquitetura x86 são:

%EAX - registrador acumulador

%EBX - registrador base

%ECX - registrador contador

%EDX - registrador de dados

%ESI - registrador de índice da fonte dos dados

%EDI - registrador de índice do destino dos dados

%EBP - registrador ponteiro para a moldura de chamada de função

%ESP - registrador ponteiro para a pilha de execução

 

Os registradores de uso geral da arquitetura x86-64 são:

%RAX - registrador valor de retorno

%RBX - registrador base

%RCX - registrador contador

%RDX - registrador de dados

%RSI - registrador de índice da fonte dos dados

%RDI - registrador de índice do destino dos dados

%RBP - registrador ponteiro para a moldura de chamada de função

%RSP - registrador ponteiro para a pilha de execução

%R8 - registrador de dados

%R9 - registrador de dados

%R10 - registrador ponteiro para a moldura de chamada de função

%R11 - registrador de linking

%R12 - registrador de base

%R13 - registrador de base

%R14 - registrador de base

%R15 - registrador de base

 

Esses nomes derivam da forma como eram utilizados nas arquiteturas anteriores a IA32 (8086, 80286…), em que cada registrador desempenhava um papel específico. Na arquitetura i386, todos eles são de uso geral, embora eles continuem a poder ser utilizados em seus papéis tradicionais.

A arquitetura IA32 ainda apresenta os registradores de segmento CS, DS, ES, SS, FS e GS, um contador de programa EIP, um registro de sinalizadores EFLAGS, 8 registradores de vírgula flutuante e seus sinalizadores associados. Existem também registradores utilizados pelo sistema operacional para controle da execução em modo protegido, bem como outros registradores de uso específico (depuração, controle de desempenho, etc.).

 

Instruções Aritméticas

Adição: ADD, ADC, INC, XADD, AAA e DAA;

Subtracção: SUB, SBB, DEC, AAS e DAS;

Multiplicação: MUL, IMUL e AAM;

Divisão: DIV, IDIV e AAD.

 

Exemplos de código de montagem

 

Arquitetura Intel

É necessário se cadastrar para acessar o conteúdo.

 

Microprocessador Texas Instruments TMS320C2x

É necessário se cadastrar para acessar o conteúdo.

 

Fonte: Wikipédia

Formatação: Zaphey

Link para o comentário
Compartilhar em outros sites

Ótimo artigo, tem funções alí que eu até desconheço(apesar de ser simples), se puder explicar ou descrever na frente das mesmas, iria ajudar bastante o pessoal(Inclusive a mim).

Instruções Aritméticas

Adição: ADC, XADD, AAA e DAA;

Subtracção: SBB, AAS e DAS;

Multiplicação: AAM;

Divisão: AAD.

b34c171261.png

Link para o comentário
Compartilhar em outros sites

Sim, mas cada um tem uma maneira diferente de se fazer as operações, por exemplo:

É necessário se cadastrar para acessar o conteúdo.

 

É necessário se cadastrar para acessar o conteúdo.

 

É disso que digo. :)

b34c171261.png

Link para o comentário
Compartilhar em outros sites

  • 3 semanas atrás...

//IMUL XX1,XX2,XX3(Esse(XX3) eu acho que sempre será uma constante em HEX.)

mov eax,0Ah

imul ecx,eax,0Ah //multiplica eax por 0Ah, resultado em ecx

______________________________________________________

Para quem não entendeu ...

 

AX = 3

 

BX = 4

 

queres AX*BX mas via somas

 

tens o comando ADD

ADD AX,BX ; soma 2 valores.

MOV CX,'NUM_X_A_SOMAR' neste caso:

 

MOV CX,BX ; numero de x a executar o loop, em seguida fazemos o loop (BX=4, certo?)^^

CALC_LOOP:

ADD AX,AX ;soma ao AX o valor dele proprio ou seja, AX=3, fica 3+3, enquanto CX<>0

DEC CX ;diminue o valor da variavel que indica o num de x a fazer o ciclo, neste caso ordenado pelo vaor CX que é igual ao BX

JNZ CALC_LOOP

 

 

 

em C++

 

 

FICA ASSIM

soma(Valor1,Valor2)

{

if(Valor1==0 OR Valor2==0) return(0)

Valor2=Valor2-1

do {

Valor1=Valor1+1

Valor2=Valor2-1

} while(Valor2>0)

return(Valor1)

}

Link para o comentário
Compartilhar em outros sites

Não aconselho muito a programar em assembly, mas sim a fazer certas coisas, por exemplo, uma função gigantesta, faça em assembly, que ficará bem mais rápida, estude também para ler em asm, isso te ajudará e muito.

OBS: IDEs como Delphi, C++, etc.. foram criadas principalmente para nos poupar tempo, do que fazer tudo em assembly.

b34c171261.png

Link para o comentário
Compartilhar em outros sites

Não aconselho muito a programar em assembly, mas sim a fazer certas coisas, por exemplo, uma função gigantesta, faça em assembly, que ficará bem mais rápida, estude também para ler em asm, isso te ajudará e muito.

OBS: IDEs como Delphi, C++, etc.. foram criadas principalmente para nos poupar tempo, do que fazer tudo em assembly.

 

Oks, meu interesse em Assembly é apenas para fazer keygens e Cracks; mas é sempre bom saber uma 'lingua' a mais.

Link para o comentário
Compartilhar em outros sites

  • 2 semanas atrás...
Este tópico está impedido de receber novos posts.
 Compartilhar

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...

Informação Importante

Nós fazemos uso de cookies no seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies , caso contrário, vamos supor que você está bem para continuar.