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
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
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-
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
multstore:
pushq %rbx
subq $32, %rsp
movq %r8, %rbx
call mult2
movl %eax, (%rbx)
addq $32, %rsp
popq %rbx
ret