Naelson Goncalves Saraiva Posted May 9, 2018 at 03:32 AM Share Posted May 9, 2018 at 03:32 AM #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 to comment Share on other sites More sharing options...
Felipe.Silva Posted May 9, 2018 at 05:15 AM Share Posted May 9, 2018 at 05:15 AM 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: 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: 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 to comment Share on other sites More sharing options...
Fernando Mercês Posted May 9, 2018 at 10:24 AM Share Posted May 9, 2018 at 10:24 AM 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 to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.