SpaceHoll0w Postado Janeiro 22, 2022 em 18:29 Compartilhar Postado Janeiro 22, 2022 em 18:29 estou tentando entender o Int main(){ return 0; } mas em assembly, criando um arquivo .s, alguém poderia me ajudar a entender oque seria o ".LC0:", oque ele faz, e me ajudar com um material que explique (preferencia pt-br) Citar Link para o comentário Compartilhar em outros sites More sharing options...
Felipe.Silva Postado Janeiro 25, 2022 em 04:16 Compartilhar Postado Janeiro 25, 2022 em 04:16 Isso é só um rótulo (label) e não faz absolutamente nada. A sintaxe para declarar um rótulo é igual a sintaxe da linguagem C, colocando o nome do rótulo seguido de dois-pontos. Um rótulo é meramente um "nome" que pode ser usado para obter o endereço de memória do byte que está logo em seguida onde o rótulo foi declarado. Repare nesse código aí: .LC0: .string "ola" Logo após a declaração do rótulo há uma pseudo-instrução .string que recebe uma expressão de string como parâmetro. O que ela faz é simplesmente despejar os bytes da string aonde foi invocada. Portanto o rótulo .LC0 é um "nome" para o endereço da string "ola". Repare que no finalzinho do print esse rótulo é utilizado (na penúltima instrução): call __x86.get_pc_thunk.ax addl $_GLOBAL_OFFSET_TABLE, %eax subl $12, %esp leal .LC0@GOTOFF(%eax), %edx pushl %edx Esse call na primeira instrução é um "truque" que o GCC faz para obter endereços relativos. Para entender isso sugiro que leia isso aqui. A instrução leal (penúltima) é usada para obter o endereço daquela string e armazenar no registrador EDX, logo em seguida esse endereço é empilhado. --- O próprio Mente Binária tem um livro de Assembly que explica algumas coisas à respeito. O capítulo "Programando junto com C" será especialmente útil para você pois ele lida com o GAS e explica como código C funciona após compilado (em Assembly): https://mentebinaria.gitbook.io/assembly/programando-junto-com-c Citar Link para o comentário Compartilhar em outros sites More sharing options...
SpaceHoll0w Postado Janeiro 25, 2022 em 18:35 Autor Compartilhar Postado Janeiro 25, 2022 em 18:35 14 horas atrás, Felipe.Silva disse: Isso é só um rótulo (label) e não faz absolutamente nada. A sintaxe para declarar um rótulo é igual a sintaxe da linguagem C, colocando o nome do rótulo seguido de dois-pontos. Um rótulo é meramente um "nome" que pode ser usado para obter o endereço de memória do byte que está logo em seguida onde o rótulo foi declarado. Repare nesse código aí: .LC0: .string "ola" Logo após a declaração do rótulo há uma pseudo-instrução .string que recebe uma expressão de string como parâmetro. O que ela faz é simplesmente despejar os bytes da string aonde foi invocada. Portanto o rótulo .LC0 é um "nome" para o endereço da string "ola". Repare que no finalzinho do print esse rótulo é utilizado (na penúltima instrução): call __x86.get_pc_thunk.ax addl $_GLOBAL_OFFSET_TABLE, %eax subl $12, %esp leal .LC0@GOTOFF(%eax), %edx pushl %edx Esse call na primeira instrução é um "truque" que o GCC faz para obter endereços relativos. Para entender isso sugiro que leia isso aqui. A instrução leal (penúltima) é usada para obter o endereço daquela string e armazenar no registrador EDX, logo em seguida esse endereço é empilhado. --- O próprio Mente Binária tem um livro de Assembly que explica algumas coisas à respeito. O capítulo "Programando junto com C" será especialmente útil para você pois ele lida com o GAS e explica como código C funciona após compilado (em Assembly): https://mentebinaria.gitbook.io/assembly/programando-junto-com-c vlw amigo! agora só falta entender uma outra parte do codigo. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.