Anzahl der ausgeführten Anweisungen für das Hello World-Programm Nasm Assembly und C
Ich habe einen einfachen Debugger (mit ptrace:http: //pastebin.com/D0um3bU), um die Anzahl der Anweisungen zu zählen, die für ein bestimmtes ausführbares Eingabeprogramm ausgeführt wurden. Es verwendet den Einzelschritt-Ausführungsmodus ptrace, um Anweisungen zu zählen.
Wenn die ausführbare Datei von Programm 1 (a.out from gcc main.c) als Eingabe für meinen Test-Debugger angegeben wird, werden ungefähr 100 KB als ausgeführte Anweisungen ausgegeben. Wenn ich @ benut-static
Option gibt es 10681 Anweisungen.
Nun in 2) Ich erstelle ein Assembler-Programm und verwende NASM zum Kompilieren und Verknüpfen. Wenn diese ausführbare Datei als Test-Debugger-Eingabe angegeben wird, werden 8 Anweisungen als Anzahl angezeig
Die Anzahl der in Programm 1) ausgeführten Anweisungen ist hoch, da das Programm zur Laufzeit mit Systembibliotheken verknüpft wird. verwendet -static und reduziert die Anzahl um einen Faktor von 1/10. Wie kann ich sicherstellen, dass die Anweisungsanzahl nur die der Hauptfunktion in Programm 1) ist und wie meldet sich Programm 2) für den Debugger?
1)
#include <stdio.h>
int main()
{
printf("Hello, world!\n");
return 0;
}
Ich benutze gcc, um die ausführbare Datei zu erstellen.
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