From e6fb258826ba01a0291969da0962e90df61335f5 Mon Sep 17 00:00:00 2001 From: Mole Shang <135e2@135e2.dev> Date: Mon, 31 Mar 2025 10:01:02 +0100 Subject: mingw-code-golfing-quirks: fix typo --- content/mingw-code-golfing-quirks/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'content/mingw-code-golfing-quirks') diff --git a/content/mingw-code-golfing-quirks/index.md b/content/mingw-code-golfing-quirks/index.md index 07ab6d4..464b767 100644 --- a/content/mingw-code-golfing-quirks/index.md +++ b/content/mingw-code-golfing-quirks/index.md @@ -63,8 +63,8 @@ GCC 文档如此解释 `no-builtin` 选项: ![asm diff](./asm_diff.png) -显然我们在没有函数签名定义的情况下,又开启了 `no-builtin` 选项,编译器因而无从获取 `printf` 的签名信息,只能从调用推断其签名为 `void printf(const char*, double)`,无法遵循正确的 `varargs` 调用规范设置通用寄存器 `$rdx`,导致 Windows 运行时标准库中的 `printf` 作为 callee 获取第二个参数时永远是全0(`$rdx` 原值);而一旦关闭这一选项,即使不写签名,编译器也能通过内建的函数匹配机制获得完整的 `printf` 签名信息(`int printf(const char*, ...)`),便能生成正确的汇编调用设置 `$rax`,结果也自然没有问题了。 +显然我们在没有函数签名定义的情况下,又开启了 `no-builtin` 选项,编译器因而无从获取 `printf` 的签名信息,只能从调用推断其签名为 `void printf(const char*, double)`,无法遵循正确的 `varargs` 调用规范设置通用寄存器 `$rdx`,导致 Windows 运行时标准库中的 `printf` 作为 callee 获取第二个参数时永远是全0(`$rdx` 原值);而一旦关闭这一选项,即使不写签名,编译器也能通过内建的函数匹配机制获得完整的 `printf` 签名信息(`int printf(const char*, ...)`),便能生成正确的汇编调用设置 `$rdx`,结果也自然没有问题了。 C,很奇妙吧。 xDDD -> Compiler Explorer 复现链接: https://godbolt.org/z/eh9WK9eqG \ No newline at end of file +> Compiler Explorer 复现链接: https://godbolt.org/z/eh9WK9eqG -- cgit v1.2.3