Jump to content

Ajuda com um Codigo GNU ASM!

Featured Replies

Posted

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)

estranho..PNG

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

  • Author
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.

Archived

This topic is now archived and is closed to further replies.

Recently Browsing 0

  • No registered users viewing this page.