Ir para conteúdo

Duvida variaveis disassembly


Naelson Goncalves Saraiva

Posts Recomendados

#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?

Link para o comentário
Compartilhar em outros 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)

Link para o comentário
Compartilhar em outros 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. ?

 

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

  • Quem Está Navegando   0 membros estão online

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