在 C 函数调用之前在内联汇编中推送额外的参数是否以任何方式(跨编译器、平台、libc 实现等)安全或可移植?

2023-12-08

我写了一个函数来漂亮地打印数独,当然这个模式可以通过一些循环生成,但我不想经历麻烦,所以这就是我想出的(前 5 个格式说明符只是 printf 的参数)本身被推入堆栈,并且在回车后将被覆盖)。

虽然“它可以在我的机器上运行”,但我想知道这是否可以或可以移植到跨架构、编译器、libc 实现等工作?

当然,根据目标平台,汇编代码可能需要进行一些调整,并且 printf 推送的参数数量取决于当前的 libc 实现。

#define PUSH(x) asm volatile ("push %0" : : "m"(x) :)
#define POP() asm volatile ("pop %%rax" : : : "rax")

void print(void) {
    for (uint8_t i = 1; i <= (9 * 9); ++i) {
        PUSH(sudoku[(9 * 9) - i]);
    }

    printf("%hhd%hhd%hhd%hhd%hhd\r╔═════════╦═════════╦═════════╗\n"
           "║ %hhd  %hhd  %hhd ║ %hhd  %hhd  %hhd ║ %hhd  %hhd  %hhd ║\n"
           "║ %hhd  %hhd  %hhd ║ %hhd  %hhd  %hhd ║ %hhd  %hhd  %hhd ║\n"
           "║ %hhd  %hhd  %hhd ║ %hhd  %hhd  %hhd ║ %hhd  %hhd  %hhd ║\n"
           "╠═════════╬═════════╬═════════╣\n"
           "║ %hhd  %hhd  %hhd ║ %hhd  %hhd  %hhd ║ %hhd  %hhd  %hhd ║\n"
           "║ %hhd  %hhd  %hhd ║ %hhd  %hhd  %hhd ║ %hhd  %hhd  %hhd ║\n"
           "║ %hhd  %hhd  %hhd ║ %hhd  %hhd  %hhd ║ %hhd  %hhd  %hhd ║\n"
           "╠═════════╬═════════╬═════════╣\n"
           "║ %hhd  %hhd  %hhd ║ %hhd  %hhd  %hhd ║ %hhd  %hhd  %hhd ║\n"
           "║ %hhd  %hhd  %hhd ║ %hhd  %hhd  %hhd ║ %hhd  %hhd  %hhd ║\n"
           "║ %hhd  %hhd  %hhd ║ %hhd  %hhd  %hhd ║ %hhd  %hhd  %hhd ║\n"
           "╚═════════╩═════════╩═════════╝\n");

    for (uint8_t i = 0; i < (9 * 9); ++i) {
        POP();
    }
}

No.

没有定义内联汇编语义的 C 标准,因此不同的编译器可以并且确实以不同的方式处理它。这可能会导致代码在不同的编译器下编译时不会出现错误,但会产生略有不同的结果。

https://gcc.gnu.org/wiki/DontUseInlineAsm

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C 函数调用之前在内联汇编中推送额外的参数是否以任何方式(跨编译器、平台、libc 实现等)安全或可移植? 的相关文章

  • 简单的 C++ 线程

    我正在尝试在 C Win32 中创建一个线程来运行一个简单的方法 我是 C 线程的新手 但对 C 中的线程非常熟悉 这是我想做的一些伪代码 static void MyMethod int data RunStuff data void R
  • 如何在C编程中获取当前时间(以毫秒为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 ANSI C 测量以毫秒为单位的时间 https stackoverflow com questions 361363 how to measure time in milliseconds
  • 对相当大的整数的大集合的操作的快速实现

    描述 我实现了以下类 LabSetInt64 参见下面的代码 这里的目标是尽可能快地操作大量大整数 最多 10M 的值 我的主要要求集中在 至关重要 尽快获取集合的大小 基数 重要 能够非常快速地迭代一组集合 所以 从下面的实现开始 我还有
  • 函数原型和数组参数

    我正在学习 C 语法 并且已经开始研究数组了 我想问你一个问题 但首先让我回顾一下 这样我就知道我已经弄清楚了 我知道您可以使用以下语法将变量定义为数组 name
  • 使用 boost::iterator_facade<>

    我有一个链表结构 struct SomeLinkedList const char bar int lots of interesting stuff in here DWORD foo SomeLinkedList pNext 它是现有
  • ResourceDictionary 源中的 Uri 语法(通用 Windows 平台)

    我正在迁移我的Windows 8 1项目到Windows 10 通用 Windows 平台 这时我被拦住了ResourceDictionary改变在UWP 为了简单起见 我有包含 2 个项目的 Windows 8 1 解决方案 App pr
  • 整数与双精度算术性能?

    我正在编写一个 C 类来使用整数执行 2D 可分离卷积 以获得比双对应更好的性能 问题是我没有获得真正的性能提升 这是 X 过滤器代码 对于 int 和 double 情况都有效 foreach pixel int value 0 for
  • 为什么测试在 TeamCity 中运行比直接在 NUnit 中运行需要更长的时间?

    我进行了一些 C 性能测试 基本上运行两种不同的方法 并检查一种方法的运行速度是否比另一种方法快得多 当我在 NUnit 本地运行它们时 其中一个测试的运行速度是另一个测试的十倍 因此我有一个 NUnit 测试 它使用Stopwatch检查
  • 为什么Boost在“程序选项”中使用全局函数覆盖来实现自定义验证器

    这个例子 http www boost org doc libs 1 55 0 doc html program options howto html idp163429032显示一个名为validate在全局范围内定义重载函数boost
  • 使用 MapViewOfFile 有什么限制吗?

    我正在尝试将内存映射文件用作 hFile CreateFile State Path GENERIC READ FILE SHARE READ FILE SHARE WRITE 0 OPEN EXISTING FILE FLAG SEQUE
  • 最小对的总和

    Given 2N点 in a 2D plane 你必须将它们分组为N pairs使得所有对的点之间的距离的总和是最小可能值 所需的输出只是总和 换句话说 如果a1 a2 an分别是第一对 第二对 和第 n 对点之间的距离 则 a1 a2 a
  • DLL 中的 XP 风格组合框

    我需要使用 C 和 WIN32 API 无 MFC 在 DLL 中创建 XP 风格的组合框 我设法在 DLL 中创建控件 不是以 XP 风格 我设法在带有清单的 exe 中创建 XP 样式组合框 但它在 DLL 中不起作用 为了让您的 DL
  • MPI_Gatherv:根数组中收到的垃圾值

    我正在尝试实施MPI Gatherv函数于C 根据我的程序 包括 root 在内的每个进程都应该创建一个大小等于 进程的等级 1 这将在所有单元格中保持进程的等级 然后这个本地数组被收集到根的 rcv array 中 不知何故 我得到了垃圾
  • 如何从句柄确定进程是 32 位还是 64 位?

    如何从使用 OpenProcess 获取的进程句柄中获取信息 无论进程是 32 位还是 64 位 是的 IsWow64Process 毫无用处 令人烦恼 它的真正意思是 启用了 32 位模拟 如果您在 32 位操作系统上运行 则返回 fal
  • 将函数作为函数参数传递

    Unity C 似乎无法识别Func lt gt 作为函数委托的符号 那么 如何将函数作为函数参数传递呢 我有一个想法Invoke functionName 0 可能有帮助 但我不确定它是否实际上立即调用该函数 或者等待帧结束 还有别的办法
  • 使用std::begin()、std::end()将ArrayXd转换为stl向量,

    在我看来我应该能够使用std begin and std end 转换ArrayXd to std vector
  • C# 记录类型:记录子类之间的相等比较

    给定父记录类型 public record Foo string Value 和两个记录子类Bar and Bee我想知道是否可以实施Equals在基类中 因此 Foo Bar 或 Bee 的实例都被考虑equal基于Value 两者都与E
  • RabbitMQ + Windows + LDAP 无需发送密码

    我正在尝试在 Windows 7 上使用 RabbitMQ 3 6 2 进行 LDAP 身份验证 授权 我已经在应用程序发送用户名 密码的情况下进行了基本身份验证 但密码位于我需要弄清楚如何进行的代码中避免 有没有人在不提供密码的情况下成功
  • 即使对于新上下文,OnModelCreating 也仅调用一次

    我有多个相同但内容不同的 SQL Server 表 在编写代码优先 EF6 程序时 我尝试为每个程序重用相同的数据库上下文 并将表名称传递给上下文构造函数 然而 虽然每次都会调用构造函数 但尽管每次都是从 new 创建数据库上下文 但 On
  • 通过 OCI 调用 Oracle 存储过程并使用 C++ 中的 out ref 游标返回结果

    我想使用 OCI 接口从 C 调用 Oracle 存储过程 并使用 out SYS REF CURSOR 作为过程的参数来迭代结果 我是 OCI 新手 所以可能会遗漏一些简单的东西 大部分代码取自这里 我的存储过程是 CREATE OR R

随机推荐