我怎样才能在__asm__中使用int?

时间:2018-03-02 21:56:30

标签: c assembly

我想在c中使用char变量并将其添加到汇编代码中。

char c = 'X';
__asm__ __volatile__("movb '"c"', %ah\n");

但是当我使用它时,它表示字符串文字是预期的。我该如何施展它? 此外,我使用此代码来创建自己的操作系统,因此没有标准库。

1 个答案:

答案 0 :(得分:1)

您的内联汇编程序行有两个问题:

1)您正在使用AT& T语法。在AT& T语法中,常量值使用$

mov $'c', %ah

据我所知,%在使用内联汇编时必须写为%% - 类似于printf()。所以一个正确的程序看起来像这样:

#define c "X"
__asm__ __volatile__("movb $'" c "', %%ah\n");

2)这仅在c为字符串常量时才有效。

如果要使用参数,则必须使用内联汇编程序操作数。如果c是常量,则以下内容将起作用:

__asm__ __volatile__("movb %0, %%ah\n"::"i" (c));

这将生成指令movb $'x', %ah但是这仅在编译器优化打开时才有效,因此编译器知道c在此处具有值'x'

如果c实际上是一个变量(可以更改其值),或者编译器无法确定c是否具有常量值,那么您必须执行以下操作:

__asm__ __volatile__("movb %0, %%ah\n"::"m" (c));

这将产生类似movb 7(%rsp), %ah(或32位代码情况下为movb 3(%esp), %ah)的指令。

在互联网上搜索有关内联汇编的信息,我发现以下页面包含更多信息:

https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html