1 assembly em c - 1º parte Sáb Abr 20, 2013 6:41 pm
Moedas : 201
Mensagens : 92
Humor : *-*
Reputação : 5
Mensagens : 92
Humor : *-*
Reputação : 5
hacker fts315
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
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
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)
se voce socar tuto na mesma linha possivelmete vai ficar inlegivel entao recomendo colocar cada comando em uma linha assim
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
veja outro exemplo com dois comandos
para usar codigos em hexadecimal se usa cifrao seguido do 0x e o numero por exemplo $0x13b q e igual a 315 em decimal
para mover uma valor de um registrador para outro basta colocar o registrado ao inves do valor
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
para deixar mais legivel recomendo colocar em outra linha
quando sao dois registradores q vao ser armazenado em uma variavel basta colocar uma virgula
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
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)
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)
mais tarde eu faço a segunda parte desse tutorial ^^
by hacker fts315
- 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