gpt4 book ai didi

linux - Hello World 程序 Nasm 汇编和 C 的执行指令数不同

转载 作者:行者123 更新时间:2023-11-30 16:42:03 28 4
gpt4 key购买 nike

我有一个简单的调试器(使用 ptrace : http://pastebin.com/D0um3bUi )来计算给定输入可执行程序执行的指令数。它使用ptrace单步执行模式来计数指令。

因此,当程序 1) 的可执行文件(a.out from gcc main.c)作为我的测试调试器的输入给出时,它会在执行指令时打印大约 100k。当我使用 -static 选项时,它给出 10681 条指令。

现在,在 2) 中,我创建一个汇编程序并使用 NASM 进行编译和链接,然后当将此可执行文件作为测试调试器输入给出时,它会显示 8 条指令作为计数,这是 apt 的。

程序 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

最佳答案

The number of instructions executed in program 1) is high because of linking the program with system library's at runtime?

是的,动态链接加上 CRT(C 运行时)启动文件。

used -static and which reduces the count by a factor of 1/10.

这样就剩下了 CRT 启动文件,它们在调用 main 之前和之后执行一些操作。

How can I ensure that the instruction count is only that of the main function in Program 1)`

测量一个空的main,然后从 future 的测量中减去该数字。

除非您的指令计数器更智能,并且会查看其跟踪的进程的可执行文件中的符号,否则它将无法判断哪些代码来自何处。

and which is how Program 2) is reporting for the debugger.

那是因为该程序中没有其他代码。这并不是说您以某种方式帮助调试器忽略了某些指令,而是您编写了一个没有任何指令的程序,这些指令不是您自己放置的。

如果您想查看运行 gcc 输出时实际发生的情况,gdb a.outb _start r,以及单步。一旦你深入调用树,你就有可能了。想要使用 fin 来完成当前函数的执行,因为您不想单步执行 100 万条指令,甚至 10k 条指令。

<小时/>

相关:How do I determine the number of x86 machine instructions executed in a C program?显示 perf stat 将计算 NASM 程序中总共 3 个用户空间指令,该程序执行 mov eax, 231/syscall,链接到静态可执行文件.

关于linux - Hello World 程序 Nasm 汇编和 C 的执行指令数不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46044455/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com