Количество выполненных Инструкций отличается для программы Hello World Nasm Assembly и C
У меня есть простой отладчик (с помощью ptrace:http://pastebin.com/D0um3bUi) подсчитать количество инструкций, выполненных для заданной входной исполняемой программы. Для подсчета команд используется одноступенчатый режим выполнения ptrace.
Для этого, когда исполняемый файл программы 1) (a.out из gcc main.c) указан в качестве входных данных для моего тестового отладчика, он печатает около 100 тыс. В виде выполненных инструкций. Когда я использую-static
Опция дает 10681 инструкцию.
Теперь в 2) я создаю программу сборки и использую NASM для компиляции и компоновки, а затем, когда этот исполняемый файл задан в качестве входных данных для отладчиков теста, он показывает 8 команд в качестве числа и является подходящим.
Количество инструкций, выполненных в программе 1), велико из-за связи программы с системной библиотекой во время выполнения? используется -static и который уменьшает счет в 1/10. Как я могу убедиться, что счетчик команд соответствует только основной функции в Программе 1) и как Программа 2) сообщает отладчику?
1)
#include <stdio.h>
int main()
{
printf("Hello, world!\n");
return 0;
}
Я использую gcc для создания исполняемого файла.
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