SpaceHoll0w Posted January 22, 2022 at 06:29 PM Share Posted January 22, 2022 at 06:29 PM 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) Quote Link to comment Share on other sites More sharing options...
Felipe.Silva Posted January 25, 2022 at 04:16 AM Share Posted January 25, 2022 at 04:16 AM 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 Quote Link to comment Share on other sites More sharing options...
SpaceHoll0w Posted January 25, 2022 at 06:35 PM Author Share Posted January 25, 2022 at 06:35 PM 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. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.