首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >内联汇编程序:传递一个常量

内联汇编程序:传递一个常量
EN

Stack Overflow用户
提问于 2016-02-10 20:21:32
回答 2查看 3.4K关注 0票数 2

我有以下问题:我希望使用内联汇编程序使用C源文件中的以下汇编程序代码:

代码语言:javascript
运行
复制
.word 1

我得到的最接近的是使用这个内联汇编程序代码:

代码语言:javascript
运行
复制
asm(".word %0\n": : "i"(1));

但是,这会在生成的汇编程序文件中生成以下代码:

代码语言:javascript
运行
复制
.word #1

因此,我需要一种方法来传递一个在编译时已知的常量,而不需要在它前面添加'#‘。这有可能使用内联汇编程序吗?

编辑:

为了更清楚地说明我为什么需要这样做,我们将这样使用它:

代码语言:javascript
运行
复制
#define LABELS_PUT(b) asm(".word %0\n": : "i"((b)));

int func(void) {
    LABELS_PUT(1 + 2);

    return 0;
}

我不能使用".word 1“,因为每次调用宏LABELS_PUT时,值都会有所不同。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-10 20:42:04

宏的末尾有一个;。所以这是一个完整的陈述,而不仅仅是一个表达。别干那事。

与函数的代码混合在一起的.word通常是非法的指令,不是吗?你真的打算运行这个二进制文件吗?

您应该能够将预处理器连接到调整宏参数,并让字符串连接起来。然后汇编程序可以对1+2进行评估。

代码语言:javascript
运行
复制
#define LABELS_PUT(b) asm(".word " #b  "\n")


LABELS_PUT(1+2);   // becomes:
asm(".word " "1+2" "\n");

还有https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#x86Operandmodifiers,其中一些可能适用于其他体系结构:

代码语言:javascript
运行
复制
asm (".word %c0" : : "i" (b))
票数 4
EN

Stack Overflow用户

发布于 2016-02-10 20:54:14

在GCC里,你可以这样做:

代码语言:javascript
运行
复制
asm __volatile__ (".word 0x1");

如果使用的是,则可以尝试:

代码语言:javascript
运行
复制
some_word: _asm{_emit 1000b}

它将传递到代码word常量1000 b。

您可以使用标签some_word访问

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35325139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档