我写了一个函数来漂亮地打印数独,当然这个模式可以通过一些循环生成,但我不想经历麻烦,所以这就是我想出的(前 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(使用前将#替换为@)