Número de instruções executadas diferentes para o programa Hello World Nasm Assembly e C
Eu tenho um depurador simples (usando ptrace:http://pastebin.com/D0um3bUi) para contar o número de instruções executadas para um determinado programa executável de entrada. Ele usa o modo de execução de etapa única ptrace para contar as instruções.
Para isso, quando o executável do programa 1) (a.out do gcc main.c) é fornecido como entrada para o meu depurador de teste, ele imprime cerca de 100k como instruções executadas. Quando eu uso-static
opção fornece 10681 instruções.
Agora em 2) eu crio um programa de montagem e uso o NASM para compilar e vincular e, quando esse executável é fornecido como entrada de depurador de teste, ele mostra 8 instruções como a contagem e qual é o apt.
O número de instruções executadas no programa 1) é alto devido à vinculação do programa às bibliotecas do sistema em tempo de execução? usado -estatic e que reduz a contagem em um fator de 1/10. Como posso garantir que a contagem de instruções seja apenas a função principal do Programa 1) e como é que o Programa 2) está relatando para o depurador?
1)
#include <stdio.h>
int main()
{
printf("Hello, world!\n");
return 0;
}
Eu uso o gcc para criar o executável.
2)
; 64-bit "Hello World!" in Linux NASM
global _start ; global entry point export for ld
section .text
_start:
; sys_write(stdout, message, length)
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
mov rsi, message ; message address
mov rdx, length ; message string length
syscall
; sys_exit(return_code)
mov rax, 60 ; sys_exit
mov rdi, 0 ; return 0 (success)
syscall
section .data
message: db 'Hello, world!',0x0A ; message and newline
length: equ $-message ; NASM definition pseudo-
Nasm -f elf64 -o main.o -s main.asm
ld -o main main.o