Exemplo de execução de arquivo C a partir da linha de comando

Primeiro escreva um arquivo de código de linguagem C mstore.c da seguinte maneira:

#include <stdio.h>

long mult2(long, long);

void multstore(long x, long y, long *dest) {
    
    
    long t = mult2(x, y);
    *dest = t;
}

Use a opção "-S" na linha de comando para ver o código de montagem gerado pelo compilador da linguagem C:

PS E:\VS Code\VS Code C\chapter 3> gcc -S mstore.c

Isso fará com que o GCC execute o compilador e gere um arquivo de montagem mstore.s, mas não realiza nenhum trabalho adicional. (Normalmente, ele continuará a chamar o montador para gerar arquivos de código-objeto).

	.file	"mstore.c"
	.text
	.globl	multstore
	.def	multstore;	.scl	2;	.type	32;	.endef
	.seh_proc	multstore
multstore:
	pushq	%rbx
	.seh_pushreg	%rbx
	subq	$32, %rsp
	.seh_stackalloc	32
	.seh_endprologue
	movq	%r8, %rbx
	call	mult2
	movl	%eax, (%rbx)
	addq	$32, %rsp
	popq	%rbx
	ret
	.seh_endproc
	.ident	"GCC: (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0"
	.def	mult2;	.scl	2;	.type	32;	.endef

Se você continuar a usar a opção de linha de comando "-C", o GCC irá compilar e montar o código:

PS E:\VS Code\VS Code C\chapter 3> gcc -c mstore.c

Isso irá gerar o arquivo de código do objeto mstore.o, que está em formato binário, portanto, não pode ser visualizado diretamente.
Para visualizar o conteúdo de um arquivo de código de máquina, existe um programa chamado desmontador que é muito útil. Esses programas geram um formato semelhante ao assembly baseado em código de máquina. O programa OBJDUMP (object dump) com a sinalização de linha de comando "-d" pode desempenhar esta função:

PS E:\VS Code\VS Code C\chapter 3> objdump -d mstore.o

O resultado é o seguinte: Para
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
gerar o código executável real, o vinculador deve ser executado em um grupo de arquivos de código de objeto e esse grupo de arquivos de código de objeto deve conter uma função principal. Suponha que haja a seguinte função no arquivo main.c:

#include <stdio.h>

void multstore(long, long, long *);

int main() {
    
    
    long d;
    multstore(2, 3, &d);
    printf("2 * 3 --> %ld\n", d);
    return 0;
}

long mult2(long a, long b) {
    
    
    long s = a * b;
    return s;
}

Em seguida, use o seguinte método para gerar o arquivo executável prog:

PS E:\VS Code\VS Code C\chapter 3> gcc -o prog main.c mstore.c

Por exemplo, o
Insira a descrição da imagem aqui
arquivo prog não contém apenas o código dos dois processos, mas também contém o código usado para iniciar e encerrar o programa, bem como o código usado para interagir com o sistema operacional. Também podemos desmontar o arquivo prog:

PS E:\VS Code\VS Code C\chapter 3> objdump -d prog.exe

Neste ponto, você pode executar o arquivo prog gerado: verifica-
Insira a descrição da imagem aqui
se que os resultados da execução do programa dos dois arquivos C estão de acordo com as expectativas.
No arquivo mstore.s gerado:
todas as .linhas que começam com ' ' são diretivas para instruir o montador e o vinculador a trabalhar, geralmente podemos ignorar essas linhas. Se removê-los, o código de montagem com explicação é o seguinte:
Observe que o seguinte é o arquivo mstore.s no ambiente Linux
Insira a descrição da imagem aqui

multstore:
	pushq	%rbx
	subq	$32, %rsp
	movq	%r8, %rbx
	call	mult2
	movl	%eax, (%rbx)
	addq	$32, %rsp
	popq	%rbx
	ret

Acho que você gosta

Origin blog.csdn.net/qq_45349225/article/details/115015492
Recomendado
Clasificación