gpt4 book ai didi

c - C 语言 hello world 程序的汇编代码

转载 作者:行者123 更新时间:2023-11-30 20:59:12 24 4
gpt4 key购买 nike

以下是 hello world 程序的示例代码:

#include <stdio.h>


int main(void)
{
printf("Hello, world!\n");
return 0;
}

这是我得到的目标文件的反汇编:

File Type: COFF OBJECT

main:
0000000000000000: 48 83 EC 28 sub rsp,28h
0000000000000016: C3 ret

__local_stdio_printf_options:
0000000000000000: 48 8D 05 00 00 00 lea rax,[?_OptionsStorage@?1??__local_stdio_printf_options@@9@9]
00
0000000000000007: C3 ret

_vfprintf_l:
0000000000000000: 4C 89 4C 24 20 mov qword ptr [rsp+20h],r9
0000000000000014: 48 83 EC 38 sub rsp,38h
0000000000000018: E8 00 00 00 00 call __local_stdio_printf_options
0000000000000039: E8 00 00 00 00 call __stdio_common_vfprintf
000000000000003E: 48 83 C4 38 add rsp,38h
0000000000000042: C3 ret

printf:
0000000000000000: 48 89 4C 24 08 mov qword ptr [rsp+8],rcx
0000000000000027: E8 00 00 00 00 call __acrt_iob_func
000000000000002C: 4C 8B 4C 24 28 mov r9,qword ptr [rsp+28h]
000000000000003C: E8 00 00 00 00 call _vfprintf_l
0000000000000041: 89 44 24 20 mov dword ptr [rsp+20h],eax
000000000000004E: 8B 44 24 20 mov eax,dword ptr [rsp+20h]
0000000000000056: C3 ret

printf函数中,我们还有两个函数调用:__acrt_iob_func_vfprintf_l

  1. 第一个函数到底是做什么的?

  2. 我们如何在目标文件中拥有 _vprintf_l 函数?

如果有详细的解释,我们将不胜感激。

编译: cl/TC main.cpp

反汇编为: dumpbin/disasm main.obj

PS:我删除了部分汇编代码,以便我可以发布问题。

最佳答案

VS2015 及更高版本现在在头文件中包含 printf 的部分代码(以前它只是一个基于库的函数)。对于 C/C++,这不是问题,但就我而言,对于仅汇编项目,我现在在调用 printf 的项目中包含一个小的 C 源文件,该文件生成所需的代码,以便汇编代码可以调用 printf没有与 header 包含的代码相关的所有其他内容。

What exactly does the first function do?

__local_stdio_printf_options 返回一个指向静态整数的指针,该指针用作 __stdio_common_vfprintf 的输入。

How do we have the _vprintf_l function in the object file?

这是因为部分 printf 代码现在包含在头文件中,而以前所有 printf 都包含在标准 C 库中。

这是当前 printf 本地实例所包含内容的片段。我没有推断这两个定义,但最终结果可以在下面的汇编代码中看到。

__inline unsigned __int64* __CRTDECL __local_stdio_printf_options(void)
{
static unsigned __int64 _OptionsStorage;
return &_OptionsStorage;
}

#define _CRT_INTERNAL_LOCAL_PRINTF_OPTIONS (*__local_stdio_printf_options())

_CRT_STDIO_INLINE int __CRTDECL _vfprintf_l(
_Inout_ FILE* const _Stream,
_In_z_ char const* const _Format,
_In_opt_ _locale_t const _Locale,
va_list _ArgList
)
{
return __stdio_common_vfprintf(_CRT_INTERNAL_LOCAL_PRINTF_OPTIONS, _Stream, _Format, _Locale, _ArgList);
}

_CRT_STDIO_INLINE int __CRTDECL printf(
_In_z_ _Printf_format_string_ char const* const _Format,
...)
{
int _Result;
va_list _ArgList;
__crt_va_start(_ArgList, _Format); /* this is a define */
_Result = _vfprintf_l(stdout, _Format, NULL, _ArgList);
__crt_va_end(_ArgList); /* this is a define */
return _Result;
}

这段 VS2015 的汇编输出片段让我们更清楚地了解了正在发生的事情。再次请记住,所有这些都是 printf 的内部内容,并且可能会随着 Visual Studio 的更高版本而改变。

CONST   SEGMENT
??_C@_0P@DOOKNNID@Hello?0?5world?$CB?6?$AA@ DB 'Hello, world!', 0aH, 00H
CONST ENDS

_TEXT SEGMENT
__local_stdio_printf_options PROC
lea rax, OFFSET FLAT:?_OptionsStorage@?1??__local_stdio_printf_options@@9@9 ;static variable
ret 0
__local_stdio_printf_options ENDP

_vfprintf_l PROC
; ...
call __local_stdio_printf_options ;local instance
; ...
call QWORD PTR __imp___stdio_common_vfprintf ;library function
; ...
ret 0
_vfprintf_l ENDP

printf PROC
; ...
call QWORD PTR __imp___acrt_iob_func ;library function
mov rbx, rax
call __local_stdio_printf_options ;local instance
; ...
call QWORD PTR __imp___stdio_common_vfprintf ;library function
ret 0
; ...
printf ENDP

main PROC
sub rsp, 40 ; 00000028H
lea rcx, OFFSET FLAT:??_C@_0P@DOOKNNID@Hello?0?5world?$CB?6?$AA@
call printf
xor eax, eax
add rsp, 40 ; 00000028H
ret 0
main ENDP
_TEXT ENDS

这是 VS 早期版本的汇编输出,其中 printf 只是一个库函数 (__imp_printf):

CONST   SEGMENT
??_C@_0P@DOOKNNID@Hello?0?5world?$CB?6?$AA@ DB 'Hello, world!', 0aH, 00H
CONST ENDS

_TEXT SEGMENT
main PROC
sub rsp, 40 ; 00000028H
lea rcx, OFFSET FLAT:??_C@_0P@DOOKNNID@Hello?0?5world?$CB?6?$AA@
call QWORD PTR __imp_printf
xor eax, eax
add rsp, 40 ; 00000028H
ret 0
main ENDP
_TEXT ENDS

关于c - C 语言 hello world 程序的汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47948234/

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