c - #define 在 GCC 的内联汇编中
问题描述
我正在尝试在 GCC 中编写内联程序集,它将 #define 中的值写入寄存器。
#define SOME_VALUE 0xDEADBEEF
void foo(void)
{
__asm__("lis r5, SOME_VALUE@ha");
__asm__("ori r5, r5, SOME_VALUE@l");
}
但是,编译时出现错误:
对“SOME_VALUE”的未定义引用
汇编器有没有办法#define
在内联汇编中看到?
我通过执行以下操作解决了它:
#define SOME_VALUE 0xDEADBEEF
__asm__(".equ SOME_VALUE, 0xDEADBEEF");
void foo(void)
{
__asm__("lis r5, SOME_VALUE@ha");
__asm__("ori r5, r5, SOME_VALUE@l");
}
但是,我真的不想复制这个值。
解决方案
在 C 中使用一些预处理器魔法来对值和字符串延续进行字符串化:
#define SOME_VALUE 0xDEADBEEF
#define STR(x) #x
#define XSTR(s) STR(s)
void foo(void)
{
__asm__("lis r5, " XSTR(SOME_VALUE) "@ha");
__asm__("ori r5, r5, " XSTR(SOME_VALUE) "@l");
}
XSTR
将扩展为 string "0xDEADBEEF"
,它将与周围的字符串连接起来。
推荐阅读
- node.js - 尝试将文件夹挂载到 docker 容器中时出错
- amazon-web-services - 通过 CloudFront 通过签名 URL 上传到 S3?
- android - 乔达时间间隔
- apache-spark - spark是否优化了pyspark中相同但独立的DAG?
- python-2.7 - Jenkins发布构建python脚本文件
- .net - EF6 app.config 完整配置选项参考
- android - 如何检查屏幕是否有孔/切口?
- c# - 我添加了这样的工作:但是为什么我会重复 childJob?
- typescript - 如何在推断值时约束 TypeScript 对象的键?
- python - 跨数据框行生成成对累积统计数据