Ir para conteúdo
Entre para seguir isso  
Eduardo Bittencourt

Código em ASM com gcc

Posts Recomendados

Bom,  resolvi postar essa dica simples, acho que a maioria aqui conheça, porém deve ter um ou dois que não conheça, enfim. Para gerar código em asm através do gcc usamos a seguinte linha de comando

Para 64 bits

$ gcc -S masm=intel programa.c

Caso queira em 32 bits

$ gcc -S masm=intel -m32 programa.c

 

A linhas masm=intel, significa, usar o masm com syntax intel. Um ponto interessante é que com esta técnica, você pode ver as seções de memória do código, e muito outras coisas, claro que são coisas simples. Se realmente prefere desassemblar é recomendável usar o objdump, ou gdb, entre outros

 

#include <stdio.h>

long x = 5;

int main(void)
{
     char *cons = "teste";

     return 0;

}

 

Compilei em 64 bits e em 32 bits, e teve diferenças no código, repare;

Output em 64 bits

$cat teste.s

 

	.file	"teste.c"
	.intel_syntax noprefix
	.globl	x;                                 ;variável x é global
	.data
	.align 8
	.type	x, @object
	.size	x, 8;                              ;tamanho de 8 byte
x:
	.quad	5
	.section	.rodata 
.LC0:
	.string	"teste"                      ;essa string é da seção .rodata
	.text
	.globl	main                          ;função main é global,  oh não diga
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	push	rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	mov	rbp, rsp
	.cfi_def_cfa_register 6
	lea	rax, .LC0[rip]
	mov	QWORD PTR -8[rbp], rax
	mov	eax, 0
	pop	rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (Debian 6.3.0-18) 6.3.0 20170516"
	.section	.note.GNU-stack,"",@progbits

 

Output em 32 bits

$cat teste.s

 

	.file	"teste.c"
	.intel_syntax noprefix
	.globl	x                                  ; variável global
	.data
	.align 4
	.type	x, @object
	.size	x, 4                             ; tamanho de 4 byte
x:
	.long	5
	.section	.rodata
.LC0:
	.string	"teste"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	push	ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	mov	ebp, esp
	.cfi_def_cfa_register 5
	sub	esp, 16
	call	__x86.get_pc_thunk.ax
	add	eax, OFFSET FLAT:_GLOBAL_OFFSET_TABLE_
	lea	eax, .LC0@GOTOFF[eax]
	mov	DWORD PTR -4[ebp], eax
	mov	eax, 0
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.section	.text.__x86.get_pc_thunk.ax,"axG",@progbits,__x86.get_pc_thunk.ax,comdat
	.globl	__x86.get_pc_thunk.ax
	.hidden	__x86.get_pc_thunk.ax
	.type	__x86.get_pc_thunk.ax, @function
__x86.get_pc_thunk.ax:
.LFB1:
	.cfi_startproc
	mov	eax, DWORD PTR [esp]
	ret
	.cfi_endproc
.LFE1:
	.ident	"GCC: (Debian 6.3.0-18) 6.3.0 20170516"
	.section	.note.GNU-stack,"",@progbits

 

Editado por Eduardo Bittencourt

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

Entre para seguir isso  

×