Bem vindo ao LifeGames Demo
Cadastre-se agora para ter acesso a todos os nossos recursos. Uma vez cadastrado e logado, você será capaz de criar tópicos, postar respostas a tópicos já existentes, a reputação de seus companheiros, começar seu próprio mensageiro privado, atualizações de status post, gerir o seu perfil e muito mais. Esta mensagem será removida assim que tiver logado.
Entrar Cadastre-se


Você não está conectado. Conecte-se ou registre-se

Ver o tópico anterior Ver o tópico seguinte Ir em baixo  Mensagem [Página 1 de 1]

1 assembly em c - 1º parte em Sab Abr 20, 2013 6:41 pm

Moedas Moedas : 201
Mensagens Mensagens : 92
Humor Humor : *-*
Reputação Reputação : 5
Quebra de regras:
0 / 1000 / 100

avatar

hacker fts315

Moderador Informática

Moderador Informática

bom galera nesse tutorial eu vou ensinar como usar assembly dentro do c/c++ porem eu so sei o basico de assembly entao vai ficar bem basico esse tutorial XD, a vantagem de usar assembly na linguagem c que dependendo doq voce for fazer pode deixar o programa muito mais rapido pelo motivo de ta usando registradores do processador ao inves de variaveis q sao alocaçao na memoria, nesse tutorial eu vou ensinar a colocar um conteudo de uma variavel nos registradores e vice-versa, ensinar a mover um valor, adicionar e subtrair, comparar e pular, tambem vou ensinar como colocar na pilha e retirar, incrementar e decrementar, para quem nunca mexeu com assembly e quer aprender isso ja e um começo e matar dois coelhos em uma cajadada so kkkkkk, veja um programa simples em c

Código:
#include <stdio.h>

int main(void)
{
  int x;
  x = 315;
  printf("%d",x);
}

a source acima ela cria uma variavel e atribui o valor 315 a ela e depois exibe o valor, para programar em assembly na linguagem c agente usa a funçao asm e passamos como argumento os nossos comandos em assembly, existe praticalmete dois meios de escrever em assembly usando sintaxe intel ou at&t vamos usar at&t para nosso exemplo, o primeiro comando q vamos usar nesse exemplo e o nop (esse comando nao faz nada literalmente) veja

Código:
#include <stdio.h>

int main(void)
{
  asm("nop");
}

na source acima e apenas um comando se fosse dois comandos agente teria q colocar um ponto e virgula para separar cada comando (ponto e virgula no assembly indica comentario mais quando usado no assembly em c e para semparar comandos)

Código:
#include <stdio.h>

int main(void)
{
  asm("nop ; nop");
}

se voce socar tuto na mesma linha possivelmete vai ficar inlegivel entao recomendo colocar cada comando em uma linha assim

Código:
#include <stdio.h>

int main(void)
{
  asm("nop ;"
      "nop");
}

os registradores sao tipo variaveis de memoria porem sao limitados diferente das variaveis, os 4 registradores mais usado na linguagem assembly e o ax, bx, cx, dx, vamos esquecer o cx, dx e nos focar mais no ax, bx, em teoria o registrador e a,b,c,d esse x no final signifaca q ele ta usando tanto to byte alto quanto byte baixo, se o registrador for de 16bits entao pode armazenar um valor de ate 65535 ou ffff em hexadecimal os dois primeiro ff sao byte alto e os dois ultimos ff sao byte baixo para usar os bytes baixo eu poderia definir al e para usar byte alto ah e para usar ambos ax porem ah e al nao funciona no assembly em c, o comando mov serve para mover determiando valor para um registrador, a sintaxe dele e o comando depois o valor e o registrador q vai receber o valor, para usar numeros agente coloca um cifrao antes do numero por exemplo $315 se ante nao colocar o cifrao vai ser representado como um endereço ao invez de um numero, para os registradores agente usa porcentagem depois a letra "e" e o registrador por exemplo %eax

Código:
#include <stdio.h>

int main(void)
{
  asm("mov $315,%eax");
}

veja outro exemplo com dois comandos

Código:
#include <stdio.h>

int main(void)
{
  asm("mov $315,%eax ;"
      "mov $100,%ebx");
}

para usar codigos em hexadecimal se usa cifrao seguido do 0x e o numero por exemplo $0x13b q e igual a 315 em decimal

Código:
#include <stdio.h>

int main(void)
{
  asm("mov $0x13b,%eax ;");
}

para mover uma valor de um registrador para outro basta colocar o registrado ao inves do valor

Código:
#include <stdio.h>

int main(void)
{
  asm("mov $315,%eax ;"
      "mov %eax,%ebx");
}

para agente colocar um valor do registrador em uma variavel basta colocar dois pontos depois aspas igual a letra do registrador e depois entre parenteses a variavel no final do ultimo codigo, e nos registradores usamos duas vezes o porcentagem por exemplo %%eax

Código:
#include <stdio.h>

int main(void)
{
  int x;

  asm("mov $315,%%eax":"=a"(x));

  printf("%d",x);
}

para deixar mais legivel recomendo colocar em outra linha

Código:
#include <stdio.h>

int main(void)
{
  int x;

  asm("mov $315,%%eax"
      :"=a"(x));

  printf("%d",x);
}

quando sao dois registradores q vao ser armazenado em uma variavel basta colocar uma virgula

Código:
#include <stdio.h>

int main(void)
{
  int x, y;

  asm("mov $315,%%eax ;"
      "mov $666,%%ebx"
      :"=a"(x), "=b"(y));

  printf("%d \n",x);
  printf("%d",y);
}

para entrar com dados agente colocar mais dois pontos depois a letra do registrador e entre parenteses a variavel q ele vai ta recebendo, no exemplo abaixo ele pega o valor da variavel x q e 315 armazena no no registrador eax depois move para o registrador ebx e manda o conteudo do registrador ebx para variavel y depois ler a variavel y

Código:
#include <stdio.h>

int main(void)
{
  int x = 315, y;

  asm("mov %%eax,%%ebx "
      :"=b"(y)
     :"a"(x));
    
  printf("%d",y);
}

agora q agente ja sabe como mandar e pegar o valor do registrador da para mostrar eles *-* , para adicionar (somar) se usa o comando add e depois o numero ou registrador (so lembrando q faz o inverso tipo a + b seria na ordem b + a)

Código:
#include <stdio.h>

int main(void)
{
  int x;

  asm("mov $300,%%eax ;"
      "mov $15,%%ebx ;"
     "add %%eax,%%ebx"
      :"=b"(x));
    
  printf("%d",x);
}

para subtrair se usa sub, no exemplo abaixo vai dar um valor negativo pq subtraiu o valor do ebx por eax, 15 - 300 (sub %%eax,%%ebx)

Código:
#include <stdio.h>

int main(void)
{
  int x;

  asm("mov $300,%%eax ;"
      "mov $15,%%ebx ;"
     "sub %%eax,%%ebx"
      :"=b"(x));
    
  printf("%d",x);
}

mais tarde eu faço a segunda parte desse tutorial ^^

by hacker fts315



[center][Você precisa estar registrado e conectado para ver esta imagem.]


Contato:
Facebook: /hacker.fts315
Ask: /hfts315
Ver perfil do usuário http://www.facebook.com/hacker.fts315

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo  Mensagem [Página 1 de 1]

Permissão deste fórum:
Você não pode responder aos tópicos neste fórum