Jump to content
Sign in to follow this  
Naelson Goncalves Saraiva

Duvida variaveis disassembly

Recommended Posts

#include <iostream>
#include <string>
#include <string.h>

using namespace std;

void function(){
	int x = 50;
	char noName[] = {"BlaBlaBla"};
	
	if(x > 0){
		x = 6;
      
		switch(x){
		case 6:
			const int sizeCaracter = strlen(noName);
			
			for(int i = 0;i<sizeCaracter;i++)
			cout<<noName[i]<<endl;
			break;
  	   }
   }	
}
int main() {
	
    function();
	getchar();
	return 0;
}
public _Z8functionv
_Z8functionv proc near

var_20= qword ptr -20h
var_18= word ptr -18h
var_C= dword ptr -0Ch
var_8= dword ptr -8
var_4= dword ptr -4

push    rbp
mov     rbp, rsp
sub     rsp, 40h
mov     [rbp+var_8], 32h
mov     rax, 6C426C6142616C42h
mov     [rbp+var_20], rax
mov     [rbp+var_18], 61h
cmp     [rbp+var_8], 0
jle     short loc_4015B9

Bom acho que forum deveria ter uma área de duvidas para não misturar com a área respondida, mas vou deixa mais esta duvida que tive. 

Quando arrastei primeiro exe para  debugger a quantidade de variáveis era a mesma, mas quando se cria vetores  por que apareceu tantas, 4 só do mesmo tipo são 4 dword por que?

Edited by Naelson Goncalves Saraiva

Share this post


Link to post
Share on other sites

Certo, variável é um conceito abstrato. Não existe "de verdade". Após o código ser compilado tudo o que existe é memória.

E o que é um vetor? Simplesmente uma sequência de valores de mesmo tipo.
Qual a diferença entre três inteiros e um vetor de inteiros com 3 de tamanho? Após compilado, nenhuma.

O software que criou esses rótulos simplesmente deu nome a referências de memória na pilha. Que podem ou não serem variáveis separadas.
Ele não é mágico, não tem como adivinhar esse tipo de coisa. Só pode ler o código e presumir informações.
Entenda que nenhuma dessas informações ficam salvas no executável, todas elas são geradas a partir da análise do código.

 

Para você ver porque o software não conseguiu diferenciar uma array de variáveis separadas. Veja esse código:
 

#include <stdio.h>

int main(){
    int x[3];

    x[0] = 5;
    x[1]  = 7;
    x[2] = 25;

    return 0;
}

O código acima compilado:
1881808487_Capturadetelade2018-05-0902-04-18.png.7076bd4170159cb7145a88fd60b5b7d3.png

 

Agora veja este código:
 

#include <stdio.h>

int main(){
    int x, y, z;

    x = 5;
    y = 7;
    z = 25;

    return 0;
}

Agora ele compilado:
2124771472_Capturadetelade2018-05-0902-05-12.png.a652ed33c4fef5b9b778df9a0655b7ee.png

 

Parece simplesmente idêntico, mas há uma diferença. Que é a ordem dos endereços relativos.
Se eu tivesse definido os valores das variáveis x, y e z na ordem inversa então o código estaria idêntico.

Só para fins de informação, eu não fiz o disassembly do código. Usei a opção -S do GCC que faz com que o código apenas seja compilado, sem que haja o processo de montagem e linkagem.
 

$ gcc tst.c -o tst.s -S -masm=intel

A opção -masm é só para especificar a sintaxe, no caso a Intel que é a que você está acostumado. (e não tenho certeza se conhece a da AT&T)

  • Curtir 1

Share this post


Link to post
Share on other sites

Salve!

O texto foi compilado como parte do código (seção .text), vide o mov rax, 6C426C 6142616C42h. São 9 caracteres + o null byte, por isso o compilador utilizou duas variáveis:

  • Uma QWORD (8 bytes) identificada como var_20.
  • Uma WORD (2 bytes) identificada como var_18 (extamente 20 - 8, em hexa).

A var_8 é sua int x.

Precisaria postar o resto do dissassembly pra ver onde a var_C e var_4 são usadas, mas não tem segredo e, se for um erro, como falei antes, cabe a nós corrigirmos. Não tem mágica como sabiamente o @Felipe.Silva falou. 😉

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...